nodemailer的使用,nodejs发送邮件

2018-11-19 15:10:23

如何使用

这里就先上配置

nodejs: v6.9.4

npm: 3.10.10

nodemailer: ^4.1.0

const params = {
  host: 'smtp.163.com', // 设置服务
  port: 465, // 端口
  sercure: true, // 是否使用TLS,true,端口为465,否则其他或者568
  auth: {
    user: config.user, // 邮箱和密码
    pass: config.emailPwd
  }
}

// 邮件信息
const mailOptions = {
  from: config.user, // 发送邮箱
  to: config.emailTo, // 接受邮箱
  subject: config.title, // 标题
  html: config.html // 内容
}

// 发送邮件
const transporter = nodemailer.createTransport(params)
transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    return console.log(error);
  }
  console.log('Message %s sent: %s', info.messageId, info.response);
  // success
  // ...
})

按照这个格式,发送成功是没什么问题的。不过在密码这里要注意,不是邮箱的登录密码。

163和qq获取授权码

163邮箱的话,要开启POP3/SMTP服务,在设置 --> POP3/SMTP/IMAP页面,设置。开通后会有个授权码的,配置里的密码,就是用这个授权码

qq邮箱的话,同样也要开启这个服务,设置 --> 账户 --> POP3服务,点击开启,就会有个授权码,如果忘了记录,在开启服务下面有个“生成授权码”的,可以获取到的。

这样qq和163就能开启了

Gmail

如果是Gmail的话,这个就有点麻烦了,在nodemailer官网也有说到:

Gmail either works well or it does not work at all. It is probably easier to switch to an alternative service instead of fixing issues with Gmail. If Gmail does not work for you then don't use it.

我这里用自己的谷歌邮箱试了下,在上面的配置修改一下


const params = {
  service: 'Gmail', // 注意,host修改为service
  port: 465, // 端口
  sercure: true, // 是否使用TLS,true,端口为465,否则其他或者568
  auth: {
    user: config.user, // 邮箱和密码
    pass: config.emailPwd
  }
}


如果这样不行的话,打开这个链接,开启谷歌允许不够安全应用

如果还不行的话,就要配置谷歌的XOAuth2了

配置XOAuth2

就算使用了这种方法,也未必可能成功

这是我在网上找到的配置XOAuth2的教程

在这里创建一个凭据,选择OAuth客户端ID,应用类型选择“网页应用”,然后填写名称,重定向URI要记得填写,我填写的是这个"https://developers.google.com/oauthplayground"

图片描述

然后记录下id和密钥

进入此页面,进行配置

图片描述

填写之前的id和密钥

然后就是step1,选择api

图片描述

到step2,点击'Exchange authorization code for tokens'按钮,生成token,这样就完成了。

回到nodejs,重写下配置

const params = {
  service: 'Gmail',
  auth: {
    type: 'OAuth2',
    user: config.user,
    clientId: config.clientId,
    clientSecret: config.clientSecret,
    refreshToken: config.refreshToken,
    accessToken: config.accessToken
  }
}

我这里测试是成功的(本地服务器),如果还不成功的话,这个你只能在搜搜有什么解决方法了。

这里是官方的OAuth2配置

nodemailer其他功能

这里列出我自己用过的功能,nodemailer看官方介绍,貌似是很多功能的

发送多个用户:

// 在配置发送信息的时候const mailOptions = {
  from: config.user, // 发送邮箱
  to: config.emailTo + ', ' + config.emailTo2 // 用', '分隔}

发送html内容

const mailOptions = {
  ....  html: config.html // 这里可以是html字符串}

发送附件

可以同时发送多个

const mailOptions = {
  ...
  attachments: [{
    filename: 'test.txt',
    content: 'hello world!'
  },{
    filename: 'test.txt',
    content: 'hello world!',
    contentType: 'text/plain'
  }]
}

html 显示图片

如果直接在图片上写上图片地址,在 qq 和谷歌邮箱都是没法直接显示的。qq 邮箱有一个查看图片的按钮,点击后才能显示。

如果使用附件的形式,是可以直接显示图片的。

// 伪代码var img = require("fs").readFileSync('./images/1.jpeg')
attachments: [
  {    filename: '1.jpeg',    content: img,    cid: '00000001'
  }
]

html: `<img src='cid:00000001' />`

官方给出的配置

  • filename - filename to be reported as the name of the attached file. Use of unicode is allowed.

  • content - String, Buffer or a Stream contents for the attachment

  • path - path to the file if you want to stream the file instead of including it (better for larger attachments)

  • href – an URL to the file (data uris are allowed as well)

  • contentType - optional content type for the attachment, if not set will be derived from the filename property

  • contentDisposition - optional content disposition type for the attachment, defaults to ‘attachment’

  • cid - optional content id for using inline images in HTML message source

  • encoding - If set and content is string, then encodes the content to a Buffer using the specified encoding. Example values: ‘base64’, ‘hex’, ‘binary’ etc. Useful if you want to use binary attachments in a JSON formatted email object.

  • headers - custom headers for the attachment node. Same usage as with message headers

  • raw - is an optional special value that overrides entire contents of current mime node including mime headers. Useful if you want to prepare node contents yourself

总结

刚使用nodemailer踩了不少坑,弄了我一天,Gmail不怎么稳定,后面主管就叫换成qq了,据说qq企业邮箱发送邮件的次数比较多。这篇文章就是记录下使用nodemailer的一些经验。


  • 2017-09-11 16:34:14

    Nginx如何保留真实IP和获取前端IP

    squid,varnish以及nginx等,在做反向代理的时候,因为要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端web服务器得到的数据包的头部的源IP地址是代理服务器的IP地址,这样一来,后端服务器的程序给予IP的统计功能就没有任何意义,所以在做代理或集群的时候必须解决这个问题,这里,我以nginx做集群或代理的时候如何给后端web服务器保留(确切的说是传递)客户端的真实IP地址。

  • 2017-09-11 16:35:22

    ngx_http_realip_module使用详解

    网络上关于ngx_http_realip_module的文章千篇一律,全是在说怎么安装,最多贴一个示例配置,却没有说怎么用,为什么这么用,官网文档写得也十分简略,于是就自己探索了一下。

  • 2017-09-11 16:39:43

    基于Nginx dyups模块的站点动态上下线

    在分布式服务下,我们会用nginx做负载均衡, 业务站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一定的轮询策略,将请求路由到后端一台指定的服务器上。

  • 2017-09-13 13:49:21

    Web性能测试:工具之Siege详解

    Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力。可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。siege可以从您选择的预置列表中请求随机的URL。所以siege可用于仿真用户请求负载,而ab则不能。但不要使用siege来执行最高性能基准调校测试,这方面ab就准确很多

  • 2017-09-14 10:18:25

    15分钟成为Git专家

    不管是以前使用过 Git 还是刚开始使用这个神奇的版本控制工具的开发者,阅读了本文以后都会收获颇丰。如果你是应一名有经验的 GIT 使用者,你会更好的理解 checkout -> modify -> commit 这个过程。如果你刚开始使用 Git,本文将给你一个很好的开端。

  • 2017-09-28 16:42:57

    Linux vmstat命令实战详解

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

  • 2017-10-13 16:21:29

    Activity的四种launchMode

    launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。这里简单介绍一下task的概念,task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。