2017-10-06 60 views
0

我发送个性化的电子邮件通知我的用户Meteor.methods():流星电子邮件:连接未关闭

Orders._collection.rawCollection() 
     .distinct('user', { day: dayId }) 
     .then((result) => { 
     let mailList = [] 
     User.find({ _id : { $in : result } }).forEach((user) => { 
      mailList.push({ to: user.emails[0].address, room: user.profile.room }); 
     }); 
     console.log('setting mail queue...') 
     mailList.forEach((user, index) => { 
      let delay = 0; 
      let time = delay + (index*200); 
      console.log('queue set for user '+user.to+" for "+ time/1000 +' seconds') 
      Meteor.setTimeout(() => { 
      console.log('sending mail to: ' + user.to); 
      Email.send({ 
       to: 'user.to', 
       from: "[email protected]", 
       subject: "test ", 
       html: template, 
      }); 
      }, time) 
     }) 
     }); 

这个例子发送的所有邮件,但如果有超过10条信息,然后EXIM返回错误在一个SMTP连接中有超过10封电子邮件,并且邮件在30分钟后移动到队列以发送。即使在每封邮件之后2.5分钟的延迟也会发生。

邮件发送后有什么办法可以关闭与服务器的smtp连接吗? 邮件网址是:smtp://localhost:25

+0

你试过mailgun?流星的电子邮件包适合一次性使用和有限的使用,但Mailgun可能会更适合您的使用情况。 –

+0

无法真正使用外部服务通过内部网发送数据:( – jmwierzbicki

+0

您是否在运行此Meteor代码的同一台机器上安装了EXIM? – Styx

回答

2

Email包基于node4mailer(小修改为nodemailer以在节点4上运行它)。

默认情况下,Email sets pool=true用于传输选项。这意味着 它将重新使用打开的连接,直到发送的邮件数量达到其限制,而nodemailerdefault pool options have maxMessages=100

因此,通过修改MAIL_URL,你有2种方式来解决问题:

  1. 10maxMessagesnodemailer运输:

    smtp://localhost:25/?maxMessages=10

  2. 禁用池(将导致nodemailer为每封电子邮件打开一个新连接):

    smtp://localhost:25/?pool=false

有用的链接nodemailer文档:Pooled SMTP

+0

完美答案! – jmwierzbicki