外部HTML文件,其中CSS作为nodemailer中的电子邮件内容

时间:2014-09-23 22:10:41

标签: html node.js nodemailer

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

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

不幸的是,我找不到任何针对实际的nodemailer版本来解决此问题的示例。

想法?

3 个答案:

答案 0 :(得分:9)

使用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!");
        });

      }

    );

});

答案 1 :(得分:1)

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

我推荐mailChim's css inliner tool,它非常方便,只需设置

即可
html: '<div style="font - family: verdana; max-width:500px; margin-left">' + 'more string and string'

答案 2 :(得分:0)

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

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