express-14 发送邮件
简介
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发送批量邮件,但在这样做之前你应该细心考虑。一个负责任的邮件营销必须提供一种退订营销邮件的办法,并且这不是个轻而易举的任务。还要乘以你维护的每个订阅列表。像MailChimp和Campaign 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 发送邮件的更多相关文章
- 使用Spring 发送 Email !!!!
邮件服务器: 邮件服务器提供了邮件系统的基本结构,包括邮件传输,邮件分发,邮件存储等功能,以确保邮件能够发送到互联网中的任意地方. 邮件服务器就像我们生活中的邮局,为人们提供邮件服务.要保证邮件被正确 ...
- NopCommerce功能与特点介绍
[本文转自]http://www.cnblogs.com/nopcommerce-b2c/p/3758676.html 前两节我们主要介绍了NopCommerce下载与安装和NopCommerce中文 ...
- 03.NopCommerce功能与特点介绍
前两节我们主要介绍了NopCommerce下载与安装和NopCommerce中文语言包,让大家体验一下NopCommerce.这次我们主要来介绍NopCommerce的功能与特点. NopCommer ...
- Node.js权威指南 (14) - 使用Express构建Web应用程序
14.1 Express概述 / 415 14.1.1 安装Express / 415 14.1.2 使用Express开发一个简单的示例应用程序 / 415 Backup for docker: e ...
- express利用nodemailer发送邮件(163邮箱)
Nodemailer 是一个简单易用的Node.js邮件发送组件 首先安装这个组件 npm install nodemailer --save 安装之后,可以在某个get请求下,发送邮件,具体路由代码 ...
- nodemailer + express + h5 拖拽文件上传 实现发送邮件
一.部署 1.部署Express 2.准备一个邮箱并开始SMTP服务 二.服务器端 三.客户端 四.效果:
- 在Yii Framework中利用PHPMailer发送邮件(2011-06-02 14:06:23)
转载▼ 标签: it 分类: 技术共享 官方扩展链接:http://www.yiiframework.com/extension/mailer/这个扩展配置十分方便,如果有问题的话,可以打开Debug ...
- CentOS 6.5 and Ubuntu 14.04 使用外部邮箱发送邮件
我们可以使用外部邮箱(163,126,gmail,139等等)为我们发邮件 for CentOS 6.5 yum -y install mailx vi /etc/mail.rc 在文件的末行添加以下 ...
- 14 ~ express ~ 显示用户数据
一,router/admin.js var express = require('express') var router = express.Router() var User = require( ...
随机推荐
- ajax+json+Struts2实现list传递实例讲解
由于学习需要,需要通过ajax来获取后台的List集合里面的值.由于前面没有接触过,所以今天就来研究下了. 一.首先需要下载JSON依赖的jar包.它主要是依赖如下: json-lib-2.2.2-j ...
- OKhttp的封装(下)
OKhttpManager2.Class 请求工具类 package com.example.administrator.okhttp3; import android.os.Handler; im ...
- 20145213《Java程序设计》第四周学习总结
20145213<Java程序设计>第四周学习总结 教材学习内容总结 本周任务是学习面向对象的继承.接口以及之后的如何活用多态.(还真是路漫漫其修远兮啊!)教材也是延续上周艰深晦涩的语言风 ...
- IOS - 响应者链条
简单来说就是:一级一级的找到响应的视图,如果没有就传给UIWindow实例和UIApplication实例,要是他们也处理不了,就丢弃这次事件... 对于IOS设备用户来说,他们操作设备的方式主要有三 ...
- mongodb 3.2 用户权限管理配置
使用mongodb 有段时间了,由于是在内网使用,便没有设置权限,一直是裸奔. 最近有时间,研究了下mongodb 3.2 的用户权限配置,网上有许多用户权限配置的文章,不过大多是之前版本,有些出入, ...
- 如何解决exe4j生成exe文件后弹出提示信息
使用exe4j生成exe文件时会提示以上一段信息,这个主要是没有注册导致的,在welcome to exe4j的右下角有一个注册信息的地方,去找个注册码,就OK了. 通用注册码:L-g782dn2d- ...
- hdu 1203
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 思路:01背包问题,求一份都拿不到的概率,状态转移方程dp[j]=min(dp[j],dp[j- ...
- Android自学指导
如果想自学Android,以下的文章可以作为参考: 如何自学Android(Gityuan) 那两年炼就的Android内功修养(老罗的Android之旅)
- Android Tab -- 使用ViewPager、Fragment、FragmentPagerAdapter来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换:点击标签切换. 代码:https://github.com/l ...
- 关于plsql连接oracle数据库session失效时间设置
http://bbs.csdn.net/topics/350152441 http://www.linuxidc.com/Linux/2015-09/123286.htm