具有电子邮件模板的Nodemailer不发送电子邮件

时间:2020-01-03 10:48:55

标签: javascript node.js nodemailer

我正在使用带有npm软件包电子邮件模板的nodemailer。我没有收到电子邮件。当我设置Preview:true时,模板正在工作。在控制台上出现错误错误:未定义收件人。为什么会出现此错误?尝试了很多事情,但是nodemailer每次都发送空的电子邮件。希望你理解我的问题。

错误:

Error: No recipients defined
    at SMTPConnection._formatError (E:\testing\node_modules\nodemailer\lib\smtp-connection\index.js:784:19)
    at SMTPConnection._setEnvelope (E:\testing\node_modules\nodemailer\lib\smtp-connection\index.js:995:34)
    at SMTPConnection.send (E:\testing\node_modules\nodemailer\lib\smtp-connection\index.js:615:14)
    at sendMessage (E:\testing\node_modules\nodemailer\lib\smtp-transport\index.js:227:28)
    at E:\testing\node_modules\nodemailer\lib\smtp-transport\index.js:285:25
    at SMTPConnection._actionAUTHComplete (E:\testing\node_modules\nodemailer\lib\smtp-connection\index.js:1537:9)
    at SMTPConnection.<anonymous> (E:\testing\node_modules\nodemailer\lib\smtp-connection\index.js:550:26)
    at SMTPConnection._processResponse (E:\testing\node_modules\nodemailer\lib\smtp-connection\index.js:942:20)
    at SMTPConnection._onData (E:\testing\node_modules\nodemailer\lib\smtp-connection\index.js:749:14)
    at TLSSocket.SMTPConnection._onSocketData (E:\testing\node_modules\nodemailer\lib\smtp-connection\index.js:195:44)
    at TLSSocket.emit (events.js:210:5)
    at addChunk (_stream_readable.js:309:12)
    at readableAddChunk (_stream_readable.js:290:11)
    at TLSSocket.Readable.push (_stream_readable.js:224:10)
    at TLSWrap.onStreamRead (internal/stream_base_commons.js:182:23) {
  code: 'EENVELOPE',
  command: 'API'
}

我的目录结构:


├── app.js
└── emails
    └── forget-password
        ├── html.pug
        ├── subject.pug

带有模板的节点邮件:

const nodemailer = require('nodemailer');
var generator = require('generate-password');

const Email = require('email-templates');

exports.sendNodeForgotPasswordMail = function (email, GeneratePassword) {
    var transporter = nodemailer.createTransport({
        host: 'smtp.gmail.com',
        port: 587,
        secure: false,
        auth: {
            user: 'my_email',
            pass: 'my_password'
        },
        tls: {
            rejectUnauthorized: false
        }

    });

    const emailVar = new Email({
        message: {
            from: 'testing@gmail.com'
        },
        preview: true,
        send: true,
        transport: {
            jsonTransport: true
        }
    });

    emailVar.send({
        template: 'forget-password',
        message: {
            to: email
        },
        locals: {
            password: GeneratePassword
        }
    }) .then(res => {
        console.log('res.originalMessage', res.originalMessage)
    }).catch(console.error);


    return transporter.sendMail(emailVar, function (err, info) {
        if (err)
            console.log(err);
        else
            console.log(info);
    });
};

Html.pug:

p Your new password is: #{password}

subject.pug

= `Password reset request`

2 个答案:

答案 0 :(得分:1)

原因是您不需要使用nodemailer,而无需使用nodemailer来构造您的运输工具,因此您需要像这样通过JSON进行传递。

exports.sendNodeForgotPasswordMail = function (email, GeneratePassword) {
    var transporter = nodemailer.createTransport({
        host: 'smtp.gmail.com',
        port: 587,
        secure: false,
        auth: {
            user: 'my_email',
            pass: 'my_password'
        },
        tls: {
            rejectUnauthorized: false
        }

    });

成为:

transport: {
        host: 'smtp.gmail.com',
        port: 587,
        secure: false,
        auth: {
            user: 'my_email',
            pass: 'my_password'
        },
        tls: {
            rejectUnauthorized: false
        }

    }

const Email = require('email-templates'); <-这就足够了。

答案 1 :(得分:1)

如果其他人正在寻找解决方案,我将根据@Irving Caarmal答案使其工作,并且代码如下:

function sendTokenEmail(userEmail, token, templateName) {
  const email = new Email({
    message: {
      from: 'someemail@gmail.com',
    },
    preview: true,
    send: true,
    transport: {
      host: process.env.MAIL_HOST,
      port: process.env.MAIL_PORT,
      auth: {
        user: process.env.MAIL_USER,
        pass: process.env.MAIL_PASS,
      },
    },
  })

  return email
    .send({
      template: templateName,
      message: {
        to: userEmail,
      },
      locals: {
        token,
      },
    })
    .then((res) => {
      console.log('res.originalMessage', res.originalMessage)
    })
   }