我正在使用 nodemailer 在 node js 中进行用户电子邮件验证,我的代码如下。
// Create new User
const createUser = async function (req, res) {
// Check if this user already exisits.
let user = await User.findOne({ email: req.body.email });
if (user) {
return res.status(400).send('That user already exists!');
} else {
// Insert the new user if they do not exist yet.
user = new User({
name: req.body.name,
email: req.body.email,
password: req.body.password
});
// Hash the password before saving into database.
const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(user.password, salt);
await user.save();
// Generating the token for user verification
const token = new Token({ userId: user._id, token: crypto.randomBytes(16).toString('hex') });
await token.save();
// Send varification email
const link = `${process.env.BASE_URL}/users/confirm/${token.token}`;
await sendEmail(user.email, "Email Verification\n", link);
console.log(token)
res.status(200).send({
message: "Email Verification link sent to your email",
});
}
};
// Verify Email address Api
const confirmationPost = function (req, res, next) {
// Find a matching token
Token.findOne({ token: req.params.token }, function (err, token) {
if (!token) return res.status(400).send({
type: 'not-verified',
msg: `We were unable to find a valid token.Your token my have expired.`
});
// If we found a token, find a matching user
User.findOne({ _id: token.userId }, function (err, user) {
if (!user) return res.status(400).send({ msg: 'We were unable to find a user for this token.' });
if (user.isVerified) return res.status(400).send({
type: 'already-verified',
msg: 'This user has already been verified.'
});
// Verify and save the user
user.isVerified = true;
user.save(function (err) {
if (err) { return res.status(500).send({ msg: err.message }); }
res.status(200).send("The account has been verified. Please login.");
});
});
});
};
// 路线
router.post('/api/users/create', createUser);
router.get('/api/users/confirm/:token', confirmationPost);
// 这是发送邮件文件
const nodemailer = require('nodemailer');
const sendEmail = async (email, subject, link) => {
try {
const transporter = nodemailer.createTransport({
host: "smtp.mailtrap.io",
port: 2525,
auth: {
user: process.env.USER,
pass: process.env.PASS,
},`enter code here`
});
await transporter.sendMail({
from: '[email protected]',
to: email,
subject: subject,
text: 'Hello,\n Welcome. Please click on the link to verify your account.\n' +link,
html: '<a href="${link}">Verify Email.</a>'
});
} catch (error) {
return error;
}
};
module.exports = sendEmail;
此代码有效,我在邮件陷阱登录时收到一封电子邮件,但当我单击验证电子邮件时,它不起作用。我收到的电子邮件。
你好, 欢迎。请单击链接以验证您的帐户。 http://localhost:5000/api/users/confirm/10da46424f275844cad3a2635e05546d
在电子邮件的文本版本中,我得到了正确的链接,但是当我点击验证链接时,它说不存在 URL。我认为该行可能存在语法问题,有人可以指导我吗?
html:'验证电子邮件。'
我认为这不是 nodemailer 的问题,而是您的 URL 路由有问题,您使用电子邮件发送的 URL 是
/api/users/confirm/:token
,而在您的应用程序中您正在处理与 url 不匹配的/confirm/:token
,因此你会得到 URL not found.
只需将您的路线更新为
/api/users/confirm/:token
或/users/confirm/:token
(根据您的配置)。
当你添加它的作品
return res.redirect("http://localhost:5000")
到确认功能结束。