【问题标题】:Sending email from local host with Nodemailer使用 Nodemailer 从本地主机发送电子邮件
【发布时间】:2015-08-28 06:48:57
【问题描述】:

我想在我的本地服务器上发送邮件,但它似乎不适用于 Nodemailer 和 NodeJS。

有没有办法从本地发送邮件?

    var contact = {subject: 'test', message: "test message", email: 'visitor@gmail.com'};
    var to = "myemail@gmail.com";
    var transporter = nodemailer.createTransport();
    transporter.sendMail({
      from: contact.email,
      to: to,
      subject: contact.subject,
      text: contact.message
    });

【问题讨论】:

    标签: node.js nodemailer


    【解决方案1】:
    const transporter = nodemailer.createTransport({
      port: 25, // Postfix uses port 25
      host: 'localhost',
      tls: {
        rejectUnauthorized: false
      },
    });
    
    var message = {
      from: 'noreply@domain.com',
      to: 'whatever@otherdomain.com',
      subject: 'Confirm Email',
      text: 'Please confirm your email',
      html: '<p>Please confirm your email</p>'
    };
    
    transporter.sendMail(message, (error, info) => {
      if (error) {
          return console.log(error);
      }
      console.log('Message sent: %s', info.messageId);
    });
    

    我目前正在通过 express.js 上的一个 restful API 来触发它。这应该可行,我使用this 在 digitalocean 上设置我的后缀。

    【讨论】:

    • 有趣,您不需要身份验证凭据吗?因为是本地主机?
    【解决方案2】:

    除了@cheniel 所说的:确保“发件人”电子邮件与传输器对象中的电子邮件是同一用户电子邮件。并且“收件人”必须是有效的电子邮件并且存在(检查值是否设置正确(不是未定义且非空)。

    【讨论】:

      【解决方案3】:
      var nodemailer = require('nodemailer');
      
      // Create a SMTP transport object
      var transport = nodemailer.createTransport("SMTP", {
          service: 'Hotmail',
          auth: {
              user: "username",
              pass: "password"
          }
      });
      
      // Message object
      var message = {
      
      // sender info
      from: 'name@hotmail.com',
      
      // Comma separated list of recipients
      to: req.query.to,
      
      // Subject of the message
      subject:req.query.subject, //'Nodemailer is unicode friendly ✔', 
      
      // plaintext body
      text: req.query.text //'Hello to myself!',
      
       // HTML body
        /*  html:'<p><b>Hello</b> to myself <img src="cid:note@node"/></p>'+
           '<p>Here\'s a nyan cat for you as an embedded attachment:<br/></p>'*/
      };
      
      console.log('Sending Mail');
      transport.sendMail(message, function(error){
      if(error){
        console.log('Error occured');
        console.log(error.message);
        return;
      }
      console.log('Message sent successfully!');
      
       // if you don't want to use this transport object anymore, uncomment    
       //transport.close(); // close the connection pool
      });
      

      您必须指定类似于 SMTP 的传输协议或创建您自己的传输协议。您尚未在代码中指定此协议。

      【讨论】:

      • OP 询问有关从 localhost 发送电子邮件的问题,但您的回答是演示如何通过 Hotmail 发送电子邮件!
      【解决方案4】:

      在本地主机中它不起作用,因为发送电子邮件需要安全且安全的连接,但使用 gmail[smtp(简单邮件传输协议)] 我们可以实现它的功能。

      不要忘记先进行设置 - Allow less secure apps to access account

      它授予访问 gmail 帐户的权限。

      默认情况下,此设置处于关闭状态,您只需将其打开。现在继续编码部分。

      ****************************-------------------------------- --------------------------------------------------* ********************

      const nodemailer = require('nodemailer');
      
      let transporter = nodemailer.createTransport({
      host: 'smtp.gmail.com',
      port: 587,
      secure: false,
      requireTLS: true,
      auth: {
          user: 'your.gmail.account@gmail.com', // like : abc@gmail.com
          pass: 'your.gmailpassword'           // like : pass@123
      }
      });
      
      let mailOptions = {
       from: 'your.gmail.account@gmail.com',
       to: 'receivers.email@domain.com',
       subject: 'Check Mail',
       text: 'Its working node mailer'
      };
      
      transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
           return console.log(error.message);
        }
      console.log('success');
      }); 
      

      【讨论】:

      • OP 询问有关从 localhost 发送电子邮件的问题,但您的回答是演示如何通过 Gmail 发送电子邮件!
      【解决方案5】:

      从本地服务器运行应该不是问题。

      看起来您正在使用直接传输,文档中将其描述为:

      ...不可靠,因为默认情况下经常阻止使用的传出端口 25。此外,从动态地址发送的邮件通常被标记为垃圾邮件。您真的应该考虑使用 SMTP 提供程序。

      一种解决方案是定义一个 SMTP 传输:

      var transporter = nodemailer.createTransport({
          service: 'gmail',
          auth: {
              user: 'sender@gmail.com',
              pass: 'password'
          }
      });
      

      还有其他解决方案here,例如使用传输插件。

      无论如何,如果您不向 sendMail 函数添加回调,则很难诊断您的问题。发邮件的时候,这样操作,然后可以查看控制台看看可能是什么错误:

      transporter.sendMail({
        from: contact.email,
        to: to,
        subject: contact.subject,
        text: contact.message
      }, function(error, info){
          if(error){
              console.log(error);
          }else{
              console.log('Message sent: ' + info.response);
          }
      });
      

      【讨论】:

      • 它也不起作用..{ [Error: No recipients defined] code: 'EENVELOPE' }
      • 给出了答案,但没有回答所提出的问题。
      猜你喜欢
      • 2016-07-22
      • 2015-05-29
      • 2013-04-16
      • 2014-10-25
      • 2013-10-01
      • 2010-12-19
      相关资源
      最近更新 更多