【问题标题】:How to send message with nodemailer and email-templates?如何使用 nodemailer 和电子邮件模板发送消息?
【发布时间】:2016-07-18 15:22:38
【问题描述】:

我尝试使用 nodemailer 和电子邮件模板发送电子邮件。现在我有来自这里example email templates 的示例。但是当我检查这段代码时,我有错误a promise was rejected with a non-error: [object Undefined]

请帮帮我。这是我的代码

var nodemailer = require('nodemailer');
var EmailTemplate = require('email-templates').EmailTemplate;

exports.sendOne = function () {
var templatesDir = config.templatesDir;
var template = new EmailTemplate(path.join(templatesDir, 'hello.jade'))
var transport = nodemailer.createTransport({
    service: config.service,
    auth: config.auth
});

// An example users object with formatted email function
var locals = {
    email: 'example@mail.com',
    name: {
        first: 'Mamma',
        last: 'Mia'
    }
}

// Send a single email
template.render(locals, function (err, results) {
    if (err) {
        return console.error(err)
    }

    transport.sendMail({
        from: 'Spicy Meatball <spicy.meatball@spaghetti.com>',
        to: locals.email,
        subject: 'Mangia gli spaghetti con polpette!',
        html: results.html,
        text: results.text
    }, function (err, responseStatus) {
        if (err) {
            return console.error(err)
        }
        console.log(responseStatus.message)
    })
})

}

我的错误:

Warning: a promise was rejected with a non-error: [object Undefined]
at /home/project/node_modules/email-templates/lib/util.js:31:39
at FSReqWrap.oncomplete (fs.js:82:15)
From previous event: ...

请告诉我如何解决这个错误?谢谢!

更新代码

exports.sendOne = function () {
  var nodemailer = require("nodemailer");

  var transport = nodemailer.createTransport({
    service: "gmail",
    auth: {
      user: "test@gmail.com",
      pass: "123456",
    },
  });

  var EmailTemplate = require("email-templates").EmailTemplate;
  var path = require("path");

  var templateDir = path.join(__dirname, "templates", "hello");

  var myTemplate = new EmailTemplate(templateDir);

  var locals = {
    email: "example@mail.com",
    name: {
      first: "Mamma",
      last: "Mia",
    },
  };

  myTemplate.render(locals, function (err, result) {
    // result.html
    // result.text
    if (err) {
      return console.error(err);
    }

    transport.sendMail(
      {
        from: "Spicy Meatball <spicy.meatball@spaghetti.com>",
        to: locals.email,
        subject: "Mangia gli spaghetti con polpette!",
        html: results.html,
        text: results.text,
      },
      function (err, responseStatus) {
        if (err) {
          return console.error(err);
        }
        console.log(responseStatus.message);
        return responseStatus; // return from status or as you need;
      }
    );
  });
};

我更新了我的代码,但现在出现错误{ [Error: ENOENT: no such file or directory, stat '/path-to-my-project/templates/hello''] errno: -2, code: 'ENOENT', syscall: 'stat', path: '/path-to-my-project/templates/hello' }

【问题讨论】:

  • 把这个from: 'Spicy Meatball &lt;spicy.meatball@spaghetti.com&gt;',改成from: ' "Spicy Meatball" &lt;spicy.meatball@spaghetti.com&gt;',这里是发件人地址的问题
  • 它不工作。处理程序在 template.render(locals, function (err, results) { 上显示错误
  • hello.jade中删除扩展名.jade,它应该是这样的名称path.join(templatesDir, 'hello') and your templatesDir`值应该以/结尾,否则找不到url问题`
  • var path = require('path') 在路径变量用法上方添加这一行
  • 还是不行,错误Warning: a promise was rejected with a non-error: [object Undefined]

标签: javascript node.js promise


【解决方案1】:

感谢之前的贡献,我已经能够将 Nodemailer 与当前版本的 email-emplates

进行适配

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

//Nodemailer Transporter
const transport = nodemailer.createTransport({
    host: "mail.mydomain.com",
    port: 465,
    secure: true,
    auth: {
        user: "noreply@mydomain.com",
        pass: "841%POHYRYK%",
    },
    tls: {
        rejectUnauthorized: false
    }
});

//Generate template (Example: templates/emails/demo/index.pug)
var template = path.join(__dirname, 'templates/emails', 'demo');
var email = new Email({views: { root: template }});
var locals = {email:'myemail@gmail.com', username:'CompaCode'};

async function(){
    var html = await email.render(template, locals);

    //Send Email
    await transport.sendMail({from: 'Apolobit <noreply@apolobit.com>', to: locals.email, subject:'Demo Subject', html});
}

【讨论】:

    【解决方案2】:

    我猜是模板渲染问题,你应该 return 来自 function (err, responseStatus){} 的东西 success

    这里我假设templates 文件夹中的hello.jaderoot directory 中的templates 文件夹并确保jade 用作模板引擎

    可以试试

    var EmailTemplate = require('email-templates').EmailTemplate;
    var path = require('path');
    
    var templateDir = path.join(__dirname, 'templates', 'hello');
    
    var myTemplate = new EmailTemplate(templateDir);
    var locals = {
          email: 'example@mail.com',
          name: {
               first: 'Mamma',
               last: 'Mia'
          }
     }
    myTemplate .render(locals , function (err, result) {
      // result.html 
      // result.text 
        if (err) {
           return console.error(err)
        }
        // check here what is showing in your result
        transport.sendMail({
            from: 'Spicy Meatball <spicy.meatball@spaghetti.com>',
            to: locals.email,
            subject: 'Mangia gli spaghetti con polpette!',
            html: results.html,
            text: results.text
         }, function (err, responseStatus) {
            if (err) {
                return console.error(err)
            }
            console.log(responseStatus.message)
            return responseStatus;// return from status or as you need;
        })
    })
    

    更新:据我所知,这不是nodemailer 相关问题,它可能是template 渲染问题。可以通过directoryhtml页面查看。

    【讨论】:

    • 不,这没有帮助。错误a promise was rejected with a non-error: [object Undefined]
    • 我更新了我的代码jsfiddle.net/gb7jLjjx/1 但我仍然有错误{ [Error: ENOENT: no such file or directory, stat '/path-to-my-project/templates/hello''] errno: -2, code: 'ENOENT', syscall: 'stat', path: '/path-to-my-project/templates/hello' } @shaishab roy
    • 您是否在path-to-my-project 文件夹和hello.jade 文件夹中添加了templates 文件夹和templates 文件夹中的hello.jade 文件:?
    • 是的,文件夹templates 存在于我的根项目中,它有文件hello.jade
    • 在没有config.templatesDir 的情况下尝试我的流程,例如templateDir var templateDir = path.join(__dirname, 'templates', 'hello');
    猜你喜欢
    • 2018-07-11
    • 2020-11-07
    • 2022-07-27
    • 2018-07-14
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多