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

enn*_*net 6 javascript node.js promise

我尝试使用nodemailer和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)
    })
})

}
Run Code Online (Sandbox Code Playgroud)

我的错误:

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: ...
Run Code Online (Sandbox Code Playgroud)

请告诉我如何修复此错误?谢谢!

更新代码

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;
		})
	})
};
Run Code Online (Sandbox Code Playgroud)

我更新了我的代码,但现在我有错误 { [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' }

Sha*_*Roy 2

我猜模板渲染问题,你应该returnfunction (err, responseStatus){}forsuccess

这里我假设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;
    })
})
Run Code Online (Sandbox Code Playgroud)

更新:到目前为止,我猜这不是nodemailer相关问题,可能是template渲染问题。可以按页directory或按html页检查。