Я столкнулся с кирпичной стеной здесь. Я пытался адаптировать этот код из учебника, который я нашел в Интернете. Большинство из них работает, однако, кажется, не хочет отправлять электронную почту. Код должен помочь пользователю сбросить свой пароль, используя Mon goose для поиска в базе данных, затем, как только он найдет человека по электронной почте, он вернет пользователя, одновременно создав токен и сохранив его в БД. После того, как все сказано и сделано, он должен отправить ссылку пользователю, только он не отправит ссылку. Я не уверен, что синтаксис просто устарел или у меня просто что-то не так. Я посмотрел на сайте Nodemailer и заметил, что некоторые форматирования изменились, а также в Ethereal Email, который, кажется, имеет тот же формат. Предположим, что *** правильные адреса электронной почты и пароли. Кроме того, переменная user.email была закомментирована, чтобы я мог жестко закодировать письмо в целях тестирования.
Спасибо.
var mongoose = require('mongoose'),
jwt = require('jsonwebtoken'),
bcrypt = require('bcrypt'),
User = mongoose.model('User'),
path = require('path'),
async = require('async'),
crypto = require('crypto'),
_ = require('lodash'),
hbs = require('nodemailer-express-handlebars'),
email = process.env.MAILER_EMAIL_ID || '***-*@ethereal.email',
pass = process.env.MAILER_PASSWORD || 'SOMEPASS',
nodemailer = require('nodemailer');
var smtpTransport = nodemailer.createTransport({
service: process.env.MAILER_SERVICE_PROVIDER || 'smtp.ethereal.email',
port: 587,
auth: {
user: email,
pass: pass
},
tls:{
rejectUnauthorized:false,
}
});
var handlebarsOptions = {
viewEngine: {
extName: '.html',
partialsDir: './api/templates/',
layoutsDir: './api/templates/',
defaultLayout: 'email.html',
},//'handlebars',
viewPath: path.resolve('./api/templates/'),
extName: '.html'
};
exports.forgot_password = function(req, res) {
async.waterfall([
function(done) {
User.findOne({
email: req.body.email
}).exec(function(err, user) {
if (user) {
done(err, user);
} else {
done('User not found.');
}
});
},
function(user, done) {
// create the random token
crypto.randomBytes(20, function(err, buffer) {
var token = buffer.toString('hex');
done(err, user, token);
});
},
function(user, token, done) {
User.findByIdAndUpdate({ _id: user._id }, { reset_password_token: token, reset_password_expires: Date.now() + 86400000 }, { upsert: true, new: true }).exec(function(err, new_user) {
done(err, token, new_user);
});
},
function(token, user, done) {
var data = {
from: email,
to: '************', //user.email,
template: 'forgot-password-email',
subject: 'Password help has arrived!',
context: {
url: 'http://localhost:3000/auth/reset_password?token=' + token,
name: user.name //.split(' ')[0]
}
};
console.log(data)
smtpTransport.sendMail(data, function(err) {
if (!err) {
return res.json({ message: 'Kindly check your email for further instructions' });
} else {
return done(err);
}
});
}
], function(err) {
return res.status(422).json({ message: err });
});
};