12

有谁知道如何告诉 Node.js 的模块 nodemailer 使用外部 HTML 文件(带有样式表的链接)作为电子邮件内容?

我可以输入 HTML 标签作为电子邮件内容,但我更喜欢加载完整的 HTML 文件。我正在使用 nodemailer 1.3.0。

不幸的是,对于实际的 nodemailer 版本,我找不到任何涵盖此问题的示例。

想法?

4

3 回答 3

16

使用http://styliner.slaks.net

它是一个 node.js 包,允许您内联您的 css,以便您可以使用 nodemailer 发送完整的 HTML 电子邮件。

它还可以在您的电子邮件中添加/更新链接,使它们不再是相对链接。(即,您可以将“ coverage/local.html ”之类的链接更改为“ \myhostname\afolder\coverage\local.html

这是一个粗略且现成的脚本,我敲了它以通过电子邮件发送伊斯坦布尔代码覆盖率的输出。

/*
 * Use this script to send Istanbul code coverage results via email.
 * 
 * NPM REQUIREMENTS:
 *  The following packages need to be installed:
 *   - npm install styliner
 *   - npm install nodemailer
 *   - npm install nodemailer-smtp-transport
 * 
 * Usage: node sendNodeJSCoverageEmail.js <origfile> <basedir> <receipient>
 * 
 *  <origfile>  : This is the original Istanbul index.html from the code coverage report
 *  <basedir>   : TeamCity directory where the index.html resides. Must contain "DevTC" folder (see below)
 *  <recipient> : Email address to send the results to. 
 * 
 * What it does:
 *  Istanbul creates an html report for code coverage. It is a complete web page, and has an index.html,
 *  some CSS style sheets, and relative links to other coverage.
 *  
 *  This script takes the index.html, reads the referenced .css files, and inlines the css, so that external
 *  files are no longer needed. (this is because you can't send multiple files for an html email).
 *  Also, the relative links are prepended with the UNC path to the files: this means that the recipients 
 *  can click on the links in the html email and they will work. 
 *  
 *  NOTE: it assumes the TeamCity folder where the coverage reports reside is shared, and also contains the 
 *        folder DevTC (it looks for this folder to do the substitution). All build machines have this 
 *        folder structure. 
 *        
 */

var nodemailer = require('nodemailer');
var os = require("os");
var hostname = os.hostname();

var originalFile = process.argv[2].toString();
var baseDir = process.argv[3].toString();
var recipient = process.argv[4].toString();

var Styliner = require('styliner');


var uncDrive = '\\\\' + hostname + '\\DevTC';
var uncPath = baseDir.replace(/.*DevTC/gi, uncDrive);


// prependUNCPath is a function called by Styliner for every
// link that is found in the HTML.
function prependUNCPath(path, type) {
    return uncPath + path;
}

// See http://styliner.slaks.net/#about for Styliner options
var options = { url : prependUNCPath, noCSS : true };
var styliner = new Styliner(baseDir, options);

function sendEmail(source) {

    var nodemailer = require('nodemailer');
    var smtpTransport = require('nodemailer-smtp-transport');

    // create reusable transporter object using SMTP transport
    var transport = nodemailer.createTransport(smtpTransport({
        host: 'your-smtp-server.local',  // FIXME: Change this!
        port: 25,
    }));


    // setup e-mail data with unicode symbols
    var mailOptions = {
        from: 'TeamCity <teamcity@company.com>', // sender address
        to: recipient, // list of receivers
        subject: 'Code Coverage results', // Subject line
        // text: 'Hello world ?', // plaintext body, not used
        html: source // html body
    };

    // send mail with defined transport object
    transport.sendMail(mailOptions, function (error, info) {
        if (error) {
            console.log(error);
        } else {
            console.log('Message sent: ' + info.response);
        }
    });


}


var fs = require('fs')

// Do the reading of the original index.html, and kick everything off.
fs.readFile(originalFile, 'utf8', function (err, data) {
    if (err) {
        return console.log(err);
    }

    styliner.processHTML(data)
    .then(function (source)
         {

        sendEmail(source);

        fs.writeFile("newindex.html", source, function (err) {
            if (err) {
                return console.log(err);
            }

            console.log("The file was saved!");
        });

      }

    );

});
于 2015-03-30T02:43:54.340 回答
9

您应该使用内联 css,而不是单独的文件,因为 head 元素的 HTML 呈现等是由提供者而不是由 nodemailer 定义的。

我推荐 mailChim 的 css 内联工具,它非常方便,只需设置

html: '<div style="font - family: verdana; max-width:500px; margin-left">' + 'more string and string'
于 2015-02-09T19:18:46.333 回答
0

我建议使用fs模块的readFile函数来读取您的 HTML 文件,然后在回调中通过电子邮件发送它。

readFile 教程:http://docs.nodejitsu.com/articles/file-system/how-to-read-files-in-nodejs

于 2014-09-24T08:50:54.290 回答