2016-12-23 1 views
4

express.js를 사용하여 웹 응용 프로그램을 작성하려고합니다. 내 응용 프로그램에서 메일을 보내는 데 nodemailer를 사용하고 있습니다. 방금 기본 메일을 보내는 데 사용하면 잘 작동합니다. 그러나 nodemailer를 사용하여 렌더링 된 ejs 파일을 보내려고하면 수신자는 빈 메일 만 수신합니다. 그래서 여기 내 코드의 세부 사항 : 여기 test.ejs (이 파일을 올바르게 렌더링 EJS의 문자열을 출력하기 때문에 또한, 결과을 console.log (mainOptions.html가) 괜찮nodemailer를 사용하여 ejs 템플릿 보내기

var transporter = nodemailer.createTransport({ 
       host: 'smtp.zoho.com', 
       port: 465, 
       secure: true, // use SSL 
       auth: { 
        user: '[email protected]', 
        pass: '123456' 
       } 
      }); 
fs.readFile('/test.ejs', 'utf8', function (err, data) { 
       if (err) { 
        return console.log(err); 
       } 
       var mainOptions = { 
        from: '"Tester" [email protected]', 
        to: email, 
        subject: 'Hello, world' 
        html: ejs.render(data, {name: 'Stranger'}); 
       }; 
       console.log(mainOptions.html); 
}); 
transporter.sendMail(mainOptions, function (err, info) { 
          if (err) { 
           console.log(err); 
          } else { 
           console.log('Message sent: ' + info.response); 
          } 
         }); 

(<% = 이름 %가

<style type="text/css"> 
    .header { 
    background: #8a8a8a; 
    } 
    .header .columns { 
    padding-bottom: 0; 
    } 
    .header p { 
    color: #fff; 
    padding-top: 15px; 
    } 
    .header .wrapper-inner { 
    padding: 20px; 
    } 
    .header .container { 
    background: transparent; 
    } 
    table.button.facebook table td { 
    background: #3B5998 !important; 
    border-color: #3B5998; 
    } 
    table.button.twitter table td { 
    background: #1daced !important; 
    border-color: #1daced; 
    } 
    table.button.google table td { 
    background: #DB4A39 !important; 
    border-color: #DB4A39; 
    } 
    .wrapper.secondary { 
    background: #f3f3f3; 
    } 
</style> 



<wrapper class="header"> 
    <container> 
    <row class="collapse"> 
     <columns small="6"> 
     <img src="http://placehold.it/200x50/663399"> 
     </columns> 
     <columns small="6"> 
     <p class="text-right">BASIC</p> 
     </columns> 
    </row> 
    </container> 
</wrapper> 

<container> 

    <spacer size="16"></spacer> 

    <row> 
    <columns small="12"> 

     <h1>Hi, <%= name %></h1> 
     <p class="lead">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Magni, iste, amet consequatur a veniam.</p> 
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut optio nulla et, fugiat. Maiores accusantium nostrum asperiores provident, quam modi ex inventore dolores id aspernatur architecto odio minima perferendis, explicabo. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima quos quasi itaque beatae natus fugit provident delectus, magnam laudantium odio corrupti sit quam. Optio aut ut repudiandae velit distinctio asperiores?</p> 
     <callout class="primary"> 
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Reprehenderit repellendus natus, sint ea optio dignissimos asperiores inventore a molestiae dolorum placeat repellat excepturi mollitia ducimus unde doloremque ad, alias eos!</p> 
     </callout> 
    </columns> 
    </row> 
    <wrapper class="secondary"> 

    <spacer size="16"></spacer> 

    <row> 
     <columns large="6"> 
     <h5>Connect With Us:</h5> 
     <button class="facebook expand" href="http://zurb.com">Facebook</button> 
     <button class="twitter expand" href="http://zurb.com">Twitter</button> 
     <button class="google expand" href="http://zurb.com">Google+</button> 
     </columns> 
     <columns large="6"> 
     <h5>Contact Info:</h5> 
     <p>Phone: 408-341-0600</p> 
     <p>Email: <a href="mailto:[email protected]">[email protected]</a></p> 
     </columns> 
    </row> 
    </wrapper> 
</container> 

내가 예를 들어, 간단한 내용으로 mainOptions.html를 교체 할 경우 '낯선 사람')으로 대체>.받는 사람이 정확하게 내용을 받게됩니다 <b>Hello, world!</b> 그러나, 나는 위의 코드를 사용하는 경우, 수신자는 내용이 비어있는 이메일 만 수신합니다 (수신자는 발신자, 제목 및 기타 정보를 올바르게 수신합니다). 렌더링 된 문자열을 html 대신 일반 텍스트로 보내려면 html을 텍스트로 바꾸려고 시도하지만 수신 된 메일에는 여전히 빈 내용이 있습니다. 그 순간 내 문제의 모든 세부 사항을 제공 할 수 있습니다. 그래서 누군가 내 코드에 무엇이 잘못되었다는 것을 알고 있다면 그것을 지적 해주십시오.

제공 할 수있는 도움에 미리 감사드립니다.

답변

5

fs.readFile이 완료되기 전에 sendMail이 실행됩니다.

실제로 readFile은 파일을 읽고 HTML 문자열을 렌더링하는 ejs.renderFile으로 바꿀 수 있습니다. 아래의 리팩터링 코드를 사용해보십시오.

var fs = require("fs"); 
var nodemailer = require("nodemailer"); 
var ejs = require("ejs"); 
var transporter = nodemailer.createTransport({ 
    host: 'smtp.zoho.com', 
    port: 465, 
    secure: true, // use SSL 
    auth: { 
     user: '[email protected]', 
     pass: '123456' 
    } 
}); 

ejs.renderFile(__dirname + "/test.ejs", { name: 'Stranger' }, function (err, data) { 
if (err) { 
    console.log(err); 
} else { 
    var mainOptions = { 
     from: '"Tester" [email protected]', 
     to: "[email protected]", 
     subject: 'Hello, world', 
     html: data 
    }; 
    console.log("html data ======================>", mainOptions.html); 
    transporter.sendMail(mainOptions, function (err, info) { 
     if (err) { 
      console.log(err); 
     } else { 
      console.log('Message sent: ' + info.response); 
     } 
    }); 
} 

}); 
관련 문제