2015-09-16 3 views
27

Я создал очень простую функцию на AWS Lambda, которая будет использоваться для приема форм.Отправка электронной почты через AWS SES в функции AWS Lambda

Часть функции будет направлять электронное письмо конкретному человеку, довольно простое. Я пытаюсь использовать AWS SES для этого. Я установил сервис SES и т. Д. И проверил учетную запись, которую я хочу отправить, и смог отправить тестовое письмо. Все работает!

Теперь, когда я пытаюсь сделать то же самое в AWS Lambda и использовать aws sdk, он не отправляет электронное письмо. У меня нет ошибки или чего-то еще.

Ниже приведен код, который я использую для функции AWS Lambda.

У кого-нибудь есть опыт использования лямбда и отправки электронных писем через ses через функцию лямбда? Или даже просто использовать node.js aws sdk было бы более чем вероятно полезным.

var aws = require('aws-sdk'); 
var ses = new aws.SES({ 
    accessKeyId: 'myAccessKey', 
    secretAccesskey: 'mySecretKey', 
    region: 'eu-west-1' 
}); 

exports.handler = function(event, context) { 
    console.log("Incoming: ", event); 
    var output = querystring.parse(event); 

    var eParams = { 
     Destination: { 
      ToAddresses: ["[email protected]"] 
     }, 
     Message: { 
      Body: { 
       Text: { 
        Data: output.Key1 
       } 
      }, 
      Subject: { 
       Data: "Ses Test Email" 
      } 
     }, 
     Source: "[email protected]" 
    }; 

    console.log('===SENDING EMAIL==='); 
    var email = ses.sendEmail(eParams, function(err, data){ 
     if(err) console.log(err); 
     else { 
      console.log("===EMAIL SENT==="); 
      console.log(data); 
     } 
    }); 
    console.log("EMAIL CODE END"); 
    console.log('EMAIL: ', email); 
    context.succeed(event); 
}; 
+2

AccessKey не требуется. Рекомендуемый подход - использовать роли IAM для управления доступом. – swogger

+0

Вы можете сделать это от клиентов? – SuperUberDuper

+0

Не пробовал, но не понимаю, почему нет? – Darren

ответ

14

Похоже, что у меня был context.succeed (event), помещенный в неправильную область кода.

Как только я переместил его в обратный вызов sendEmail, все сработало.

var aws = require('aws-sdk'); 
var ses = new aws.SES({ 
    accessKeyId: 'myAccessKey', 
    secretAccesskey: 'mySecretKey', 
    region: 'eu-west-1' 
}); 

exports.handler = function(event, context) { 
    console.log("Incoming: ", event); 
    var output = querystring.parse(event); 

    var eParams = { 
    Destination: { 
     ToAddresses: ["[email protected]"] 
    }, 
    Message: { 
     Body: { 
      Text: { 
       Data: output.Key1 
      } 
     }, 
     Subject: { 
      Data: "Ses Test Email" 
     } 
    }, 
    Source: "[email protected]" 
}; 

console.log('===SENDING EMAIL==='); 
var email = ses.sendEmail(eParams, function(err, data){ 
    if(err) { 
     console.log(err); 
     context.fail(err); 
    }; 
    else { 
     console.log("===EMAIL SENT==="); 
     console.log("EMAIL CODE END"); 
     console.log('EMAIL: ', email); 
     console.log(data); 
     context.succeed(event); 
    } 
});}; 
+0

Darren> Вы пробовали Java-эквивалент вышеперечисленного? – Jasper

+0

@ Джаспер, к сожалению, я этого не сделал. Вы испытывали ту же проблему? – Darren

+0

Вызов этого работает ... через конечные точки отдыха из программы, запущенной на моем компьютере ..... но если я попробую из какого-то другого домена (сервера) - я вижу 403 (может быть из-за междоменной CORS-вещи). – Jasper

0

Это происходит потому, что Lambda замерзает контейнер при выходе из функции и любые процессы асинхронных замораживаются, например, по электронной почте. Это особенно верно для узла. См. Lambda Programming Model. http://docs.aws.amazon.com/lambda/latest/dg/lambda-introduction.html

Смежные вопросы