【问题标题】:How correctly send email and close smtp connection in nodemailer?如何在 nodemailer 中正确发送电子邮件并关闭 smtp 连接?
【发布时间】:2019-09-24 20:36:31
【问题描述】:

在我的Node.js 应用程序中,我使用nodemailer 库通过SMTP 发送电子邮件。

从代码中可以看出,我有一个名为employees 的数组。该数组有 2000 个电子邮件地址。

当我在应用程序下面使用代码时,只发送 10 封电子邮件,然后引发错误 Error: Invalid greeting. response=421 4.7.0 mailrelay1.***.** Error: too many connections from xxx.xx.xx.xxx

在我看来,每个发送操作都不会关闭通道,即使我明确指定了.close() 方法。

const express = require('express');
const nodemailer = require('nodemailer');
const forAsync = require('for-async');

let transporter = nodemailer.createTransport({
    host: process.env.SMTP_HOST,
    port: parseInt(process.env.SMTP_PORT, 10),
    secure: false,
    tls: {
        rejectUnauthorized: false
    }
});

const router = express.Router();

router.post('/employees', function(request, response) {
    const employees = [***];

    forAsync(employees, (employee) => {
        return new Promise(resolve => {
            // Setup email options.
            const options = {
                from: process.env.EMAIL,
                to: employee,
                subject: "System Alert",
                html: html
            };

            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    transporter.sendMail(options, (error) => {
                        if(error) {
                            console.log(error);
                            reject(error);
                        } else {
                            resolve();
                        }
                   });

                   transporter.close();
                }, 5000);
            }).then(() => {
                resolve();
            }).catch(error => {
                console.log(error);
            });

        });

    });

});

【问题讨论】:

    标签: javascript node.js smtp nodemailer


    【解决方案1】:

    您可能想考虑发送pool of emails

    要做到这一点,请在创建传输时切换 'pool' option

    let transporter = nodemailer.createTransport({
      pool: true,
      host: process.env.SMTP_HOST,
      port: parseInt(process.env.SMTP_PORT, 10),
      secure: false,
      tls: {
        rejectUnauthorized: false
      }
    });
    

    【讨论】:

    • 您好!我添加了您推荐的选项。不幸的是,我看到以下错误:Error: Connection pool was closed。在那个错误之后,我删除了我之前使用的transporter.close();。最后我在 10 封电子邮件后看到这样的错误:Error: Mail command failed: 450 4.7.1 Error: too much mail from xxx.xx.xxx.xxx.
    • 似乎删除transporter.close() 行对于池正常工作是必要的。似乎还有其他与来自单个 IP 的请求速率相关的限制。尝试使用 here 上的其他选项来匹配您面临的限制。
    • 我尝试使用不同的选项。不幸的是,他们都没有帮助我。如果我无法访问的 SMTP 服务器上的限制成本,只有RabbitMQ 可以帮助我发表我的意见。你有什么想法吗?
    猜你喜欢
    • 2021-12-28
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2021-08-06
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多