简介

Node和Express都没有内置的邮件发送功能,所以必须使用第三方模块。推荐Andris Reinman的Nodemailer

SMTP、MSA和MTA

  • 发送邮件的通用语言是简单邮件传输协议(SMTP)

  • 尽管用SMTP直接发送一封邮件给接收者的邮件服务器是有可能的,但这通常是个非常糟糕的主意。除非是像Google或Yahoo!那样的“值得信任的发送者”,否则邮件很可能会直接被扔进垃圾箱。

  • 用邮件提交代理(MSA)比较好,它会通过可信的渠道投递邮件,降低邮件被标记为垃圾邮件的可能性。

  • 除了确保邮件成功送达,MSA还处理诸如临时故障造成的滋扰和退回的邮件。

  • 邮件传输代理(MTA),它提供将邮件真正送到其最终目的地的服务。

  • 像Gmail、Hotmail、iCloud这样的MSA是有邮件限制的;一旦准备好进入生产环境,可以切换到Sendgrid或亚马逊简单Email服务(SES)之类的专业MSA。

邮件头

  • 邮件消息由两部分组成:头部和主体。

  • 头部包含与邮件有关的信息:谁发的、发给谁、接收日期、主题等; 头信息给了所有关于邮件如何到达你这里的信息,邮件经过的所有服务器和MTA都会在头部里列出来。

  • “from”地址,它可以由发送方任意设定。当指定的“from”地址不是发送邮件的账号时,经常被当作“欺诈”; 不是在建议你尝试这种行为。

  • 然而发送的邮件必须有“from”地址。有时这在发送自动邮件时会出现问题,因此经常会出现像“不要回复do-not-reply@meadowlarktravel.com”之类的返回地址。不管是想采取这种方式,还是将发送地址设为“草地鹨旅行社 info@meadowlarktravel.com”,都完全取决于你。不过如果你采用了后一种方式,就要准备好答复发给info@meadowlarktravel.com的邮件。

邮件格式

  • 互联网刚出现的时候,所有邮件都是简单的ASCII文本。

  • Nodemailer可以处理

  • 邮件既可以是普通文本(Unicode),也可以是HTML; 建议总是包含文本和HTML两种格式的邮件;

  • 几乎所有现代的邮件程序都支持HTML邮件,所以用HTML作为邮件格式一般相当安全。

Nodemailer

//简单例子
var nodemailer = require('nodemailer'); var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: credentials.gmail.user,
pass: credentials.gmail.password
}
});
var mailOptions = {
from: 'Fred Foo <foo@blurdybloop.com>', // sender address
to: 'one@gmail.com ,tow@gmail.com', // list of receivers
subject: 'Hello ', // Subject line
text: 'Hello world ', // plaintext body
html: '<b>Hello world </b>' // html body
};
transporter.sendMail(mailOptions, function(error, info){
if(error){
console.log(error);
}else{
console.log('Message sent: ' + info.response);
}
});

Nodemailer为大多数流行的邮件服务提供了快捷方式:Gmail、Hotmail、iCloud、Yahoo!,除此之外还有很多。如果你的MSA没有出现在这个列表上,或者你需要直接连接一个SMTP服务器,它也支持:

var mailTransport = nodemailer.createTransport('SMTP',{
host: 'smtp.meadowlarktravel.com',
secureConnection: true, //用SSL 端口: 465
auth: {
user: credentials.meadowlarkSmtp.user,
pass: credentials.meadowlarkSmtp.password,
}
});

发送邮件

  • 在这里处理了错误,但没有错误不一定表示邮件成功发给了接收者:只有在跟MSA通信出现问题时才会设置回调函数的err参数(比如网络或授权错误)。如果MSA不能投递邮件(比如因为无效的邮件地址或者未知的用户),你会收到一封投递给MSA账号的失败邮件(比如你用自己的个人Gmail作为MSA,你的Gmail收件箱中就会收到一封失败消息)。

  • 如果你需要系统自动判断邮件是否投递成功,有两个选择。一是使用支持错误报告的MSA。亚马逊的简单邮件服务(SES)就是这样的服务,并且邮件退信通知是通过他们的简单通知服务(SNS)发送的,你可以配置其调用运行在你网站上的Web服务。另一个选择是使用直接投递,跳过MSA。不推荐使用直接投递,因为它是一个复杂的方案,并且你的邮件很可能会被标记为垃圾邮件。

将邮件发送给多个接收者

在向多个接收者发送邮件时,必须注意观察MSA的限制。比如Gmail,每封邮件的接收者上限是100个。如果发送批量邮件,可能要发送多条消息,每条消息有多个接收者:

var recipientLimit = 100;
for(var i=0; i<largeRecipientList.length/recipientLimit; i++){
mailTransport.sendMail({
from: '"Meadowlark Travel" <info@meadowlarktravel.com>',
to: largeRecipientList
.slice(i*recipientLimit, i*(recipientLimit+1)).join(','),
subject: 'Special price on Hood River travel package!',
text: 'Book your trip to scenic Hood River now!',
}, function(err){
if(err) console.error( 'Unable to send email: ' + error );
});
}

发送批量邮件的更佳选择

尽管确实可以通过Nodemailer和恰当的MSA发送批量邮件,但在这样做之前你应该细心考虑。一个负责任的邮件营销必须提供一种退订营销邮件的办法,并且这不是个轻而易举的任务。还要乘以你维护的每个订阅列表。像MailChimpCampaign Monitor之类的服务提供了你需要的一切,包括监测邮件营销成功情况的优秀工具.

发送HTML邮件

Nodemailer允许你在同一封邮件里发送HTML和普通文本两种版本,让邮件客户端选择显示哪个版本(一般是HTML):

mailTransport.sendMail({
from: '"Meadowlark Travel" <info@meadowlarktravel.com>',
to: 'joecustomer@gmail.com, "Jane Customer" ' +
'<janecustomer@gyahoo.com>, frecsutomer@hotmail.com',
subject: 'Your Meadowlark Travel Tour',
html: '<h1>Meadowlark Travel</h1>\n<p>Thanks for book your trip with ' +
'Meadowlark Travel. <b>We look forward to your visit!</b>',
generateTextFromHtml: true, //使用
}, function(err){
if(err) console.error( 'Unable to send email: ' + error );
});

HTML邮件中的图片

  • 尽管可以在HTML邮件中嵌入图片,但强烈反对这样做,因为它们会使你的邮件变得臃肿,并且一般会被当成不好的做法。相反,应该把用在邮件中的图片放在Web服务器上,并在邮件中放入正确的链接。

  • 当发送邮件给其他人时,很明显不应该用localhost; 根据所用的邮件客户端,或许可以在你的邮件中用localhost来进行测试,但在你的机器之外是行不通的。

封装邮件功能

//lib/email.js

var nodemailer = require('nodemailer');

module.exports = function(credentials){
var mailTransport = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: credentials.gmail.user,
pass: credentials.gmail.password,
}
}); var from = '"example" <example@example.com>';
var errorRecipient = credentials.gmail.user; return {
send: function(to, subj, body){
mailTransport.sendMail({
from: from,
to: to,
subject: subj,
html: body,
generateTextFromHtml: true
}, function(err, info){
if(err) {
console.error('Unable to send email: ' + err);
} else {
console.log('Message sent: ' + info.response);
}
});
}, emailError: function(message, filename, exception){
var body = '<h1>Meadowlark Travel Site Error</h1>' +
'message:<br><pre>' + message + '</pre><br>';
if(exception) body += 'exception:<br><pre>' + exception
+ '</pre><br>';
if(filename) body += 'filename:<br><pre>' + filename
+ '</pre><br>';
mailTransport.sendMail({
from: from,
to: errorRecipient,
subject: 'Meadowlark Travel Site Error',
html: body,
generateTextFromHtml: true
}, function(err){
if(err) console.error('Unable to send email: ' + err);
});
},
}
}; //发送调用
var emailService = require('./lib/email.js')(credentials); emailService.send('joecustomer@gmail.com', 'Hood River tours on sale today!',
'Get \'em while they\'re hot!');

将邮件作为网站监测工具

if(err){
email.sendError('the widget broke down!', __filename);
// ……给用户显示错误消息
} // 或者 try {
// 在这里做些不确定的事情......
} catch(ex) {
email.sendError('the widget broke down!', __filename, ex);
// ……给用户显示错误消息
}

express-14 发送邮件的更多相关文章

  1. 使用Spring 发送 Email !!!!

    邮件服务器: 邮件服务器提供了邮件系统的基本结构,包括邮件传输,邮件分发,邮件存储等功能,以确保邮件能够发送到互联网中的任意地方. 邮件服务器就像我们生活中的邮局,为人们提供邮件服务.要保证邮件被正确 ...

  2. NopCommerce功能与特点介绍

    [本文转自]http://www.cnblogs.com/nopcommerce-b2c/p/3758676.html 前两节我们主要介绍了NopCommerce下载与安装和NopCommerce中文 ...

  3. 03.NopCommerce功能与特点介绍

    前两节我们主要介绍了NopCommerce下载与安装和NopCommerce中文语言包,让大家体验一下NopCommerce.这次我们主要来介绍NopCommerce的功能与特点. NopCommer ...

  4. Node.js权威指南 (14) - 使用Express构建Web应用程序

    14.1 Express概述 / 415 14.1.1 安装Express / 415 14.1.2 使用Express开发一个简单的示例应用程序 / 415 Backup for docker: e ...

  5. express利用nodemailer发送邮件(163邮箱)

    Nodemailer 是一个简单易用的Node.js邮件发送组件 首先安装这个组件 npm install nodemailer --save 安装之后,可以在某个get请求下,发送邮件,具体路由代码 ...

  6. nodemailer + express + h5 拖拽文件上传 实现发送邮件

    一.部署 1.部署Express 2.准备一个邮箱并开始SMTP服务 二.服务器端 三.客户端 四.效果:

  7. 在Yii Framework中利用PHPMailer发送邮件(2011-06-02 14:06:23)

    转载▼ 标签: it 分类: 技术共享 官方扩展链接:http://www.yiiframework.com/extension/mailer/这个扩展配置十分方便,如果有问题的话,可以打开Debug ...

  8. CentOS 6.5 and Ubuntu 14.04 使用外部邮箱发送邮件

    我们可以使用外部邮箱(163,126,gmail,139等等)为我们发邮件 for CentOS 6.5 yum -y install mailx vi /etc/mail.rc 在文件的末行添加以下 ...

  9. 14 ~ express ~ 显示用户数据

    一,router/admin.js var express = require('express') var router = express.Router() var User = require( ...

随机推荐

  1. code vs1706 求合数和(数论 素数的判定)

    1706 求合数和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解  查看运行结果     题目描述 Description 用户输入一个数,然后输出 ...

  2. C 和 Object- C 中得 #ifdef 和#ifndef

    很多宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条件时 ...

  3. MyEclipse8.5破解方法

    本文是转自其它博文,用以留着备份的~ Step: 1.建立一个任意名称的Java Project 2.在该工程中建立一个名文MyEclipseGen的Java文件(MyEclipseGen.java) ...

  4. Android笔记:实现点击事件

    布局文件声明控件 .java文件获取控件 1. button.setOnClickListener(new View.OnClickListener() {            @Override  ...

  5. [Android Pro] Android 进程级别 和 oom_adj对应关系

    一 : 前台进程 (Active Process): oom_adj为0. 前台进程包括 : 1 : 活动 正在前台接收用户输入 2:活动.服务与广播接收器正在执行一个onReceive事件的处理函数 ...

  6. [Android Pro] Gradle Tips#1-tasks

    reference to : http://trickyandroid.com/gradle-tip-1-tasks/ http://blog.csdn.net/lzyzsd/article/deta ...

  7. August 12th 2016 Week 33rd Friday

    Everything is good in its season. 万物逢时皆美好. Every dog has its day. You are not in your best condition ...

  8. 数据存储-CoreData总结

    CoreData /*英译  Entity:实体 Attributes:属性 binary:二进制 persistent:持续化 coordinator:协调者 meging:合并 configura ...

  9. EmguCV学习 与opencv的区别和联系

    openCV是因特尔的一个开源的视觉库,里面几乎包含了所有的图像处理的经典算法,并且采用C和少量的C++编写,运行效率很高,对于做图像处理这方面工作的,认识opencv是必须的工作.不过opencv有 ...

  10. Big Data, MapReduce, Hadoop, and Spark with Python

    此书不错,很短,且想打通PYTHON和大数据架构的关系. 先看一次,计划把这个文档作个翻译. 先来一个模拟MAPREDUCE的东东... mapper.py class Mapper: def map ...