在我的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);
});
});
});
});
您可能需要考虑发送电子邮件池。
为此,请在创建传输时切换"池"选项:
let transporter = nodemailer.createTransport({
pool: true,
host: process.env.SMTP_HOST,
port: parseInt(process.env.SMTP_PORT, 10),
secure: false,
tls: {
rejectUnauthorized: false
}
});