使用nodemailer验证用户邮箱

问题描述 投票:0回答:2

我正在使用 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:'验证电子邮件。'

javascript node.js nodemailer
2个回答
0
投票

我认为这不是 nodemailer 的问题,而是您的 URL 路由有问题,您使用电子邮件发送的 URL 是

/api/users/confirm/:token
,而在您的应用程序中您正在处理与 url 不匹配的
/confirm/:token
,因此你会得到 URL not found.

只需将您的路线更新为

/api/users/confirm/:token
/users/confirm/:token
(根据您的配置)。


0
投票

当你添加它的作品

return res.redirect("http://localhost:5000")

到确认功能结束。

© www.soinside.com 2019 - 2024. All rights reserved.