Node发送电子邮件

Dreamer 发布于2017-06-20 收录于 后端开发 约2041字 预计阅读 5 分钟
目录

电子邮件作为最广泛使用的一种网络服务和我们的工作学习生活已经密不可分。接受信用卡的账单,注册网站,找回密码等等都需要用到它。今天在就来学习下如何在node下来发送邮件,为当前做的项目提供邮箱校验的功能。

邮箱校验的原理:当我们在xxx网站注册的时候,注册信息中一般都会要求你填一个邮箱(作用:1、当着登录的用户账号,2、找回密码),当你注册成功后系统就会向你填写的邮箱中发送一封带有特殊链接的邮件,要求你打开你的邮件去点击,当你进入邮箱点击连接系统就会接受到一个get请求从而验证邮箱是你本人的。

node发送邮件已经有一些第三方的组件,这里我使用nodemailer这个带三方组件来发邮件,如果不使用封装好的第三方组件自己写的话需要去熟悉和研究复杂的邮件协议来实现,如果要开发一个邮件服务那么这是必要的,但是一个小小的邮件验证我觉得这是非必要的。

创建本次邮箱校验demo使用的数据库的表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(20) NOT NULL COMMENT '用户名',
  `password` varchar(255) NOT NULL COMMENT '用户密码',
  `email` varchar(255) NOT NULL COMMENT '邮箱',
  `code` varchar(255) NOT NULL COMMENT '邮箱验证使用的code',
  `email_state` int(2) NOT NULL COMMENT '邮箱验证状态。 0:未验证,1:已验证',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这就是本次邮箱校验demo中用到的用户信息表,其实还应该有一张表存放每次发送邮箱验证时候生成的一些数据,比如code,过期时间等,在这里我就不校验邮件的过期时间了,code也直接放在用户信息表中了,如果你在正式系统中请新建一张表或者在缓存中来存放每次发送邮件生成的临时数据。

nodemailder介绍及其使用

特性列表

  • 不依赖于其它模块
  • 支持unicode编码,包括emoji表情
  • 支持windows系统
  • 邮件内容支持纯文本和html
  • 支持添加附件
  • 邮件内容如果是html还可以插入图片
  • 支持除了默认SMTP协议外的其它传输协议
  • 使用TLS / STARTTLS安全电子邮件传递
  • SMTP连接代理
  • 健全的oauth2认证
  • DKIM消息签名
  • 自定义插件支持处理消息
  • 支持es6语法

详细文档nodemailer官方地址

nodemailer配置

通过npm install nodemailer --save安装这个模块到项目。当前的nodemailer的版本是4.0.1

nodemailer使用

使用nodemailer发送一封邮件大概需要4步

1、在文件中引入nodemailer

1
	const nodemailer = require('nodemailer');

2、创建一个传输对象

1
2
3
4
5
6
7
8
9
	let transporter = nodemailer.createTransport({
	    host: 'smtp.163.com',
	    port: 465,
	    secure: true,
	    auth: {
		user: 'username@163.com', //邮箱的账号
		pass: 'userpass'//邮箱的密码
	    }
	});

3、设置电子邮件

1
2
3
4
5
6
7
	let mailOptions = {
	    from: '"Fred Foo 👻" <username@163.com>', //邮件来源
	    to: 'username@qq.com', //邮件发送到哪里,多个邮箱使用逗号隔开
	    subject: 'Hello ✔', // 邮件主题
	    text: 'Hello world ?', // 存文本类型的邮件正文
	    html: '<b>Hello world ?</b>' // html类型的邮件正文
	};

4、使用第二步定义的传输对象发送邮件

1
2
3
4
5
6
	transporter.sendMail(mailOptions, (error, info) => {
	    if (error) {
		return console.log(error);
	    }
	    console.log('Message %s sent: %s', info.messageId, info.response);
	});

发送带有附件的邮件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
	let mailOptions = {
	    from: '"Fred Foo 👻" <username@163.com>', //邮件来源
	    to: 'username@qq.com', //邮件发送到哪里,多个邮箱使用逗号隔开
	    subject: 'Hello ✔', // 邮件主题
	    html: '<b>Hello world ?</b>', // html类型的邮件正文
	    attachments: [ //附件数组
		{
		    filename: 'text.txt',//附件名称
		    path: './text.txt'//附件的位置
		}
	    ]
	};

发送正文中带有图片的邮件

设置邮件的正文的类型为html类型,图片还是按照附件的方式发送,只不过比发送附件多了一个cid,然后将正文图片的src值指向attachments对象中的cid的值就可以了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
	let mailOptions = {
	    from: '"Fred Foo 👻" <username@163.com>', //邮件来源
	    to: 'username@qq.com', //邮件发送到哪里,多个邮箱使用逗号隔开
	    subject: 'Hello ✔', // 邮件主题
	    html: '<b>Hello world ?<img src="cid:123456789"/></b>', // html类型的邮件正文
	    attachments: [
		{
		    filename: 'a.jpg',//附件名称
		    path: './a.jpg',//附件的位置
		    cid: '123456789' //为附件添加一个引用名称
		}
	    ]
	};

邮箱检验的demo

知道了邮箱校验的原理和知道怎么通过node来发送邮件,代码其实就简单多了,博客中就不粘贴具体的代码了,如果需要代码请在node+express实现邮箱检验查看。

密码找回

邮箱校验其实是为了找回密码服务的,而且他们的原理其实都差不多:很长一段时间当你打开一个以前注册的网站去登录的时候发现密码忘记了,点击了密码找回功能,系统会提示让输入一个注册邮箱或者用户名,然后会向这个邮箱发送一封带有特殊链接的邮件,让你登录邮箱去验证,成功登录邮箱并且点击连接就会跳转到一个重置密码的页面让你修改密码,修改成功就可以通过新密码登录系统了。(温馨提示:如果找回密码的时候网站直接把你以前的密码给你了,那么这个网站相对来说不安全,谨慎使用!)

后记

本文主要介绍了nodemailer的一些特性和基本使用方法和一些发邮件在具体项目中的应用,通过nodemailer我们也可以快速的开发一个简单的邮件发送客户端。


Dreamer
WRITTEN BY
Dreamer
Web Developer Love Photography and Cooking