2017-05-08 2 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...") 
}); 

다음은

<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를 우편으로 발송되는 템플릿 양식을 사용하여 제출 인 EJS 파일을 내 폼 페이지 코드입니다. 그때 양식에서 이름을 읽고 어떻게

<html> 
<body> 

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

</body> 
</html> 

는 이메일에서, 각 이메일에, 내가 좋아하는, 변수를 사용하여 그 사람에 해결할 수 있도록 "안녕하세요 씨 {{이름}}"포함

전자 메일을 차단하지 않고 HTML 파일에 변수를 전달하는 방법을 알아낼 수 없습니다. 전자 메일 공급자가 거의 모든 전자 메일을 JS로 차단하기 때문에 HTML 태그 안에 스크립트 태그를 사용하여 자바 스크립트를 사용할 수 없기 때문입니다!

누군가 나를 도와 드릴까요?

+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 콜백에서 이메일을 보내기 전에 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>