首页 > 解决方案 > Nodemailer:从未收到问候

问题描述

当尝试使用 Nodemailer ( https://github.com/nodemailer/nodemailer )在 Node 中发送电子邮件时,与 Ethereal 测试电子邮件帐户结合使用时sendMail,对 Nodemailer 传输器的调用会引发错误。Greeting never received

我尝试过使用“回调方法”和“异步/等待”方法,但在这两种情况下都会引发相同的错误。这两个示例都非常直接来自 Nodemailer 文档中的工作示例。也许我错过了一些简单的东西?:)

这是产生错误的“回调方法”代码:

it('can send email with a dynamic test account', done => {
    nodemailer.createTestAccount((err, account) => {
        const transporter = nodemailer.createTransport({
            host: 'smtp.ethereal.email',
            port: 587,
            auth: {
                user: account.user, // generated ethereal user
                pass: account.pass // generated ethereal password
            }
        });

        const mailOptions = {
            from: '"Fred Foo " <foo@example.com>', // sender address
            to: 'bar@example.com, baz@example.com', // list of receivers
            subject: 'Hello ✔', // Subject line
            text: 'Hello world?', // plain text body
            html: '<b>Hello world?</b>' // html body
        };

        // send mail with defined transport object
        transporter.sendMail(mailOptions, (error, info) => {
            if (error) {
                return console.log(error);
            }
            console.log('Message sent: %s', info.messageId);
            console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
            // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
            // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...

            done();
        });
    });
}).timeout(10000);

这是错误的堆栈跟踪:

{ Error: Greeting never received
    at SMTPConnection._formatError (/Users/<username>/projects/personal/learning-tests/javascript/nodemailer/node_modules/nodemailer/lib/smtp-connection/index.js:606:19)
    at SMTPConnection._onError (/Users/<username>/projects/personal/learning-tests/javascript/nodemailer/node_modules/nodemailer/lib/smtp-connection/index.js:579:20)
    at Timeout._greetingTimeout.setTimeout (/Users/<username>/projects/personal/learning-tests/javascript/nodemailer/node_modules/nodemailer/lib/smtp-connection/index.js:520:22)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5) code: 'ETIMEDOUT', command: 'CONN' }

还有一些附加信息:

标签: javascriptnode.jsemailnpm

解决方案


在我的情况下,我需要将secure密钥设置truetransporter对象,然后它才能工作。

let transporter = nodemailer.createTransport({
        host: "mail.hostname.com",
        port: 465,
        secure: true, // true for 465, false for other ports
        auth: {
            user: 'user@hostname.com', // generated ethereal user
            pass: 'password', // generated ethereal password
        }
    });

推荐阅读