2014-02-09 93 views

回答

13

我一直在使用这个模块:https://github.com/andris9/Nodemailer

更新例子(使用Express和nodemailer),其中包括从文件系统获得index.jade模板,并将其发送作为电子邮件:

var _jade = require('jade'); 
var fs = require('fs'); 

var nodemailer = require("nodemailer"); 

var FROM_ADDRESS = '[email protected]'; 
var TO_ADDRESS = '[email protected]'; 

// create reusable transport method (opens pool of SMTP connections) 
var smtpTransport = nodemailer.createTransport("SMTP",{ 
    service: "Gmail", 
    auth: { 
     user: "bar[email protected]", 
     pass: "PASSWORD" 
    } 
}); 

var sendMail = function(toAddress, subject, content, next){ 
    var mailOptions = { 
    from: "SENDERS NAME <" + FROM_ADDRESS + ">", 
    to: toAddress, 
    replyTo: fromAddress, 
    subject: subject, 
    html: content 
    }; 

    smtpTransport.sendMail(mailOptions, next); 
}; 

exports.index = function(req, res){ 
    // res.render('index', { title: 'Express' }); 

    // specify jade template to load 
    var template = process.cwd() + '/views/index.jade'; 

    // get template from file system 
    fs.readFile(template, 'utf8', function(err, file){ 
    if(err){ 
     //handle errors 
     console.log('ERROR!'); 
     return res.send('ERROR!'); 
    } 
    else { 
     //compile jade template into function 
     var compiledTmpl = _jade.compile(file, {filename: template}); 
     // set context to be used in template 
     var context = {title: 'Express'}; 
     // get html back as a string with the context applied; 
     var html = compiledTmpl(context); 

     sendMail(TO_ADDRESS, 'test', html, function(err, response){ 
     if(err){ 
      console.log('ERROR!'); 
      return res.send('ERROR'); 
     } 
     res.send("Email sent!"); 
     }); 
    } 
    }); 
}; 

我'd可能会将邮件程序部分移到它自己的模块中,但我将所有内容都包含在这里,以便您可以一起看到它。

+0

我也用过它,但它不能发送复杂的模板 – user3044147

+1

你是什么意思的复杂模板?只要你的模板被编译成一个字符串,我不明白为什么它不起作用。 – Ryan

+0

我得到这个https://github.com/niftylettuce/node-email-templates。尝试 – user3044147

4

您可以使用nodemailernodemailer-express-handlebars模块做到这一点:

var nodemailer = require('nodemailer'); 
var mailerhbs = require('nodemailer-express-handlebars'); 

var mailer = nodemailer.createTransport({ 
    service: Gmail, // More at https://nodemailer.com/smtp/well-known/#supported-services 
    auth: { 
     user: [[email protected]], // Your email id 
     pass: [PASSWORD] // Your password 
    } 
}); 

mailer.use('compile', mailerhbs({ 
    viewPath: 'templates/default/emails', //Path to email template folder 
    extName: '.hbs' //extendtion of email template 
})); 

在路由器后,您可以使用:

mailer.sendMail({ 
      from: 'Your name [email protected]', 
      to: user.local.email, 
      subject: 'Reset your password', 
      template: 'password_reset', //Name email file template 
      context: { // pass variables to template 
       hostUrl: req.headers.host, 
       customeName: user.info.firstname + ' ' + user.info.lastname, 
       resetUrl: req.headers.host + '/users/recover/' + token, 
       resetCode: token 
      } 
     }, function (err, response) { 
      if (err) { 
       res.send('Error send email, please contact administrator to best support.'); 
      } 
      res.send('Email send successed to you email' + req.body.email + '.'); 
      done(err, 'done'); 
     }); 

在HBS模板,你可以使用变量:

{{var from context}} 

希望代码块可以帮助你。

+0

其必须给extName只.hbs?我可以使用.html吗? –

+0

您可以使用'engine'模板的语法在'.html'中显示一个变量 –

+0

我正在使用html视图引擎,无法在html文件中访问上下文变量,我该怎么办? –