用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.render
callback的电子邮件之前使用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>