Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将变量传递到NodeEmailer中的html模板_Javascript_Html_Node.js_Express_Nodemailer - Fatal编程技术网

Javascript 将变量传递到NodeEmailer中的html模板

Javascript 将变量传递到NodeEmailer中的html模板,javascript,html,node.js,express,nodemailer,Javascript,Html,Node.js,Express,Nodemailer,我想发送电子邮件与nodemailer使用html模板。在这个模板中,我需要动态地注入一些变量,但我真的不能这样做。我的代码: var nodemailer = require('nodemailer'); var smtpTransport = require('nodemailer-smtp-transport'); smtpTransport = nodemailer.createTransport(smtpTransport({ host: mailConfig.host,

我想发送电子邮件与nodemailer使用html模板。在这个模板中,我需要动态地注入一些变量,但我真的不能这样做。我的代码:

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

smtpTransport = nodemailer.createTransport(smtpTransport({
    host: mailConfig.host,
    secure: mailConfig.secure,
    port: mailConfig.port,
    auth: {
        user: mailConfig.auth.user,
        pass: mailConfig.auth.pass
    }
}));
var mailOptions = {
    from: 'my@email.com',
    to : 'some@email.com',
    subject : 'test subject',
    html : { path: 'app/public/pages/emailWithPDF.html' }
};
smtpTransport.sendMail(mailOptions, function (error, response) {
    if (error) {
        console.log(error);
        callback(error);
    }
});
比如说,我想在emailWithPDF.html中输入以下内容:

Hello {{username}}!
...
html: '<p>Hello {{username}}</p>'
...
我发现了一些例子,smth在哪里是这样的:

Hello {{username}}!
...
html: '<p>Hello {{username}}</p>'
...
。。。
html:“你好{{{username}

” ...

但我希望它在单独的html文件。可能吗?

如果您使用的是NodeEmailr 2.0.0或更高版本,请查看以下文档: 在这里,他们解释了如何使用模板的外部渲染,如下所示:

// external renderer
var EmailTemplate = require('email-templates').EmailTemplate;
var send = transporter.templateSender(new EmailTemplate('template/directory'));
他们还举了一个例子:

// create template based sender function
// assumes text.{ext} and html.{ext} in template/directory
var sendPwdReminder = transporter.templateSender(new EmailTemplate('template/directory'), {
    from: 'sender@example.com',
});
在这里您可以看到如何传递变量

您需要
电子邮件模板
模块:和您选择的模板引擎

此外,在
电子邮件模板的文档中
您将了解如何创建文件结构,以便找到模板:

html.{ext}}(必需)-用于电子邮件的html格式

text.{{ext}}(可选)-用于电子邮件样式的文本格式

{{ext}}(可选)-html格式主题的样式

{{ext}}(可选)-用于电子邮件主题

请参阅支持的模板引擎,以了解可能用于上面{{ext}值的模板引擎扩展(例如.ejs、.jade、.nunjucks)

您可以在任何文件名前面加上任何您喜欢的前缀,以帮助您在IDE中更容易地识别文件。唯一的要求是文件名包含html、文本、样式和主题。分别


您可以使用节点中的
fs
模块读取HTML文件,然后使用
handlebar
替换HTML字符串中需要更改的元素

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
var handlebars = require('handlebars');
var fs = require('fs');

var readHTMLFile = function(path, callback) {
    fs.readFile(path, {encoding: 'utf-8'}, function (err, html) {
        if (err) {
            throw err;
            callback(err);
        }
        else {
            callback(null, html);
        }
    });
};

smtpTransport = nodemailer.createTransport(smtpTransport({
    host: mailConfig.host,
    secure: mailConfig.secure,
    port: mailConfig.port,
    auth: {
        user: mailConfig.auth.user,
        pass: mailConfig.auth.pass
    }
}));

readHTMLFile(__dirname + 'app/public/pages/emailWithPDF.html', function(err, html) {
    var template = handlebars.compile(html);
    var replacements = {
         username: "John Doe"
    };
    var htmlToSend = template(replacements);
    var mailOptions = {
        from: 'my@email.com',
        to : 'some@email.com',
        subject : 'test subject',
        html : htmlToSend
     };
    smtpTransport.sendMail(mailOptions, function (error, response) {
        if (error) {
            console.log(error);
            callback(error);
        }
    });
});

这可以在没有模板的情况下完成

尝试将其更改为:

`Hello ${username}!`

确保这些不是倒逗号,而是反勾。

您可以使用Web请求使用
把手或任何其他引擎构建html模板

创建模板 首先,您必须为电子邮件正文创建一个html模板。在这个例子中,我使用了一个把手
hbs
文件

使用html进行设计,并在消息中添加所需的变量:

   <!DOCTYPE html>
   <html>
    <head>
        <meta name="viewport" content="width=device-width">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Welcome Email Template</title>
    </head>
    <body>
     <p style="font-size: 14px; font-weight: normal;">Hi {{data.name}}</p>
    </body>
   </html>
邮件功能 最后,您可以在向模板发出请求后发送电子邮件。您可以使用如下函数:

const nodemailer = require('nodemailer')
const request = require("request")

function sendEmail(toEmail, subject, templateFile) {
    var options = {
        uri: `http://localhost:3000/template/email/${templateFile}`,
        method: 'POST',
        json: { name: "Jon Snow" } // All the information that needs to be sent
    };  
    request(options, function (error, response, body) {
        if (error) console.log(error)
        var transporter = nodemailer.createTransport({
            host: mailConfig.host,
            port: mailConfig.port,
            secure: true,
            auth: {
                user: mailConfig.account,
                pass: mailConfig.password
            }
        })
        var mailOptions = {
            from: mailConfig.account,
            to: toEmail,
            subject: subject,
            html: body
        }       
        transporter.sendMail(mailOptions, function(error, info) {
            if (error) console.log(error)
        })
    })
}

适用于使用帕格作为模板引擎的用户

使用pug的render函数在单独的文件中快速渲染模板:

// function to send an e-mail. Assumes you've got nodemailer and pug templating engine installed. 
// transporter object relates to nodemailer, see nodemailer docs for details
const nodemailer = require('nodemailer');
const pug = require('pug');
function send_some_mail(iterable){
var message = {
  from: 'from@example.com',
  to: 'to@example.com',
  subject: 'Message title',
  html: pug.renderFile(__dirname + 'path_to_template.pug', {iterable: iterable})
};
transporter.sendMail(message, function(err, info){...})
}

// template.pug
each item in iterable
li
  p #{item.name}

有关更多详细信息,请参阅。请注意,这将导致每次发送消息时重新编译模板。对于偶尔发送电子邮件来说,这很好。如果您发送了大量电子邮件,您可以缓存已编译的模板来解决这一问题。如果你需要的话,请查看帕格文档以获得该设置

我在所有项目中都使用它。更干净、更新、易懂。地狱不存在。 sendMail.tshtml文件使用handlebar读取,将相关变量放入内容中,然后发送

import*作为nodemailer从'nodemailer'导入;
从“车把”导入*作为车把;
从“fs”导入*作为fs;
从“路径”导入*作为路径;
导出异步函数sendmail(电子邮件:string,主题:string,url:string){
const filePath=path.join(_dirname,'../emails/password reset.html');
const source=fs.readFileSync(文件路径'utf-8').toString();
const template=handlebar.compile(源代码);
常量替换={
用户名:“Umut YEREBAKMAZ”
};
const htmlToSend=模板(替换);
const transporter=nodemailer.createTransport({
主机:“smtp.mailtrap.io”,
端口:2525,//587
安全:错误,
认证:{
用户:“fg7f6g7g67”,
通过:“asds7ds7d6”
}
});
常量邮件选项={
发件人:'”noreply@yourdomain.com" ',
致:电邮:,
主题:主题,,
文本:url,
html:htmlToSend
};
const info=wait transporter.sendMail(邮件选项);
console.log(“发送的消息:%s”,info.messageId);
console.log(“预览URL:%s”https://mailtrap.io/inboxes/test/messages/");
}

Stringreplace不是一个好主意,因为您必须恢复旧字符串或创建备份文件才能在下次更改它们,而且它不是异步的,而且会在各个方面造成问题! 你可以做得更容易,更干净:

只需转到您的邮件选项,并使用变量添加上下文

var mailOptions = {
  from: 'nginx-iwnl@gmail.com',
  to: 'username@gmail.com',
  subject: 'Sending email',
  template: 'yourTemplate',
  context: {                  // <=
    username: username,
    whatever: variable
  }
};
var mailpoptions={
来自:nginx-iwnl@gmail.com',
致:'username@gmail.com',
主题:“发送电子邮件”,
模板:“yourTemplate”,

上下文:{/有一种简单的方法可以在NodeEmailer的html中插入变量

    html:"<p>Your message "+variable1+".Message continueous "+variable 2+"</p>"
html:您的消息“+variable1+”。消息连续“+variable2+”


创建一个文件
emailTemplates.js
您可以将每个模板存储为一个函数

emailTemplates.js

const newsLetterEmail = (clientName) => `<p>Hi ${clientName}, here you have today news.</p>`
const welcomeEmail = (clientName, username) => `<p>Welcome ${clientName}, your username is ${username}.</p>`

export {newsLetterEmail, welcomeEmail}

const新闻稿email=(clientName)=>`Hi${clientName},这里是今日新闻。

` const welcomeEmail=(clientName,username)=>`欢迎${clientName},您的用户名是${username}。

` 导出{时事通讯电子邮件,welcomeEmail}
然后在控制器中调用任何templateFunction并存储在输出变量中

controller.js

import {welcomeEmail} from './emailTeamplates.js'

const registerUser = async(req, res) => {
    const {name, usename, email} = req.body
    // User register code....
    const output = welcomeEmail(name, username)

    let mailOptions = {
        from: '"Welcome" <welcome@welcome.com>',
        to: 'client@gmail.com',
        subject: 'Welcome email!',
        text: 'Hello World',
        html: output,
    }
 
从“/emailTeamplates.js”导入{welcomeEmail}
常量寄存器user=async(请求、res)=>{
const{name,usename,email}=req.body
//用户注册码。。。。
const output=welcomeEmail(名称、用户名)
让邮件选项={
发件人:“‘欢迎’”,
致:'client@gmail.com',
主题:“欢迎电子邮件!”,
文字:“你好,世界”,
html:输出,
}

是否有其他方法可以像我们在处理
文件时那样处理相同的问题。pug
文件,我们只需将对象传递到映射变量这是否支持内联CSS样式?是的,您可以将CSS样式添加到html页面谢谢,@An