简介

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

  1. //简单例子
  2. var nodemailer = require('nodemailer');
  3. var transporter = nodemailer.createTransport({
  4. service: 'Gmail',
  5. auth: {
  6. user: credentials.gmail.user,
  7. pass: credentials.gmail.password
  8. }
  9. });
  10. var mailOptions = {
  11. from: 'Fred Foo <foo@blurdybloop.com>', // sender address
  12. to: 'one@gmail.com ,tow@gmail.com', // list of receivers
  13. subject: 'Hello ', // Subject line
  14. text: 'Hello world ', // plaintext body
  15. html: '<b>Hello world </b>' // html body
  16. };
  17. transporter.sendMail(mailOptions, function(error, info){
  18. if(error){
  19. console.log(error);
  20. }else{
  21. console.log('Message sent: ' + info.response);
  22. }
  23. });

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

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

发送邮件

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

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

将邮件发送给多个接收者

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

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

发送批量邮件的更佳选择

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

发送HTML邮件

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

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

HTML邮件中的图片

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

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

封装邮件功能

  1. //lib/email.js
  2. var nodemailer = require('nodemailer');
  3. module.exports = function(credentials){
  4. var mailTransport = nodemailer.createTransport({
  5. service: 'Gmail',
  6. auth: {
  7. user: credentials.gmail.user,
  8. pass: credentials.gmail.password,
  9. }
  10. });
  11. var from = '"example" <example@example.com>';
  12. var errorRecipient = credentials.gmail.user;
  13. return {
  14. send: function(to, subj, body){
  15. mailTransport.sendMail({
  16. from: from,
  17. to: to,
  18. subject: subj,
  19. html: body,
  20. generateTextFromHtml: true
  21. }, function(err, info){
  22. if(err) {
  23. console.error('Unable to send email: ' + err);
  24. } else {
  25. console.log('Message sent: ' + info.response);
  26. }
  27. });
  28. },
  29. emailError: function(message, filename, exception){
  30. var body = '<h1>Meadowlark Travel Site Error</h1>' +
  31. 'message:<br><pre>' + message + '</pre><br>';
  32. if(exception) body += 'exception:<br><pre>' + exception
  33. + '</pre><br>';
  34. if(filename) body += 'filename:<br><pre>' + filename
  35. + '</pre><br>';
  36. mailTransport.sendMail({
  37. from: from,
  38. to: errorRecipient,
  39. subject: 'Meadowlark Travel Site Error',
  40. html: body,
  41. generateTextFromHtml: true
  42. }, function(err){
  43. if(err) console.error('Unable to send email: ' + err);
  44. });
  45. },
  46. }
  47. };
  48. //发送调用
  49. var emailService = require('./lib/email.js')(credentials);
  50. emailService.send('joecustomer@gmail.com', 'Hood River tours on sale today!',
  51. 'Get \'em while they\'re hot!');

将邮件作为网站监测工具

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

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. 【python】判断字符串日期是否有效

    来源: http://www.jb51.net/article/66014.htm http://www.runoob.com/python/att-time-strptime.html 用time模 ...

  2. LINQ查询返回DataTable类型

    个人感觉Linq实用灵活性很大,参考一篇大牛的文章LINQ查询返回DataTable类型 http://xuzhihong1987.blog.163.com/blog/static/267315872 ...

  3. jQuery与JS的区别,以及jQuery的基础语法

    *在使用jQuery时,要在页面最上端加上 <script src="../jquery-1.11.2.min.js"></script> 看一下js与jQ ...

  4. 25个增强iOS应用程序性能的提示和技巧(高级篇)(2)

    25个增强iOS应用程序性能的提示和技巧(高级篇)(2) 2013-04-16 14:56 破船之家 beyondvincent 字号:T | T 在开发iOS应用程序时,让程序具有良好的性能是非常关 ...

  5. eclipse查看hadoop中文件出现乱码

    出现这个问题, 我首先去找了一下几个问题: 1.文件是否是utf-8 2.上传到Linux中的hadoop, 在Linux下去查看是否乱码 3.上面都没有问题, 就去检查eclipse,将项目工程改成 ...

  6. Android中Service 使用详解(LocalService + RemoteService)

    Service 简介: Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...

  7. <转>JDBC获取DB元数据

    原文链接:http://jiauwu.iteye.com/blog/1307617 package com.util.jdbc; import java.sql.Connection; import ...

  8. Auto Layout

    Auto Layout XCode5+ Auto Layout Concepts 核心的概念是约束. Constraint Basics Constant value Relation Priorit ...

  9. Oracle【IT实验室】数据库备份与恢复之三:OS备份/用户管理的备份与恢复

    用户管理的备份与恢复也称 OS物理备份,是指通过数据库命令设置数据库为备份 状态,然后用操作系统命令,拷贝需要备份或恢复的文件.这种备份与恢复需要用户的 参与手工或自动完成. 对于使用 OS拷贝备份的 ...

  10. js判断当前的访问是手机/电脑

    <script type="text/javascript"> var commonURL = 'http://www.xxx.com/'; function mobi ...