2017-05-08 69 views
2

我正在尝试向使用表单提交的电子邮件ID发送动态邮件。
以下是我的app.js代码。使用ejs和节点创建动态html

//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: '[email protected]*****.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: '[email protected]*****.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> 

以下是被邮寄到我的ID HTML模板使用的形式提交。

<html> 
<body> 

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

</body> 
</html> 

我如何读取表单名称,然后包括在电子邮件,让每封电子邮件,我可以用一个变量地址给那个人,像“你好先生{{名}}”

我无法弄清楚如何将变量传递给html文件而没有电子邮件拦截它,因为我无法在HTML文件中使用脚本标签使用Javascript,因为几乎所有的邮件提供程序都会阻止电子邮件中的JS!

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

+0

你需要做的是首先生成HTML,然后将其包含在电子邮件对象。 – yBrodsky

+0

我该怎么做?我需要哪些工具?我很抱歉提出愚蠢的问题,我是JS和Node的初学者。 :S –

+1

我使用这个:https://github.com/crocodilejs/node-email-templates#basic – yBrodsky

回答

2

您可以使用您已经使用express设置的ejs模板引擎。调用app.render()会将您指定的模板渲染为字符串,并将其传递给其回调函数,以及传递给它的任何数据。所以它对于回调有点难看,但这是一个不增加任何依赖的解决方案。

总之,让你的邮件模板命名verifyEmail.ejs一个EJS文件, 使用app.render()app.render回调发送电子邮件之前从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: '[email protected]*****.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!") 
      } 
     }); 
     } 
    }); 
}); 

我添加了一些错误处理,并通知用户,如果电子邮件不是由于发送到服务器错误。您之前拨打res.send()的方式会告诉用户电子邮件在发送前已成功发送。


放入相同的目录中“落地”模板,或任何其他地方你EJS文件是你的模板文件夹。

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

从EJS docs

...里面<%=%>标签的一切插入到自己返回的HTML 字符串。

// views/verifyEmail.ejs 

<html> 
<body> 

    <h1>Hello <%= name %></h1> 
    <a href="http://www.google/com">Link</a> 

</body> 
</html>