Nodemailer and Amazon SES

20

我的结构:

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

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

站点/网络客户端/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?

我陷入了困境。


您可以考虑描述实际问题是什么。您是否收到错误消息等。 - Sunil D.
实际问题是它没有发送电子邮件。没有错误信息。我应该在哪里看到它?控制台没有返回任何内容。 - O P
你确定你正在向 transport.sendMail() 函数传递正确的参数吗?你只传递了一个函数,但通常你需要传递一个处理成功的函数和一个处理错误的函数。尽管我不熟悉 nodemailer,但它似乎没有为成功路径提供回调函数有点奇怪。 - Sunil D.
请在下面标记为正确答案 - Toolkit
6个回答

20

请直接使用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);
});

我不理解这个答案。aws-sdk是必须要安装成单独的包还是已经内置在nodemailer中了?AWS.config是什么,它们具体是做什么的?apiVersion是什么,我从哪里可以获取到它?我只有SMTP凭据。 - Anas

15

以下是我使用并成功运行的代码。这适用于当前的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库已经更新。正确使用该库与AWS SES的方法在他们的文档中提供。 一个可工作示例的链接

更多阅读


9

我在控制器中使用了这段代码,它对我非常有效。它使用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);
  }
});

您可以在此存储库中查看完整示例 https://github.com/gustavdz/nodemailer-AWS-ses-smtp - Gustavo Decker
你能解释一下这段代码是如何解决提问者的问题的吗? - CertainPerformance
@CertainPerformance 这段代码使用SMTP方式使用AWS凭据发送电子邮件,还有一种方法是创建SMTP传输器并以此方式发送电子邮件。 - Gustavo Decker
谢谢,这对我起作用。 简短说明:在生产环境中,“secure:true”无法在本地主机上使用。 - Tobi

3

以下nodemailer传输配置适用于我。这不需要AWS SDK。

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

获取配置信息的位置:

<aws.smpt.host> 可以在 AWS SES 控制台的 SMTP 设置页面中的 服务器名称 值中找到。

<aws_smtp_user><aws_smtp_pass> 是通过在 AWS SES 控制台的 SMTP 设置页面上使用 创建我的 SMTP 凭据 按钮来创建 SMTP 凭据获得的。


0
使用新的Firebase v9版本,我使用了以下代码并且它运行正常:
exports.sendEmail = functions.https.onRequest(async (req, res) => {
  const params = {
    Destination: {
      ToAddresses: ['recipient@example.com'], // Add recipient email addresses
    },
    Message: {
      Body: {
        Text: {
          Data: 'Hello, this is the email content!', // Add your email content here
        },
      },
      Subject: {
        Data: 'Firebase Cloud Function Email', // Add your email subject here
      },
    },
    Source: 'sender@example.com', // Add the sender email address
  };

  try {
    await ses.sendEmail(params).promise();
    res.status(200).send('Email sent successfully');
  } catch (error) {
    console.error('Error sending email:', error);
    res.status(500).send('Error sending email');
  }
});

点击这里查看完整教程


-1
你可以这样做:
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);
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接