簡體   English   中英

AWS Lambda不通過nodemailer觸發電子郵件,但在本地開發環境中觸發

[英]AWS Lambda not firing Email via nodemailer, but does in the local development environment

我正在研究一個aws-lambda,它應該在事件觸發時拍攝郵件。 我使用nodejs為此以及下面是代碼:

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

上面的代碼在開發環境中使用以下代碼進行測試時工作正常,但在aws-lamda上測試時不會觸發郵件。

"use strict";

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

var bankDetailsSchemaSample = {
    "payload": {
        "emailDetails": {
            "from": 'some@something.com',
            "to": ['kunal@something.com'],
            "subject": 'My Amazon SES Simple Email',
            "html": '',
            "cc": ['nimesh.verma@something.com'],
            "bcc": ['lokesh.gour@something.com'],
            "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, {})

我無法找到,為什么會發生這種情況,我也嘗試使用nodemailer-smtp-transport而不是nodemailer-ses-transport,但獲得了相同的結果。 當沒有任何幫助時,我嘗試使用aws-sdk而不是nodemailer和nodemailer-ses-transport,並且通過aws lamda測試在dev環境中觸發郵件。

// 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 = ['nimesh.verma@something.com']

    // this must relate to a verified SES account
    var from = 'some@something.com'


    // 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:');
    });
}

為什么會這樣?

問題是context.succeed方法應該放在_sendSESEmail方法的回調中。

完整的工作代碼出現在: https//github.com/nimeshkverma/aws-lambda-node-mailer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM