SES:在lambda函数中访问电子邮件正文

我对AWS比较陌生,我试图通过Lambda函数处理我的电子邮件。 我已经在node.js中构build了这个:

'use strict'; exports.handler = (event, context, callback) => { var http = require('http'); var data = JSON.stringify(event); 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)); }); }); req.write(data); req.end(); }; 

我已经用端点进行了testing,并且工作正常,问题是我刚才意识到消息的主体永远不会被发送。 我怎样才能访问消息的正文发送并由我的API进行处理?

如果您需要查看发送给我的样本,请告诉我。

所以我所做的就是将收到的电子邮件存储在S3存储桶中,而不是通知我的api新邮件已经到达(发送文件名)。 最后从S3读取,parsing,存储并从S3中删除,在我的api里面。

SES规则: SES规则

Lambda通知function:

请注意,由第一个规则创build的S3文件的名称与消息ID相同,因此'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(); }; 

Api函数(PHP – Laravel):

请注意,我正在使用基于Plancake Email Parser的电子邮件parsing器(链接在这里 )以及我自己的一些更改,如果需要,我将编辑以显示源代码。

 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]); } 

我有一个非常类似的解决scheme,但只有一个步骤。 可以设置lambda触发器。 于是,我创build了一个桶myemailbucket ,并将邮件从SES发送到该桶。 然后我把我的lambda函数的触发器更改为s3中桶myemailbucket中的任何创build事件。