繁体   English   中英

如何使用Node.js从用户帐户发送电子邮件?

[英]How can I send emails from a user's account using Node.js?

我正在使用保存联系人的程序。 我想添加一个新功能,使您可以通过电子邮件帐户向联系人发送电子邮件。 我尝试使用nodemailer进行此操作,从用户需要填写的表单中获取登录数据。

但是nodemailer给我发送了一个错误,看起来是这样的:

Error: Invalid login: 535-5.7.8 Username and Password not accepted.

我尝试使用applcation密码并激活了不太安全的选项,但错误仍然存​​在。 看我的代码:

在这里,我使用用户的电子邮件和密码:

router.post('/email', isLoggedIn, async (req, res) => {
    var { email } = req.body;
    var { password } = req.body;

    var parts = email.substring(email.lastIndexOf('@')+ 1);



    exports.email = email;
    exports.password = password;

    res.redirect('/links/message')



});

我在这里留言:

router.post('/sendmessage', isLoggedIn, async (req, res) => {

    const { message } = req.body;
    const { assumpt } = req.body;
    exports.message = message;
    exports.assumpt = assumpt;
    res.redirect('/links/contactsemail')


});

最后,我将选择您需要发送电子邮件的类别联系人,并发送用户给我的带有消息和数据登录名的电子邮件:

router.post('/contactsend', isLoggedIn, async (req, ress) => {
    const { contacts } = req.body;
    const row = await pool.query('SELECT count(email) AS email FROM links WHERE user_id=? AND category=? AND email IS NOT NULL',[req.user.id, contacts]);
    const rows = row[0].email;
    const assumpt = myModule.assumpt;
    const message = myModule.message;
    const email = myModule.email;
    const password = myModule.password
    var parts = email.substring(email.lastIndexOf('@')+ 1);
    const hosts = 'smtp.' + parts;
    var transporter = nodemailer.createTransport({
        host: hosts,
        port: 587,
        auth: {
            user: email,
            pass: password
        }
    });


   for (i = 1; i <= rows; i++ ){
    var email1 = await pool.query('SELECT email AS email FROM (SELECT  email, ROW_NUMBER() OVER (ORDER BY email) AS rn FROM links WHERE user_id= ? AND category=?) q WHERE  rn = ?', [req.user.id, contacts, i]);
    var email1 = email1[0].email;
    var mailOptions = {
        from: email,
        to: email1,
        subject: assumpt,
        text: message

    };



        transporter.sendMail(mailOptions, function (error, info) {
            if (error) {
                console.log(error);

            } else {
                console.log('Email sent: ' + info.response);
                res.flash('success', 'Missatge enviat correctament');
                res.redirect('/links');
            }
        });


    };


});

我的问题是:

我该如何解决错误?

我可以通过不同的方式来做到这一点,因为它更容易,更好?

我是否正确理解了这一点,是否希望您的用户输入其私人/外部电子邮件提供商的凭据,以便可以使用该提供商发送电子邮件?

在这种情况下,由于所需配置的细节在很大程度上取决于电子邮件提供商,因此无法通用回答您的问题。 例如,在您的代码中:

    var parts = email.substring(email.lastIndexOf('@')+ 1);
    const hosts = 'smtp.' + parts;
    var transporter = nodemailer.createTransport({
        host: hosts,
        port: 587,
        auth: {
            user: email,
            pass: password
        }
    });

该块已经有一些硬编码的假设,即john.doe@example.net的smtp主机是smtp.example.org ,该电子邮件的用户名也是john.doe@example.net ,两者- -对于许多电子邮件提供商来说不一定是这种情况。

因此,即使这对您有用,也很可能不适用于所有用户

相反,您应该使用单个smtp网关/中继,您的应用程序可以将电子邮件转发到该网关。 然后,您也将不需要用户自己的凭据,但可以将您的应用程序的登录凭据用于该smtp网关。

但是,是否允许您使用任意发件人地址发送邮件,取决于smtp网关的配置。 而且即使您的网关可能允许这样做,由于可能不允许您的网关发送用户域的电子邮件,由于垃圾邮件过滤器,邮件也可能被阻止,请参阅SPF

因此,除使用专用的smtp网关外,我建议您使用自己拥有和控制的电子邮件地址/域进行发送。 您仍然可以增加直接来自用户的邮件,例如通过适当设置显示名称和Reply-To标头

From: "John Doe" <myapp@example.com>
To: jane.doe@example.org
Reply-To: "John Doe" <john.doe@example.org>
Subject: "A message from John Doe via MyApp"

对于此邮件,收件人将获得显示为发件人的发送用户名(但应用程序的电子邮件而非用户的名字),并且在单击“答复”按钮时,默认情况下(取决于电子邮件客户端),答复将发送回用户,即本例中的john.doe@example.org

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM