【问题标题】:Sending concurrent emails with Nodemailer in Node.js在 Node.js 中使用 Nodemailer 发送并发电子邮件
【发布时间】:2021-08-23 10:04:21
【问题描述】:

当有人在我的网站上填写表格时,我正在尝试发送验证电子邮件,而我正在使用 nodemailer 实现此目的。

我的 node.js 代码如下所示:

const express = require('express');
const app=express();

app.use(express.json());

app.post('/',(req,res)=>{

  var nodemailer = require('nodemailer');

  var transporter = nodemailer.createTransport({
  host: "smtp-mail.outlook.com", 
  secureConnection: false, 
  port: 587,
  tls: {
     ciphers:'SSLv3',
     rejectUnauthorized: false
  },
  auth: {
      user: 'generic-email@outlook.com',
      pass: 'generic-password'
  }
  });
  
  var mailOptions = {
  from: 'generic-email@outlook.com',
  to: req.body.email_name, 
  subject: 'testing <No-Reply Email>', 
  text: 'testing', 
  html: `<div>testing</div>`
  };

   transporter.sendMail(mailOptions, await function(error, info){
   if(error)
   {
     console.log(error);
     return res.json({stat:'not good'});
   }
    console.log('Message sent: ' + info.response);
    return res.json({stat:'all good'});
  });
});


app.listen(3000,()=>{
    console.log('Listening at Port 3000...');
 });
 

虽然它工作正常,但我怀疑如果多个人发出相同的请求,那么它会给出response: '421 concurrent connection limit in Avast exceeded(pass:0, processes:node.exe[46])' ERROR。

当我尝试循环遍历代码并向自己发送 300 封电子邮件以测试每日电子邮件限制的限制时遇到此错误

网站上线时如何避免此错误?

到目前为止,我想出了两种可能的解释:

  1. 我可以循环代码,以便不断尝试发送电子邮件,直到它有机会

  2. 我将不得不使用 Outlook 以外的其他服务

在这种情况下我该怎么办?我是否采取了正确的方法?我应该使用其他一些电子邮件 API 服务吗?我对所有这些 SMTP 东西都很陌生。

【问题讨论】:

标签: javascript node.js smtp


【解决方案1】:

我认为问题是您正在为每个请求创建一个新连接,只需这样做

const express = require('express');
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
  host: "smtp-mail.outlook.com", 
  secureConnection: false, 
  port: 587,
  tls: {
     ciphers:'SSLv3',
     rejectUnauthorized: false
  },
  auth: {
      user: 'generic-email@outlook.com',
      pass: 'generic-password'
  }
});

const app=express();

app.use(express.json());

app.post('/',(req,res)=>{
  var mailOptions = {
    from: 'generic-email@outlook.com',
    to: req.body.email_name, 
    subject: 'testing <No-Reply Email>', 
    text: 'testing', 
    html: `<div>testing</div>`
  };

  transporter.sendMail(mailOptions, await function(error, info){
    if(error) {
      console.log(error);
      return res.json({stat:'not good'});
    }
    console.log('Message sent: ' + info.response);
    return res.json({stat:'all good'});
  });
});

【讨论】:

  • 就像一个魅力,但它可以容纳多个请求吗?比如如果多人开始使用该网站,每个请求会同时发送还是会排队并一次发送一个?
  • 同时发送
  • outlook 电子邮件可以处理多少个并发连接?如果一次连接太多,我该如何处理?
  • 不确定它可以处理多少,但如果连接太多,只需将pool: true,maxConnections: someNumber 添加到createTransport 配置
  • “如果使用池化,那么 Nodemailer 会保持固定数量的连接打开,并在连接可用时发送下一条消息。” nodemailer.com/smtp/pooled
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2015-05-19
  • 2019-11-05
  • 2020-11-17
相关资源
最近更新 更多