如何使用nodemailer和email-templates发送消息?

时间:2016-03-30 14:31:11

标签: javascript node.js promise

我尝试使用nodemailer和email-templates发送电子邮件。现在我有一个例子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' }

2 个答案:

答案 0 :(得分: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});
}

答案 1 :(得分:0)

我想模板呈现问题,您应return来自function (err, responseStatus){}的{​​{1}}

我假设success文件夹中的hello.jadetemplates中的templates文件夹,并确保root directory用作模板引擎

可以试试

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渲染问题。可以通过templatedirectory页面查看。