基于Nodejs实现服务器端发送Email

1,333 阅读3分钟

帅华君想在自己的个站实现一个功能,就是当用户订阅我的个站或个站的某个板块后,会定期向用户邮箱推送我的个站近期发布的最新资讯,包括文章、音、视频、涂鸦等推送。

POP3/SMTP服务

开启服务

以qq邮箱为例:

登录QQ邮箱 -> 设置 -> 账户 -> 开启POP3/SMTP服务

其它邮箱(如163邮箱等)开启该POP3/SMTP服务的位置大同小异,请各位自行查找。

获取授权码

开启POP3/SMTP服务后,为了安全起见,邮件服务提供商会提醒您获取授权码(通过短信验证等方式获取授权码),此授权码常用于登录第三方邮件收发平台,而我们使用Nodejs实现的邮件发送功能很想第三方邮件发送平台,所以在后续配置我们自己的服务是需要将密码设置为授权码。

获取到授权码后,请保存起来以便后续在配置中使用。

EmailJS库

每当你突发奇想要实现某个功能时,涉及到的技术可以将其凝练为关键词在 npm 与 github 查询,就会搜索到许许多多现成的第三方库或框架,通过研究是否能满足需求及其他顾虑,最终选取搜索结果中最优的哪一个,当然,如果没有满意的,完全可以自己写一个库,发布到npm或者到github开源以造福更多开发者。

emailjs 就是我通过以上脑回路搜索到的一个发送Email的第三方库,觉得它能基本满足我的需求,就直接拿来使用了。

安装

npm install emailjs

功能

  • works with SSL and TLS smtp servers
  • supports smtp authentication (‘PLAIN’, ‘LOGIN’, ‘CRAM-MD5’, ‘XOAUTH2’)
  • emails are queued and the queue is sent asynchronously
  • supports sending html emails and emails with multiple attachments (MIME)
  • attachments can be added as strings, streams or file paths
  • supports utf-8 headers and body

小试牛刀


const email = require('emailjs')
var server = email.server.connect({
    user: "1210770273@qq.com", // 开启POP3/SMTP服务的邮箱
    password: "...", // 授权码填在这里
    host: "smtp.qq.com", // 这里以QQ邮箱为例
    ssl: true, // 开启SSL
})
var message = {
  from: "<1210770273@qq.com>", // 发送方邮件地址 
  to: "...", // 接受方邮件地址,多个接收方用英文逗号分隔即可
  subject: "填写邮件主题",
  text: "这里是纯文本邮件内容",
}

MJML

mjml 库帮助开发者快速生成用于邮件模版的HTML代码,同样可以在npm中搜索到。

安装

npm install mjml

小试牛刀

下方示例代码结合 emailjsmjml 两个库实现了简单的生成HTML模版并发送邮件的功能。

const email = require('emailjs')
const mjml2html = require('mjml')
const path = require('path')

const htmlOutput = mjml2html(`
  <mjml>
    <mj-body>
      <mj-raw>
        Hello World!<img src='cid:my-image'>
      </mj-raw>
    </mj-body>
  </mjml>
`, {
  keepComments: false,
  beautify: false,
  minify: true,
})
// 上方mjml模版中img元素的src引用了下方邮件附件

var server = email.server.connect({
    user: "...", // 开启POP3/SMTP服务的邮件地址
    password: "...", // 授权码填这里
    host: "smtp.qq.com", // 以QQ邮件为例
    ssl: true, // 开启SSL
})

var message = {
  from: "...", // 发送方邮件地址
  to: "...", // 接收方邮件地址
  subject: "邮件主题",
  attachment: [
    {
      data: htmlOutput.html, // HTML代码
      alternative: true
    },
    {
      path: "...", // 图片附件
      type: "image/jpg", // 附件MIME类型
      headers: {
        "Content-ID": "<my-image>" // 在HTML代码中绑定图片元素src属性
      },
  ],
}

server.send(message, (err, message) => {
  console.log(err || message)
})

本文介绍如何开启POP3/SMTP服务并取得授权码。随后介绍emailjs库的基本使用方法,您还可以从npm中搜索其它适用于Nodejs服务环境下发送邮件的第三方库。最后结合第三方邮件模版解析库mjml发送一封包含自定义HTML内容的邮件,此外还介绍了在邮件中插入富媒体的方法。

本文完,感谢阅读