如何使用Node.js发邮件?

电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。

在很多项目中,我们都会遇到邮件注册,邮件反馈等需求。在node中收发电子邮件也非常简单,因为强大的社区有各种各样的包可以供我么直接使用。Nodemailer包就可以帮助我们快速实现发送邮件的功能。

Nodemailer简介

Nodemailer是Node.js应用程序的一个模块,是一个简单易用的Node.js邮件发送组件。可以轻松地发送电子邮件。该项目于2010年开始,当时没有合理的选项来发送电子邮件消息,今天它是大多数Node.js用户默认发送邮件的解决方案。

官网地址:https://nodemailer.com

GitHub地址:https://github.com/nodemailer/nodemailer

Nodemailer的主要特点包括:

  • 支持Unicode编码
  • 支持Window系统环境
  • 支持HTML内容和普通文本内容
  • 支持附件(传送大附件)
  • 支持HTML内容中嵌入图片
  • 支持SSL/STARTTLS安全的邮件发送
  • 支持内置的transport方法和其他插件实现的transport方法
  • 支持自定义插件处理消息
  • 支持XOAUTH2登录验证

 准备工作

首先你需要准备一个邮箱!因为我们要做的是发送邮件的功能。所以准备的邮箱就是作为邮件发送方。

你可以这样理解(仅作为理解):Nodemailer 就是一个跑在你服务器上的程序,它的功能就是在一定条件发生时向某个邮箱发送邮件。因此需要注册一个邮箱作为发件方并把邮箱账号密码告诉Nodemailer (配置一个对象作为参数)。当一定条件发生时,Nodemailer 会根据你配置的账号密码登陆这个邮箱(在触发发邮件函数时,可以将接收方、邮件信息如标题、内容等作为参数传入),并根据传进来的信息进行发件操作。但是,在实际操作时,却没有这么直接。需要我们在配置账号密码之前,为你准备的邮箱开启POP3/SMTP服务。那么问题来了,什么是POP3/SMTP服务呢?

POP3 协议

POP 协议(Post Office Protocol,邮局协议)是一种允许用户从邮件服务器收发邮件的协议。它有2种版本,即POP2和POP3,都具有简单的电子邮件存储转发功能。POP2与POP3本质上类似,都属于离线式工作协议,但是由于使用了不同的协议端口,两者并不兼容。与 SMTP协议相结合,POP3是目前最常用的电子邮件服务协议。POP3除了支持离线工作方式外,还支持在线工作方式。

在离线工作方式下,用户收发邮件时,首先通过POP3客户程序登录到支持POP3协议的邮件服务器,然后发送邮件及附件;接着,邮件服务器将为该用户收存的邮件传送给POP3客户程序,并将这些邮件从服务器上删除;最后,邮件服务器将用户提交的发送邮件,转发到运行SMTP协议的计算机中,通过它实现邮件的最终发送。在为用户从邮件服务器收取邮件时,POP3是以该用户当前存储在服务器上全部邮件为对象进行操作的,并一次性将它们下载到用户端计算机中。一旦客户的邮件下载完毕,邮件服务器对这些邮件的暂存托管即告完成。使用POP3,用户不能对他们贮存在邮件服务器上的邮件进行部分传输。离线工作方式适合那些从固定计算机上收发邮件的用户使用。当使用POP3在线工作方式收发邮件时,用户在所用的计算机与邮件服务器保持连接的状态下读取邮件。用户的邮件保留在邮件服务器上。

SMTP协议

SMTP协议是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。   SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

说了一大堆,还有有点不明所以?有些深入了解http的同学可能会知道,http协议只是TCP/IP协议族中的一个协议,同时https协议处于网络模型的应用层。而应用层主要是提供网络任意端上应用程序之间的接口而除了http/https,POP3/SMTP也处于应用层,除了这些还有DNS、FTP等协议。http协议我们都知道,是浏览器/客户端同服务器进行交互的一种通信协议。而POP3/SMTP就是邮件收发服务器进行交互的一种通信协议。这里就不展开了(其实再深入的我也不会),有兴趣的同学可以研究下。

回到主题,对于要开启POP3/SMTP服务你可以这样理解(仅作为理解):上面我们说过,当一定条件发生时,Nodemailer 会根据你配置的账号密码登陆这个邮箱。其实这样描述只是为了方便大家理解,Nodemailer  并没有做登陆操作。现在我们需要将刚刚的理解稍微改变一下。当我们使用某个邮箱(比如QQ邮箱),发送一封邮件给163邮箱。当我们点击发送按钮之后,腾讯的发件服务器会遵循SMTP通讯协议发送这封邮件,而网易的邮件接收服务器会遵循POP3协议接受这封邮件。但是现在我们要使用 Nodemailer 发送邮件,也就是现在发件服务器变成了 Nodemailer 程序所在的服务器,因此 我们在使用 Nodemailer 发邮件之前也要把当前服务器发邮件时要遵循的通信协议变成SMTP。

听起来很复杂有木有?但是实际操作起来却很简单。我们只需要设置下邮箱获取下授权码,并将其配置到 Nodemailer 中就好了。我准备的作为发件箱的邮箱是QQ邮箱,具体操作步骤如下:

打开邮箱,设置里找到:

点POP3/SMTP服务后面的开启:

然后会让你验证,验证通过后会给你一个授权码:

记好这个授权码,不要搞丢了。然后就需要在你的项目目录下安装 Nodemailer 。

npm install nodemailer -D

使用 nodemailer

首先在你的项目目录下新建一个send.js,内容如下:

const nodemailer = require('nodemailer');  //引入nodemailer 
const transporter = nodemailer.createTransport({  //配置 nodemailer 服务
  // host: 'smtp.qq.com', // SMTP服务器地址
  service: 'qq', // 使用内置传输发送邮件,支持列表:https://nodemailer.com/smtp/well-known
  port: 465, // SMTP 端口,不能写别的端口
  secureConnection: true, // 使用 SSL(安全方式,防止被窃取信息)
  auth: {
    user: '[email protected]',  //你准备作为发件方的邮箱
    pass: 'xxxxxx',  // 这里密码不是qq密码,是你设置的smtp授权码
  }
});

let mailOptions = {  //设置邮件信息
  from: '[email protected]', //你准备作为发件方的邮箱
  to: '[email protected]', // 收件箱
  subject: '邮件标题', // 邮件标题
  // 发送text或者html格式
  // text: 'I am the email body', // 文本格式的邮件内容
  html: '<p>hml格式的邮件内容</p>' // hml格式的邮件内容
};

// 发送邮件
transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    return console.log(error);
  }
  console.log('ok');
});


这里我们需要注意,auth.pass 不是邮箱账户的密码而是stmp的授权码。

将上面的程序中的邮箱我的两个邮箱。然后执行:

node send.js

就收到邮件了:

收到了,就是这么简单。

如果你要发送附件,则先把要发送的文件放入工程中,并修改上面代码的附件的filename和path。

let mailOptions = {  //设置邮件信息
  from: '[email protected]', //你准备作为发件方的邮箱
  to: '[email protected]', // 收件箱
  subject: '邮件标题', // 邮件标题
  // 发送text或者html格式
  // text: 'I am the email body', // 文本格式的邮件内容
  html: '<p>hml格式的邮件内容</p>' // hml格式的邮件内容
  attachments: [
    {
        filename: 'img1.png',            // 改成你的附件名
        path: 'public/images/img1.png',  // 改成你的附件路径
        cid : '00000001'                 // cid可被邮件使用
    },
    {
        filename: 'img2.png',            // 改成你的附件名
        path: 'public/images/img2.png',  // 改成你的附件路径
        cid : '00000002'                 // cid可被邮件使用
    },
  ]
}

如果你要发送附件,则先把要发送的文件放入工程中,并修改上面代码的附件的filename和path。

从代码中可以知道,要在邮件正文中添加图片,可以设置图片的cid,然后在img标签的src中设置为对应的cid即可。

注意,不建议在js代码中直接嵌入HTML代码,也不建议把图片加到邮件正文中。

其他的一些细节

抄送

  • CC: Carbon Copy(抄送),用于通知相关的人,收件人可以看到都邮件都抄送给谁了。一般回报工作或跨部门沟通时,都会CC给收件人的领导一份
  • BCC:Blind Carbon Copy(暗抄送),也是用于通知相关的人,但是收件人是看不到邮件被密送给谁了。

更多配置项:https://nodemailer.com/message/

好看的HTML邮件

HTML Email 编写指南: http://www.ruanyifeng.com/blog/2013/06/html_email.html

使用模板引擎

邮件信息一般都不是固定的,我们可以引入模板引擎对HTML内容进行渲染。当然这就不是本文的重点了。有兴趣的同学可以自己了解尝试下。

猜你喜欢

转载自blog.csdn.net/weixin_40851188/article/details/89945670