【问题标题】:Nodemailer and Amazon SESNodemailer 和 Amazon SES
【发布时间】:2014-06-01 17:04:26
【问题描述】:

我的结构:

site
-- node_modules
---- nodemailer
-- webclient
---- js
------- controller.js

site/node_modules/nodemailer
site/webclient/js/controller.js

site/webclient/js/controller.js:

    var nodemailer = require('../../node_modules/nodemailer');

    var transport = nodemailer.createTransport('SES', {
        AWSAccessKeyID: 'xxx', // real one in code
        AWSSecretKey: 'xxx', // real one in code
        ServiceUrl: 'email-smtp.us-west-2.amazonaws.com'
    });

    var message = {
        from: 'example@mail.com', // verified in Amazon AWS SES
        to: 'example@mail.com', // verified in Amazon AWS SES
        subject: 'testing',
        text: 'hello',
        html: '<p><b>hello</b></p>' +
              'test'
    };

    transport.sendMail(message, function(error) {
        if (error) {
            console.log(error);
        } else {
            console.log('Message sent: ' + response.message);
        }
    });

此代码是控制器的一部分,其中的所有其他功能都可以完美运行。

  • 我有什么遗漏吗?
  • 也许我调用了不正确的 nodemailer 模块?
  • 或者传输应该是 SMTP,而不是 SES?

我被困住了。

【问题讨论】:

  • 您可以考虑描述实际问题。您是否收到错误消息等。
  • 实际问题是它不发送电子邮件。没有错误信息。我应该在哪里看到它?控制台不返回任何内容。
  • 您确定将正确的参数传递给transport.sendMail() 函数吗?你只传入一个函数,但通常你传入一个处理成功的函数和一个处理错误的单独函数。当然,我对 nodemailer 并不熟悉,因为它没有成功路径的回调,这似乎有点奇怪。
  • 请在下方标记为正确答案

标签: javascript amazon-ses nodemailer


【解决方案1】:

请直接使用 aws-sdk。它对我有用。希望对你有帮助。`

let nodemailer = require('nodemailer');
let AWS = require('aws-sdk');

// configure AWS SDK
AWS.config.update({
  accessKeyId: << SES_ACCESS_KEY >>,
  secretAccessKey: << SES_SECRET_KEY >>,
  region: << SES_REGION >>,
});

// create Nodemailer SES transporter
let transporter = nodemailer.createTransport({
SES: new AWS.SES({
  apiVersion: '2010-12-01'
})
});

// send some mail
transporter.sendMail({
  from: 'sender@example.com',
  to: 'recipient@example.com',
  subject: 'Message',
  text: 'I hope this message gets sent!'
}, (err, info) => {
  console.log(info.envelope);
  console.log(info.messageId);
});

【讨论】:

    【解决方案2】:

    下面的代码是我使用的,它对我有用。这适用于当前的 NodeMailer。需要单独包含传输模块的地方。在以前的版本中,传输模块是内置的。

    var nodemailer = require('nodemailer');
    var sesTransport = require('nodemailer-ses-transport');
    
    var SESCREDENTIALS = {
      accessKeyId: "accesskey",
      secretAccessKey: "secretkey"
    };
    
    var transporter = nodemailer.createTransport(sesTransport({
      accessKeyId: SESCREDENTIALS.accessKeyId,
      secretAccessKey: SESCREDENTIALS.secretAccessKey,
      rateLimit: 5
    }));
    
    var mailOptions = {
      from: 'FromName <registeredMail@xxx.com>',
      to: 'registeredMail@xyz.com', // list of receivers
      subject: 'Amazon SES Template TesT', // Subject line
      html: < p > Mail message < /p> / / html body
    };
    
    // send mail with defined transport object
    transporter.sendMail(mailOptions, function(error, info) {
      if (error) {
        console.log(error);
      } else {
        console.log('Message sent: ' + info);
      }
    });
    

    更新

    自从我上次写这个答案以来,nodemailer 库已经更新。他们的文档中提供了将库与 A​​WS SES 一起使用的正确方法。 working example的链接

    进一步阅读

    【讨论】:

      【解决方案3】:

      我在控制器中使用此代码,它非常适合我。它正在使用来自 AWS SES 的 SMTP 身份验证。

      var nodemailer = require('nodemailer');
      var dotenv = require('dotenv').config();
      
      var mailOptions = {
        from: 'example@email.com',
        to: 'other@email.com',
        text: 'This is some text',
        html: '<b>This is some HTML</b>',
      };
      
      // Send e-mail using SMTP
      mailOptions.subject = 'Nodemailer SMTP transporter';
      var smtpTransporter = nodemailer.createTransport({
        port: 465,
        host: process.env.AWS_REGION,
        secure: true,
        auth: {
          user: process.env.AWS_ACCESS_KEY_ID,
          pass: process.env.AWS_SECRET_ACCESS_KEY,
        },
        debug: true
      });
      
      smtpTransporter.sendMail(mailOptions, (error, info) => {
        if (error) {
          console.log(error);
          res.status(error.responseCode).send(error.response);
        } else {
          console.log('Message sent: ' + info.response);
          res.status(200).send(info);
        }
      });
      

      【讨论】:

      • 您可以在此存储库中查看完整示例github.com/gustavdz/nodemailer-AWS-ses-smtp
      • 你能解释一下这个代码转储是如何解决 OP 的问题的吗?
      • @CertainPerformance 此代码使用 SMTP 方式使用 AWS 凭证发送电子邮件,是另一种发送电子邮件的方式,创建 SMTP 传输器并以这种方式发送。
      【解决方案4】:

      以下 nodemailer 传输配置对我有用。这不需要 AWS 开发工具包。

      const nodeMailerTransporter = require('nodemailer').createTransport({
          host: '<aws.smpt.host>',
          port: 465,
          auth: {
              user: '<aws_smtp_user>',
              pass: '<aws_smtp_pass>'
          }
      });
      

      从哪里获取配置:

      &lt;aws.smpt.host&gt; 可以在 AWS SES 控制台的 SMTP 设置页面的 Server Name 值中找到。

      &lt;aws_smtp_user&gt;&lt;aws_smtp_pass&gt; 是通过 AWS SES 控制台的 SMTP 设置页面中的 Create My SMTP Credentials 按钮创建 SMTP 凭证获得的。

      【讨论】:

        【解决方案5】:

        你可以这样做:

        let nodemailer = require('nodemailer');
        const aws = require('aws-sdk');
        
        export default async function mail({ toAdress, subject, text, html = null }) {
          let transporter = nodemailer.createTransport({
            // Credentials for user with SES access in AWS.
            SES: new aws.SES({
              accessKeyId: process.env.AWS_SES_ACCESS_KEY_ID,
              secretAccessKey: process.env.AWS_SES_SECRET_ACCESS_KEY,
            }),
          });
          try {
            await transporter.sendMail({
              from: 'your@email.com',
              to: toAdress,
              subject: subject,
              html: html,
            });
          } catch (error) {
            if (error.response) {
              console.error(error.response.body);
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-04
          • 2014-06-23
          • 2011-08-23
          • 2014-09-12
          • 1970-01-01
          • 1970-01-01
          • 2013-10-13
          相关资源
          最近更新 更多