2016-12-23 8 views
4

私はexpress.jsを使用してWebアプリケーションを構築しようとしています。私のアプリケーションでは、メールを送信するためにnodemailerを使用しています。基本的なメールを送信するためにそれを使用するだけでOKです。ただし、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> 

Iは、例えば、単純なコンテンツで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); 
     } 
    }); 
} 

}); 
関連する問題