2016-07-14 5 views
2

Я делаю простую вещь, но это не работает.node.js отправка почты с задержкой

Что я хочу сделать, это отправить почту с задержкой в ​​30 секунд.

Вот код:

user.forEach(function(data) { 


    var locals = { 
     fname: data.Name, 
     your_name: data.From, 

    } 

    template.render(locals, function(err, results) { 

     if (err) { 
      return console.error(err) 
     } else { 
      transporter.sendMail({ 

       to: data.Email, 
       subject: "Welcome", 
       replyTo: data.ReplyTo, 
       html: results.html, 
       text: results.text, 
      }, function(error, info) { 
       console.log("here"); 
       if (error) { 
        console.log(error); 
       } else { 
        console.log('Message sent: ' + info.response); 
       }; 

      }); 
     } 

    }); 
}); 

Здесь пользователь массив объектов с деталями, как электронная почта, от, имя и т.д.

Каждый объект в массиве содержит информацию о конкретной почты для отправки.

Я хочу отправить почту и подождать 30 секунд, а затем отправить второй ... и ждать и так далее.

Я использовал setInterval, а также npm sleep, но это не работает. Он ждет 30 секунд, а затем отправляет все письма сразу.

ответ

1

Вы должны заменить syncronous forEach с асинхронной реализацией.
Вариант1. Использовать async.js eachLimit и вызвать обратный вызов с задержкой в ​​30 секунд
Option2. Вы можете написать обертку для отправки функции электронной почты, как:

var emails = ['email1', 'email2' /*...*/]; 
function sendEmailAndWait(email, callback){ 
    // your stuff 
    transporter.sendMail(email, function(error, info) { 
     // handle results 
     if(!emails.length) return callback(); 
     setTimeout(function() { 
      sendEmailAndWait(emails.shift(), callback); 
     }, 30*1000) 
    }) 
} 
sendEmailAndWait(emails.shift(), function(){ /* allDone */}); 
+0

Recurrsive функций не выполняется, если предел стека вызовов достигается. Представьте себе 5000 писем в очереди. –

0
setTimeout(function() { 
    template.render(locals, function(err, results) { 

    if (err) { 
     return console.error(err) 
    } else { 
     transporter.sendMail({ 

      to: data.Email, 
      subject: "Welcome", 
      replyTo: data.ReplyTo, 
      html: results.html, 
      text: results.text, 
     }, function(error, info) { 
      console.log("here"); 
      if (error) { 
       console.log(error); 
      } else { 
       console.log('Message sent: ' + info.response); 
      }; 
     }); 
    } 
}); 
}, 3000);