首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用nodemailer和电子邮件模板发送消息?

如何使用nodemailer和电子邮件模板发送消息?
EN

Stack Overflow用户
提问于 2016-03-30 14:31:11
回答 2查看 13.5K关注 0票数 9

我试图发送电子邮件与nodemailer和电子邮件模板。现在我有了一个例子,示例电子邮件模板。但是当我检查这段代码时,我出现了错误a promise was rejected with a non-error: [object Undefined]

请帮帮我。这是我的密码

代码语言:javascript
复制
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)
    })
})

}

我的错误:

代码语言:javascript
复制
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: ...

请告诉我如何纠正这个错误?谢谢!

更新代码

代码语言:javascript
复制
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' }

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-30 15:12:45

我猜模板呈现问题,您应该从function (err, responseStatus){} for success中提取一些内容。

这里我假设hello.jadetemplates文件夹中,templates文件夹在root directory中,并确保jade被用作模板引擎。

可以试试看

代码语言:javascript
复制
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页面进行检查。

票数 2
EN

Stack Overflow用户

发布于 2021-04-19 18:22:59

由于以前的贡献,我能够用当前版本的电子邮件电子邮件板来调整Nodemailer。

代码语言:javascript
复制
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});
}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36311951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档