2016-12-23 40 views
4

我正在嘗試使用express.js構建一個web應用程序。在我的應用程序中,我使用nodemailer發送郵件。如果我只是用它發送基本郵件,它就可以正常工作;然而,當我嘗試使用nodemailer發送渲染的ejs文件時,收件人只收到一封空郵件。所以在這裏我的代碼的詳細信息:使用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); 
          } 
         }); 

這裏test.ejs(也,結果的console.log(mainOptions.html)是好的,因爲它打印出來的渲染EJS文件中正確的字符串(<% =名稱%>替換爲「陌生人」)

<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

問題是sendMailfs.readFile完成之前得到執行。

實際上,readFile可以被ejs.renderFile取代,該文件讀取文件並呈現HTML字符串。請嘗試下面的重構代碼。

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); 
     } 
    }); 
} 

});