2017-05-08 67 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>