做一个定时发送邮件、企业微信机器人消息的小案例

728 阅读3分钟

我们公司的前端小组想整一个学习资金用于成员们平时购买学习资料,每位成员每月上交20元。然后由我来负责收款并整理,于是我就想弄一个自动发送收款邮件以及企业微信消息,并附上自己的收款码~

发送邮件

  • 使用 ejs 模板引擎做界面
  • 使用 node-schedule 做定时任务
  • 使用 nodemailer 做邮件插件

发送企业微信机器人消息

  • 使用 axios 调用企业微信消息 api
  • 使用 node-schedule 做定时任务

自行 npm init 新项目

安装依赖

yarn add ejs node-schedule nodemailer axios

自动发送邮件

新建 sendEmail 文件夹,写入两个文件 email.ejs (模板) email.js (代码逻辑)

email.ejs,代码就是简单的 html,我这边是写了很简单的样式

<!DOCTYPE html>
<html>
<head>
    <title>
    </title>
    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
</head>

<body style="margin:0;padding:0;">
    <div style="width:100%; margin: 40px auto;font-size:20px; color:#5f5e5e;text-align:center">
        <span>亲爱的前端同事,您好!今天是xx前端学习资金收款日,请扫描下面收款码转账20元,谢谢~</span>
    </div>
    <img src="https://jiang-1252717891.cos.ap-guangzhou.myqcloud.com/jiangCode.png" style="width:70px;height:140px;margin-top:10px;"  alt="收款码">
</body>
</html>

email.js

const nodemailer = require("nodemailer"); //发送邮件的node插件
const ejs = require("ejs"); //ejs模版引擎
const fs = require("fs"); //文件读写
const path = require("path"); //路径配置
const schedule = require("node-schedule"); //定时器任务库
//配置项

//发送者邮箱厂家
let EmianService = "163";
//发送者邮箱账户SMTP授权码
let EamilAuth = {
  user: "xxx@163.com",
  pass: "xxx",
};
//发送者昵称与邮箱地址
let EmailFrom = '"江xx" <xxx.com>';

//接收者邮箱地
let EmailTo =
  "xxx@xx.com";
//邮件主题
let EmailSubject = "前端学习资金收款通知!";

// 发动邮件
function sendMail(HtmlData) {
  const template = ejs.compile(
    fs.readFileSync(path.resolve(__dirname, "meiju.ejs"), "utf8")
  );
  const html = template(HtmlData);

  let transporter = nodemailer.createTransport({
    service: EmianService,
    port: 465,
    secureConnection: true,
    auth: EamilAuth,
  });

  let mailOptions = {
    from: EmailFrom,
    to: EmailTo,
    subject: EmailSubject,
    html: html,
  };
  transporter.sendMail(mailOptions, (error, info = {}) => {
    if (error) {
      console.log(error);
      sendMail(HtmlData); //再次发送
    }
    console.log("邮件发送成功", info.messageId);
    console.log("静等下一次发送");
  });
}

// 聚合
function getAllDataAndSendMail() {
  // 这里可以写上一些变量,在模板上可以直接使用
  // 比如加载天气啊,生日啊啥的
  let HtmlData = {};
  sendMail(HtmlData);
}

console.log("NodeMail: 开始等待目标时刻...");
let j = schedule.scheduleJob("1 1 10 5 * *", function () {
  console.log("执行任务");
  getAllDataAndSendMail();
});

执行:node sendEmail/email.js

在你指定的时间点就会定时发送邮件了,如何设置定时时间请查阅官方地址:node-schedule 的操作官网,我上面设置的就是每月的5号,早上十点1分1秒,定时发送

定时发送企业微信消息

sendMessage/message.js

// 发送企业微信消息
const schedule = require("node-schedule"); //定时器任务库
const axios = require("axios");

function setMessage() {
  axios
    .post(
      "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx",
      {
        msgtype: "news",
        news: {
          articles: [
            {
              title: "美居前端学习资金收款通知~",
              description: "请点击图片扫码支付学习资金20元",
              url: "https://jiang-1252717891.cos.ap-guangzhou.myqcloud.com/jiangCode.png",
              picurl:
                "https://jiang-1252717891.cos.ap-guangzhou.myqcloud.com/jiangCode.png",
            },
          ],
        },
      }
    )
    .then((response) => {
      console.log(response.data);
    })
    .catch((error) => {
      console.log(error);
    });
}
console.log("开始等待目标时刻...");
let j = schedule.scheduleJob("1 1 10 5 * *", function () {
  console.log("执行任务");
  setMessage();
});

执行:node sendMessage/message.js

这个就比较简单了,就是直接调用企业微信机器人消息 api,再加个定时任务即可。到点就会发送企业微信机器人消息。 企业微信机器人文档

让代码自动永久运行?

  1. 可以使用腾讯云的云函数
  2. 把代码放到服务器后,使用 forever。这个是我目前使用的方案,网上百度一下很多教程,也很简单。

项目地址