2017-05-08 15 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ファイル内のスクリプトタグを使用してJavascriptを使用できないため、メールをブロックすることなくHTMLファイルに変数を渡す方法がわかりません。ほとんどのメールプロバイダがJSを電子メールでブロックするためです。

誰かが私を助けてくれますか?

+0

最初のHTMLを生成し、電子メールのオブジェクトに含めるです。 – yBrodsky

+0

どうすればいいですか?そのためにはどのツールが必要でしょうか?私は愚かな質問をして申し訳ありません、私はJSとノードの初心者です。 :S –

+1

私はこれを使用します:https://github.com/crocodilejs/node-email-templates#basic – yBrodsky

答えて

2

あなたは急行ですでに設定したエンジンをテンプレート化EJSを使用することができます。 app.render()を呼び出すと、指定したテンプレートが文字列としてレンダリングされ、そのコールバックに渡されたデータに加えてコールバックに渡されます。だから、コールバックでは少し醜いですが、これは依存性を追加しない解決策です。要するに

、お使いのメールテンプレートverifyEmail.ejsという名前EJSファイル、app.renderコールバックからの電子メールを送信する前に、POSTリクエストボディからのデータと、それをレンダリングする 使用app.render()します。

// 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> 
関連する問題