2016-12-23 15 views
4

Я пытаюсь создать веб-приложение с помощью express.js. В моем приложении я использую nodemailer для отправки почты. Если я просто использую его для отправки основной почты, он работает нормально; однако, когда я пытаюсь использовать nodemailer для отправки визуализированного файла ejs, получатель получает только пустую почту. Так вот детали моего кода:Отправка шаблона ejs с помощью nodemailer

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

Задача sendMail Выполняется до завершения fs.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); 
     } 
    }); 
} 

}); 

 Смежные вопросы

  • Нет связанных вопросов^_^