社区/学习指南/微信云开发高级教程

云函数发邮件

借助于第三方模块 Nodemailer,我们还可以实现使用云函数来发邮件。结合发邮件的功能,我们可以在用户注册了用户,或者评论有人回复,有重要的活动信息需要通知时发送邮件通知用户。用云函数这全套用户通知的流程实现起来也很简单。

技术文档:Nodemailer Github 地址Nodemailer 官方文档

11.5.1 用云函数发邮件

1、开启 SMTP 服务

自己搭建邮件服务器是非常麻烦的,我们可以借助于 QQ 邮箱、Gmail、163 个人邮件系统或企业邮件系统开启IMAP/SMTP 服务,IMAP 是互联网邮件访问协议,通过这种协议可以从邮件服务器获取邮件的信息、下载邮件,也就是接收邮件;SMTP 也就是简单邮件传输协议,通过它可以控制邮件的中转方式,帮助计算机在发送或中转信件时找到下一个目的地,也就是发送邮件。这里我们只介绍如何使用云函数来发送邮件,所使用的就主要是 smtp 服务。

不同的邮件系统有着不同的 smtp 发送邮件服务器,端口号也会有所不同,这些都可以去相应的邮箱的设置里看到相关的说明的,这里仅以 QQ 邮箱为例,登录 QQ 邮箱,在邮件设置-账户开启 SMTP 服务,QQ 邮箱的发送邮件服务器:smtp.qq.com,使用 SSL,端口号 465 或 587。

QQ 开启 SMTP 服务之后会获取到邮件授权码(邮件授权码不是邮箱密码),这个后面会用得到。

2、使用云函数发送邮件

使用开发者工具创建一个云函数,比如 nodemail,然后在 package.json增加nodemailer 最新版 latest 的依赖,并右键云函数目录选择在终端中打开输入命令 npm install 安装依赖:


"dependencies": {

    "nodemailer": "latest"

  }

然后再在 index.js 里输入以下代码,并根据你的实际情况来修改一下里面的参数,如:

  • auth 里面的邮箱账号和邮箱密码(不同的邮件系统可能机制不一样,QQ 邮箱为邮箱授权码

  • message 里面的 from 和 to 参数,分别为你的发件邮箱以及收件方的邮箱地址,你还可以填写 cc 和 bcc,抄送或密送给指定邮箱;

  • host、port,这里为 QQ 邮箱的 SMTP 服务器地址和相应的端口,你如果使用的是其他邮件系统的,要注意修改;

  • nodemailer 支持发送 text 文字内容、html 网页内容以及附件的形式,附件的格式支持 String、Buffer 或 Stream(各种文件),不过文件大小不同的邮箱是有限制的,也不宜过大,会影响云函数执行时间,建议大文件使用云存储链接;

const cloud = require("wx-server-sdk");

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV,
});

exports.main = async (event, context) => {
  const nodemailer = require("nodemailer");

  let transporter = nodemailer.createTransport({
    host: "smtp.qq.com", //SMTP服务器地址

    port: 465, //端口号,通常为465,587,25,不同的邮件客户端端口号可能不一样

    secure: true, //如果端口是465,就为true;如果是587、25,就填false

    auth: {
      user: "3441****02@qq.com", //你的邮箱账号

      pass: "你的QQ邮箱授权码", //邮箱密码,QQ的需要是独立授权码,不是QQ邮箱的密码
    },
  });

  let message = {
    from: "来自李东bbsky <888888@qq.com>", //你的发件邮箱

    to: "你要发送给谁", //你要发给谁

    // cc:'',  支持cc 抄送

    // bcc: '', 支持bcc 密送

    subject: "欢迎大家参与云开发技术训练营活动",

    //支持text纯文字,html代码

    text: "欢迎大家",

    html:
      '<p><b>你好:</b><img src="https://hackwork-1251009918.cos.ap-shanghai.myqcloud.com/handbook/html5/weapp.jpg"/></p>' +
      "<p>欢迎欢迎<br/></p>",

    attachments: [
      //支持多种附件形式,可以是String, Buffer或Stream

      {
        filename: "image.png",

        content: Buffer.from(
          "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/" +
            "//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U" +
            "g9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC",

          "base64"
        ),
      },
    ],
  };

  let res = await transporter.sendMail(message);

  return res;
};

部署上传云函数之后,在小程序端或者云开发控制台调用该云函数就能收到邮件啦,这个只是定向给某个发送邮件,只适合发给管理员进行邮件通知的场景。

15.5.2 邮箱功能的拓展与应用

尽管邮件已经没落,但是邮箱几乎是所有互联网用户都会使用的一个互联网产品,用云函数结合邮件的发送可以拓展和传统的后端一样的发送邮件的能力。

结合云数据库给指定的人发邮件

当用户在小程序端进行一些业务操作时,我们可以结合数据库定向给该用户或目标用户发邮件,比如用户绑定注册或找回密码,当用户 A 给用户 B 写的文章或留言评论时可以给 B 发邮件,当用户参与活动需要通知时,管理员可以给目标用户发邮件等。不同的业务场景接收邮件的人也会不同,邮件里面的内容根据业务的需求也会有所不同,因此在邮件发送的过程中,数据库扮演着非常重要的角色。

不过由于 QQ 邮箱是个人邮件系统,每天只能发送几百封邮件,不太适合用户量比较大的小程序作为企业业务来进行邮件的发送。

实现密码校验与邮件的定时发送

当用户在个人资料里绑定自己的邮箱时,可以发送邮件以及校验码,校验码可以是数据库的一个字段,它的值可以是一些随机生成的字符串,但是有一定的生命周期,比如半个小时之后会失效,这个自动失效的操作则需要使用到定时触发器;邮件也可以是周报、日报的周期性定时发送,在每天或每周的某个时间点,批量收集当天或当周的数据自动发送给用户,这个也是依赖定时触发器,这个我们会在后面定时触发器的章节进行说明。

本文出自 李东bbsky