3

Ich arbeite an einem AWS-Lambda, die Mail schießen soll, wenn ein Ereignis ausgelöst wird. Ich mit NodeJS für diesen und unten ist der Code:AWS Lambda nicht feuern E-Mail via nodemailer, aber tut in der lokalen Entwicklungsumgebung

"use strict"; 


exports.sendEmail = function(event, context, callback) { 
    var config = require('./config'); 
    var fs = require('fs'); 
    var _ = require('lodash'); 

    if (_validSchema(event.payload)) { 
     var templatePath = config.schemaMapping[event.payload.emailDetails.emailType]["templatePath"] 
     var emailHTML = _getHTML(templatePath, event.payload.params) 
     if (emailHTML && templatePath) { 
      _sendSESEmail(_emailParams(event.payload.emailDetails), emailHTML) 
      context.succeed(JSON.stringify(_setResponse(200, [{ 
       code: "11", 
       source: "Email template or Email params in payload", 
       message: "Please provide correct Email template and correct email params", 
       detail: "Template path is provided via config and Params via Payload" 
      }]))); 
     } else 
      context.fail(JSON.stringify(_setResponse(400, [{ 
       code: "01", 
       source: "Email template or Email params in payload", 
       message: "Please provide correct Email template and correct email params", 
       detail: "Template path is provided via config and Params via Payload" 
      }]))); 
    } else { 
     context.fail(JSON.stringify(_setResponse(400, [{ 
      code: "02", 
      source: "Payload schema", 
      message: "Please provide correct schema to validate and a payload validating it", 
      detail: "Payload is provided " 
     }]))); 
    } 


    function _validSchema(payload) { 
     var schemaPath = config.schemaMapping[payload.emailDetails.emailType]["schemaPath"]; 
     var payloadVerification = _verifyPayload(payload, schemaPath); 
     console.log(payloadVerification.valid); 
     return payloadVerification.valid; 
    } 

    function _emailParams(emailDetails) { 
     var details = {}; 
     details.to = _.join(emailDetails.to, ','); 
     details.from = emailDetails.from; 
     details.cc = _.join(emailDetails.cc, ','); 
     details.bcc = _.join(emailDetails.bcc, ','); 
     details.attachments = emailDetails.attachments; 
     details.subject = emailDetails.subject; 
     return details; 
    } 

    function _verifyPayload(payload, schemaPath) { 
     var schema = JSON.parse(fs.readFileSync(schemaPath, 'utf8')); 
     var Validator = require('jsonschema').Validator; 
     var verifier = new Validator(); 
     console.log(verifier.validate(payload, schema)) 
     return verifier.validate(payload, schema); 
    } 

    function _setResponse(status_code, error_list) { 
     return { 
      status: status_code, 
      errors: error_list 
     }; 
    } 

    function _sendSESEmail(email, emailHTML) { 
     var nodemailer = require('nodemailer'); 
     var sesTransport = require('nodemailer-ses-transport'); 
     var transporter = nodemailer.createTransport(sesTransport({ 
      accessKeyId: config.SES.accessKeyId, 
      secretAccessKey: config.SES.secretAccessKey 
     })); 
     transporter.sendMail({ 
      from: email.from, 
      to: email.to, 
      cc: email.cc, 
      bcc: email.bcc, 
      attachments: email.attachments, 
      subject: email.subject, 
      html: emailHTML 
     }); 
    } 

    function _getHTML(templateFile, params) { 
     var ejs = require('ejs'); 
     console.log({ params: params }) 
     var baseHTML = fs.readFileSync(templateFile, 'ascii'); 
     return ejs.render(baseHTML, { params: params }); 
    } 
} 

Above Code funktioniert gut, wenn in der Entwickler-Umgebung mit dem folgenden Code getestet, aber nicht über eine E-Mail ausgelöst, wenn auf aws-Lamda getestet.

"use strict"; 

var exports = require('./exports'); 

var bankDetailsSchemaSample = { 
    "payload": { 
     "emailDetails": { 
      "from": '[email protected]', 
      "to": ['[email protected]'], 
      "subject": 'My Amazon SES Simple Email', 
      "html": '', 
      "cc": ['[email protected]'], 
      "bcc": ['[email protected]'], 
      "emailType": 'bankDetails', 
      "attachments": [{ 
       "filename": 'test.md', 
       "path": 'https://raw.github.com/nodemailer/nodemailer/master/LICENSE' 
      }] 
     }, 
     "params": { 
      "orderId": 1234567, 
      "firstName": "Nimesh", 
     } 
    } 
} 

var context = { 
    fail: function(x) { console.log(" Fail " + x) }, 
    succeed: function(x) { console.log(" Success " + x) } 
} 

exports.sendEmail(bankDetailsSchemaSample, context, {}) 

Ich kann nicht herausfinden, warum dies geschieht, versuchte ich es auch nodemailer-smtp-Transport statt nodemailer-ses-Verkehr aber die gleichen Ergebnisse erhalten werden. Wenn nichts half, habe ich aws-sdk anstelle von nodemailer und nodemailer-ses-transport versucht und die Mail wird sowohl in der Dev-Umgebung als auch über aws lamda testing abgefeuert.

// load aws sdk 
exports.sendEmail = function(event, context, callback) { 
    var aws = require('aws-sdk'); 

    // load aws config 
    aws.config.loadFromPath('config.json'); 

    // load AWS SES 
    var ses = new aws.SES({ apiVersion: '2010-12-01' }); 

    // send to list 
    var to = ['[email protected]'] 

    // this must relate to a verified SES account 
    var from = '[email protected]' 


    // this sends the email 
    // @todo - add HTML version 
    ses.sendEmail({ 
     Source: from, 
     Destination: { ToAddresses: to }, 
     Message: { 
      Subject: { 
       Data: 'A Message To You Rudy' 
      }, 
      Body: { 
       Text: { 
        Data: 'Stop your messing around', 
       } 
      } 
     } 
    }, function(err, data) { 
     if (err) throw err 
     console.log('Email sent:'); 
    }); 
} 

Warum passiert das?

+0

Was Sie in den Protokollen zu sehen, wenn Sie das Lambda in der AWS-Konsole ausführen? –

+0

@ AlexisN-o Die Protokolle erfasst, die Ausgabe von console.log im Skript und sonst ist sauber. – nimeshkiranverma

Antwort