用ejs和节点创builddynamichtml

我试图发送dynamic邮件到使用表单提交的电子邮件ID。
以下是我的app.js代码。

//Importing Packages var express = require('express'); var nodemailer = require('nodemailer'); var bodyParser = require('body-parser'); //Applying Express,Ejs to Node app = express(); app.set('view engine', 'ejs'); app.use(bodyParser.urlencoded({extended:true})); //Creating Nodemailer Transport var transporter = nodemailer.createTransport({ host: 'smtp.zoho.com', port: 465, secure: true, auth: { user: 'noreply@*****.com', pass: '******' } }); //Root Route Setup app.get('/', function(req, res){ res.render("landing") }); //Route to send the mail app.post('/send', function(req,res){ //Setting up Email settings var mailOptions = { from: 'noreply@*****.com', to : req.body.mail, subject: 'Verify Your Email', generateTextFromHtml : true, html: { path: './tmpl.html'} }; //Execute this to send the mail transporter.sendMail(mailOptions, function(error, response){ if(error) { console.log(error); } else { console.log(response); } }); res.send("Mail succesfully sent!") }); //Server &Port Settings app.listen(3333, function(){ console.log("Server is running...") }); 

下面是我的表单页面代码,这是一个ejs文件

 <form action="/send" method="POST"> <input type="email" name="mail" placeholder="Enter your email"> <input type="text" name="name" placeholder="Enter your name"> <input type="submit"> </form> 

下面是我的HTML模板,被邮寄到使用表格提交的ID。

 <html> <body> <h1>Hello World!</h1> <a href="http://www.google/com">Link</a> </body> </html> 

如何从表单中读取姓名,然后将其包含在电子邮件中,以便在每封电子邮件中,我都可以使用variables(例如“{{姓名} {}}”

我无法弄清楚如何传递variables到HTML文件没有电子邮件封锁,因为我不能够使用脚本标签内的HTML文件使用JavaScript因为几乎所有的邮件提供商块电子邮件JS!

有人可以帮我解决这个问题吗?

您可以使用已经用express设置的ejs模板引擎。 调用app.render()会将您指定的模板呈现为string,并将其传递给其callbackapp.render()以及传递给它的任何数据。 所以它与callback有点丑陋,但这是一个解决scheme,不添加任何依赖。

简而言之,使您的电子邮件模板成为一个名为verifyEmail.ejs的ejs文件,使用app.render()在发送来自app.rendercallback的电子邮件之前使用POST请求主体中的数据来呈现它。


 // app.js app.post('/send', function(req,res){ // Use the ejs rendering engine to render your email // Pass in the 'name' variable that is used in the template file app.render('verifyEmail', {name: req.body.name}, function(err, html){ if (err) { console.log('error rendering email template:', err) return } else { //Setting up Email settings var mailOptions = { from: 'noreply@*****.com', to : req.body.mail, subject: 'Verify Your Email', generateTextFromHtml : true, // pass the rendered html string in as your html html: html }; //Execute this to send the mail transporter.sendMail(mailOptions, function(error, response){ if(error) { console.log(error); res.send('Mail Error! Try again') } else { console.log(response); res.send("Mail succesfully sent!") } }); } }); }); 

我添加了一些error handling,并通知用户电子邮件是否由于服务器错误而未发送。 你以前调用res.send()的方式会告诉用户电子邮件在发送之前已经成功发送。


把你的模板文件夹放在与你的“登陆”模板相同的目录下,或者你的ejs文件所在的位置。

通过调用<%= %>标记之间的variables将数据插入到模板中。 在渲染模板时通过传递相同名称的variables来填充它。

从ejs 文档 :

… <%=%>标签内的所有内容都会插入到返回的HTMLstring中。

 // views/verifyEmail.ejs <html> <body> <h1>Hello <%= name %></h1> <a href="http://www.google/com">Link</a> </body> </html>