【问题标题】:Sending Templated emails with node.js, node mailer and nodemailer-mailgun-transport使用 node.js、node mailer 和 nodemailer-mailgun-transport 发送模板化电子邮件
【发布时间】:2015-10-10 14:00:45
【问题描述】:

我有以下基本的 nodejs 应用程序:

var nodemailer = require('nodemailer');
var hbs = require('nodemailer-express-handlebars');
var options = {
 viewEngine: {
     extname: '.hbs',
     layoutsDir: 'views/email/',
     defaultLayout : 'template',
     partialsDir : 'views/partials/'
 },
 viewPath: 'views/email/',
 extName: '.hbs'
};

var mg = require('nodemailer-mailgun-transport');

var auth = {
    auth: {
        api_key: ' mailgun api key ',
        domain: ' mailgun email domain '
    }
}

var mailer = nodemailer.createTransport(mg(auth));

mailer.use('compile', hbs(options));
mailer.sendMail({
 from: 'test@inventori.io',
 to: 'test@test.com',
 subject: 'Any Subject',
 template: 'email.body',
 context: {
      variable1 : 'value1',
      variable2 : 'value2'
 }
}, function (error, response) {
    // console.error(error);
    if (error) {
        throw error;
    };
 console.log('mail sent to ',response);
 mailer.close();
});

views/email/template.hbs

{{>email/head}}
<body>
     {{>email/header}}
     {{{body}}}
     {{>email/footer}}
</body>
</html>

views/email/email.body.hbs

<h4>Main Body Here</h4>
{{variable1}} <br/>
{{variable2}}

views/partials/email/header.hbs

<h4>Header Content</h4>

views/partials/email/footer.hbs

<h4>Footer Content</h4>

handlebars 模板引擎给出零错误,但 mailgun 传输抛出以下错误:

Error: Sorry: template parameter is not supported yet. Check back soon!
    at IncomingMessage.<anonymous> (~/test/node_modules/nodemailer-mailgun-transport/node_modules/mailgun-js/lib/request.js:228:15)
at IncomingMessage.emit (events.js:129:20)
at _stream_readable.js:908:16
at process._tickCallback (node.js:355:11)  

此示例使用 gmail 节点邮件传输:

http://excellencenodejsblog.com/express-nodemailer-sending-mails/

我希望能够使用 mailgun 发送模板电子邮件。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: express handlebars.js mailgun nodemailer transport


    【解决方案1】:

    对我来说,模板无法正确呈现,因为我在使用 extName 的示例中进行操作,而键实际上是 extname(全部小写)。也许它被重命名为超时,我正在看的指南现在有点过时了。

    下面的完整工作示例截至 2020 年 5 月 30 日。

    目录结构:

    root/
       src/
          email-templates/
                  layouts/
                         blank.hbs
                  partials/
                  hello.hbs
          services/
                  email.service.ts
    

    email.service.ts(尚未更新此以使用正确的类型。只是一个 poc。)

    export async function sendTestEmail() {
      try {
        // Generate test SMTP service account from ethereal.email
        // Only needed if you don't have a real mail account for testing
        const testAccount = await nodemailer.createTestAccount()
    
        // create reusable transporter object using the default SMTP transport
        const transporter = nodemailer.createTransport({
          host: 'smtp.ethereal.email',
          port: 587,
          secure: false, // true for 465, false for other ports
          auth: {
            user: testAccount.user, // generated ethereal user
            pass: testAccount.pass, // generated ethereal password
          },
        })
    
        transporter.use('compile', hbs({
          viewEngine: {
            extname: '.hbs', // handlebars extension
            partialsDir: 'src/email-templates',
            layoutsDir: 'src/email-templates/layouts',
            defaultLayout: 'blank',
          },
          viewPath: 'src/email-templates',
          extName: '.hbs'
        }))
    
        // send mail with defined transport object
        const mailOptions = {
          from: 'test@gmail.com', // sender address
          to: 'test@gmail.com', // list of receivers
          subject: 'Hello ✔', // Subject line
          text: 'Hello world?', // plain text body
          template: 'hello',
          context: {
            firstName: 'Clem'
          }
        }
        const info = await transporter.sendMail(mailOptions)
    
        console.log('Message sent: %s', info.messageId)
        // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
    
        // Preview only available when sending through an Ethereal account
        console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info))
        // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
      } catch (error) {
        console.log(error)
      }
    }
    

    【讨论】:

    • 我有完全相同的代码,当我使用text 而不是template 时发送电子邮件,但使用template 我在Mailgun "description": "Failed to render template", 上收到以下错误
    • 你救了我!哥们,我很感谢你的这篇文章。 viewEngine 对象中的 extName 是它对我不起作用的原因。
    【解决方案2】:

    将您的 template 参数更改为 html

    如果您查看source code here,错误是正确的——没有template 参数之类的东西。

    【讨论】:

    猜你喜欢
    • 2020-11-17
    • 2018-07-11
    • 2018-09-05
    • 2015-01-13
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2016-07-18
    相关资源
    最近更新 更多