तो मैंने जो किया वह एक एस 3 बाल्टी में प्राप्त ईमेल को संग्रहीत कर रहा था, मेरे एपीआई को सूचित करते हुए कि एक नया ईमेल आ गया है (फ़ाइल नाम भेज रहा है)। अंततः एस 3 से पढ़ा, मेरे एपीआई के अंदर, एस 3 से पार्स, संग्रहीत और हटा दिया गया।
एसईएस नियम:
लैम्ब्डा सूचित समारोह:
ध्यान दें कि पहला नियम के द्वारा बनाई गई S3 फ़ाइल का नाम, 'fileName': event.Records[0].ses.mail.messageId
संदेशों आईडी रूप में ही है इसलिए ।
'use strict';
exports.handler = (event, context, callback) => {
var http = require('http');
var data = JSON.stringify({
'fileName': event.Records[0].ses.mail.messageId,
});
var options = {
host: 'my.host',
port: '80',
path: '/my/path',
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Content-Length': data.length
}
};
var req = http.request(options, function(res) {
var msg = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
msg += chunk;
});
res.on('end', function() {
console.log(JSON.parse(msg));
context.succeed();
});
});
req.write(data);
req.end();
};
एपीआई समारोह (पीएचपी - Laravel):
ध्यान दें कि मैं एक ईमेल पार्सर कि Plancake ईमेल पार्सर पर आधारित है उपयोग कर रहा हूँ (लिंक here) मेरे अपने में से कुछ परिवर्तन के साथ और यदि आवश्यक हो तो मैं स्रोत दिखाने के लिए संपादित करूंगा।
public function process_incoming_email(Request $request)
{
$current_time = Carbon::now()->setTimezone('Brazil/East'); // ALL TIMEZONES: http://us.php.net/manual/en/timezones.others.php
try
{
if ($request->has('fileName')
{
$file_name = $request->input('fileName');
// GET CREDENTIALS AND AUTHENTICATE
$credentials = CredentialProvider::env();
$s3 = new S3Client([
'version' => 'latest',
'region' => 'my-region',
'credentials' => $credentials
]);
// FECTH S3 OBJECT
$object = $s3->GetObject(['Bucket' => 'my-bucket', 'Key' => $file_name]);
$body = $object['Body']->getContents();
// PARSE S3 OBJECT
$parser = new EmailParser($body);
$receivers = ['to' => $parser->getTo(), 'cc' => $parser->getCc()];
$from = $parser->getFrom();
$body_plain = $parser->getPlainBody();
$body_html = $parser->getHTMLBody();
$subject = $parser->getSubject();
$error_message;
// PROCESS EACH RECEIVER
foreach ($receivers as $type => $type_receivers)
{
foreach ($type_receivers as $receiver)
{
// PROCESS DOMAIN-MATCHING RECEIVERS
if(preg_match("/@(.*)/", $receiver['email'], $matches) && $matches[1] == self::HOST)
{
// INSERT NEW EMAIL
$inserted = DB::table('my-emails')->insert([
// ...
]);
}
}
}
// ADD ERROR LOG IF PARSER COULD NOT FIND EMAILS
if($email_count == 0)
{
DB::table('my-logs')->insert(
['sender' => $request->ip(), 'type' => 'error', 'content' => ($error_message = 'Could not parse received email or find a suitable user receiving email.') . ' File: ' . $file_name]
);
}
// DELETE OBJECT FROM S3 IF INSERTED
else if(count($emails) == $email_count)
{
$s3->deleteObject(['Bucket' => 'my-bucket', 'Key' => $file_name]);
// RETURN SUCCESSFUL JSON RESPONSE
return Response::json(['success' => true, 'receivedAt' => $current_time, 'message' => 'Email successfully received and processed.']);
}
// ADD ERROR LOG IF NOT INSERTED
else
{
DB::table('my-logs')->insert(
['sender' => $request->ip(), 'type' => 'error', 'content' => ($error_message = 'Inserted ' . count($emails) . ' out of ' . $email_count . ' parsed records.') . ' File: ' . $file_name]
);
}
}
else
{
// ERROR: NO fileName FIELD IN RESPONSE
DB::table('my-logs')->insert(
['sender' => $request->ip(), 'type' => 'error', 'content' => ($error_message = 'Incorrect request input format.') . ' Input: ' . json_encode($request->all())]
);
}
}
// ERROR TREATMENT
catch(Exception $ex)
{
DB::table('my-logs')->insert(
['sender' => $request->ip(), 'type' => 'error', 'content' => ($error_message = 'An exception occurred while processing an incoming email.') . ' Details: ' . $ex->getMessage()]
);
}
// RETURN FAILURE JSON RESPONSE
return Response::json(['success' => false, 'receivedAt' => $current_time, 'message' => $error_message]);
}
निम्नलिखित के लिए धन्यवाद। एक ही मुद्दे में भागो। थोड़ा मूर्खतापूर्ण लगता है (अक्षम नहीं है) कि हमें संदेश निकाय के लिए इतने सारे लूपों से कूदना है। क्या यह अभी भी वही समाधान है जिसका आप आज उपयोग कर रहे हैं? – DaveJ
@DaveJ दुर्भाग्यवश हां:/ –
@ मैथियस सिमॉन - मैं अपने आप को लार्वेल 5.4 के साथ चलने के लिए बहुत कुछ प्राप्त करने की कोशिश कर रहा हूं, मैं सभी आने वाले ईमेल स्वीकार करने के लिए एसईएस का उपयोग कर रहा हूं और वर्तमान में उन्हें एस 3 में संग्रहीत किया जा रहा है, मेरा मूल विचार उन्हें पार्स करना था लैम्ब्डा पर एक जावास्क्रिप्ट फ़ंक्शन के साथ और फिर उन्हें डीबी में स्टोर करने के लिए लार्वेल पर भेज दें और एप्लिकेशन में प्रदर्शित करें, क्या मैं एसईएस स्टोर्स को एस 3 ऑब्जेक्ट लाने के द्वारा उपयोग किए गए ईमेल पार्सर के साथ लैम्ब्डा से पूरी तरह से बच सकता हूं? किसी भी मदद की सराहना करते हैं, धन्यवाद। – Birdy