在expressjs中与Nodemailer错误?

我正在使用Nodemailer来设置忘记的密码function。 出于某种原因,我的代码被挂在smtpTrans.sendMail部分。 我正确设置了Nodemailer吗?

更新:看看下面的完整代码,包括async.waterfall代码

app.post('/forgot', function(req, res, next) { async.waterfall([ function(done) { crypto.randomBytes(20, function(err, buf) { var token = buf.toString('hex'); done(err, token); }); }, function(token, done) { User.findOne({ email: req.body.email }, function(err, user) { if (!user) { console.log('error', 'No account with that email address exists.'); return res.redirect('/forgot'); } console.log('step 1') user.resetPasswordToken = token; user.resetPasswordExpires = Date.now() + 3600000; // 1 hour user.save(function(err) { done(err, token, user); }); }); }, function(token, user, done) { console.log('step 2') var smtpTrans = nodemailer.createTransport({ service: 'Hotmail', auth: { user: 'myemailinfo@email.com', pass: '**********' } }); var mailOptions = { to: user.email, from: 'myemailinfo@email.com', subject: 'Node.js Password Reset', text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' + 'Please click on the following link, or paste this into your browser to complete the process:\n\n' + 'http://' + req.headers.host + '/reset/' + token + '\n\n' + 'If you did not request this, please ignore this email and your password will remain unchanged.\n' }; console.log('step 3') smtpTrans.sendMail(mailOptions, function(err) { console.log(err) req.flash('info', 'An e-mail has been sent to ' + user.email + ' with further instructions.'); done(err, 'done'); }); } ], function(err) { if (err) return next(err); console.log(err) res.redirect('/forgot'); }); }); app.get('/forgot', function(req, res) { res.render('forgot', { user: req.user }); }); 

nodemailer 文档指出提供给sendMailcallback需要第二个参数info 。 所以你可以尝试这样的事情:

 smtpTrans.sendMail(mailOptions, function(err, info) { if (err) { console.log(err) } if (info) { console.log(info.response) } req.flash('info', 'An e-mail has been sent to ' + user.email + ' with further instructions.'); done(err, 'done'); }); 

如果调用callback函数, info.response可能会填充SMTP邮件程序的一些响应,以指示它为什么没有按预期工作。

如果callback从未被调用,则可能是该服务没有响应,并且该调用没有超时。 您还可以在SMTP选项中提供自定义超时值

最后一个注意事项:Hotmail通过SMTP有每天100条消息的限制,所以你应该考虑使用不同的提供商。