【问题标题】:Nodemailer: Greeting never receivedNodemailer:从未收到问候
【发布时间】:2018-11-02 18:22:26
【问题描述】:

当尝试使用 Nodemailer (https://github.com/nodemailer/nodemailer) 在 Node 中发送电子邮件时,在与 Ethereal 测试电子邮件帐户结合使用时,对 Nodemailer 传输器的 sendMail 的调用会引发错误 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' }

还有一些附加信息:

  • 节点版本:8.11.2
  • nodemailer 版本:4.6.4
  • 操作系统:OSX version 10.12.6

【问题讨论】:

    标签: javascript node.js email npm


    【解决方案1】:

    在我的情况下,/etc/postfix/main.cf 中的 smtpd_recipient_restrictions 导致了这个问题。

    改成:

    smtpd_recipient_restrictions =
       permit_mynetworks,
       permit_sasl_authenticated,
       reject_unauth_destination,
       check_policy_service unix:private/policyd-spf
    

    现在它可以工作了!

    【讨论】:

      【解决方案2】:

      在我的例子中,我需要在 transporter 对象上将 secure 键设置为 true,然后它就起作用了。

      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
              }
          });
      

      【讨论】:

        【解决方案3】:

        就我而言,当我将端口 586 更改为 587 时,它就可以工作了。

        【讨论】:

          【解决方案4】:

          检查您的互联网连接可能已关闭。 下面是带有打字稿的Etheral Email 的示例

          import * as nodemailer from "nodemailer";
          
          export const sendEmail = async (recipient: string, url: string, linkText: string) => {
            nodemailer.createTestAccount((err, account) => {
              if (err) {
                console.log(err);
              }
              const transporter = nodemailer.createTransport({
                host: account.smtp.host,
                port: account.smtp.port,
                secure: account.smtp.secure,
                auth: {
                  user: account.user,
                  pass: account.pass
                }
              });
          
              const message = {
                from: "Sender Name <sender@example.com>",
                to: `Recipient <${recipient}>`,
                subject: "Nodemailer is unicode friendly ✔",
                text: "Hello to myself!",
                html: `
                  <html>
                  <body>
                  <p>Testing sparkpost API</p>
                  <a href="${url}">${linkText}</a>
                  </body>
                  </html>`
              };
          
              transporter.sendMail(message, (err, info) => {
                if (err) {
                  console.log("Error occurred. " + err.message);
                }
          
                console.log("Message sent: %s", info.messageId);
                // Preview only available when sending through an Ethereal account
                console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
              });
            });
          };
          

          【讨论】:

            【解决方案5】:
            const transporter = nodemailer.createTransport({
              service: config.mail.service,
              port: 8000,
              auth: {
                user: config.mail.username,
                pass: config.mail.password
              }
            });
            
            module.exports = {
            
              activationsMail: function (req, data) {
                // setup email data with unicode symbols
                const link = 'http://' + req.headers.host + '/user/activate/' + data.verifyCode;
                console.log('CODE :', data.verifyCode);
                const mailOptions = {
                  from: '"Ecommerce" <noreply@ecommerce.com>', // sender address
                  to: req.body.email, // list of receivers
                  subject: 'Please confirm your Email account', // Subject line
                  html: '\n\n' + 'Please Click here to verify <a href=' + link + '> Click here</a>'
                };
                //console.log('PORT', req.headers.host);
            
                // send mail with defined transport object
                transporter.sendMail(mailOptions, function (error, info) {
                  if (error) {
                    console.log('Email Error', error);
                  } else {
                    // callback(true);
                    console.log('Email sent: ' + info.response);
                  }
                })
              };
            

            【讨论】:

            • 这是一个纯代码的答案,这在 StackOverflow 中不被认为是好的做法。请详细说明并解释这段代码的作用以及它如何帮助解决原始问题。
            • 使用此代码我们可以发送邮件。在 HTML 正文的帮助下,我们将编写邮件正文。
            • 嗨@HirenGevariya。您的上述评论不是对您的代码的解释。如果您可以添加解释,您的答案会更有帮助。
            【解决方案6】:
            const transporter = nodemailer.createTransport({
              service: 'config.mail.service',
              port: 8000,
              auth: {
                user: 'config.mail.username',
                pass: 'config.mail.password'
              }
            });
            
            module.exports = {
            
              activationsMail: function (req) {
                // setup email data with unicode symbols
                const mailOptions = {
                  from: '"Ecommerce" <noreply@ecommerce.com>', // sender address
                  to: req.body.email, // list of receivers
                  subject: 'Ecommerce Account Activate', // Subject line
                  html: '<div>Please <a href="' + req.headers.host + 'user/activate/' + req.code + '" target="__new">click here</a> to active your account.</div>' // html body
                };
                console.log('PORT', req.headers.host);
            
                // send mail with defined transport object
                transporter.sendMail(mailOptions, function (error, info) {
                  if (error) {
                    console.log('Email Error', error);
                  } else {
                    console.log('Email sent: ' + info.response);
                  }
                })
              }
            };
            

            【讨论】:

            • 这是一个纯代码的答案,这在 StackOverflow 中不被认为是好的做法。请edit详细说明。解释这段代码的作用以及它如何帮助解决最初的问题。
            猜你喜欢
            • 1970-01-01
            • 2019-06-02
            • 1970-01-01
            • 2015-09-16
            • 1970-01-01
            • 2016-12-16
            • 2021-05-07
            • 1970-01-01
            • 2020-05-21
            相关资源
            最近更新 更多