Node实现每天定时推送天气邮件程序

1,932 阅读2分钟

使用node实现每天推送一封天气邮件,效果图如下:


文件目录

├─index.js // 开启node程序
├─package.json // 
├─README.md // 
├─yarn.lock //
├─views
|   └email.ejs // 邮件模板
├─utils
|   ├─http.js // 数据请求
|   ├─receiver.js // 邮件接收者js
|   ├─schedule.js // 定时任务
|   ├─sendEmail.js // 发送邮件函数
|   └weather.js // 获取天气预报

实现步骤

  • 获取天气预报
  • 发送邮件
  • 开启一个定时任务

获取天气预报

这里使用的是阿里的天气预报接口,购买免费的天气预报接口后,你会得到一个APPCODE,在请求的接口的时候在 请求header带上你的APPCODE

// weather.js
const axios = require('axios');

const http = axios.create({
  baseURL: 'http://jisutqybmf.market.alicloudapi.com',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
    Authorization: 'APPCODE 你的APPCODE',
  },
});
async function fetchWeather() {
  return http.get(`/weather/query?city=${encodeURIComponent('重庆')}`);
}

关于天气接口更多详情查看地址

发送邮件

要实现邮件发送需要借助 nodemailer 模块,nodemailer可以直接发送文本形式的字符串数据,也可以发送HTML模板,我使用的是配合ejs模板,发送HTML。使用模块时需要注意的是需要借助SMTP授权码来登录你的邮箱发送邮件,可以到邮箱设置下面获取你的授权码

// sendEmail.js
const nodemailer = require('nodemailer');
const ejs = require('ejs');
const fs = require('fs');

function sendEmail(email, data) {
  const template = ejs.compile(
    fs.readFileSync(path.resolve(__dirname, '../views/email.ejs'), 'utf8')
  );

  const html = template(data);

  let transporter = nodemailer.createTransport({
    service: 'qq', // 发送者的邮箱厂商,支持列表:https://nodemailer.com/smtp/well-known/
    port: 25, // SMTP 端口
    secureConnection: true, // SSL安全链接
    auth: {
      //发送者的账户密码
      user: '491548306@qq.com', // 账户
      pass: '**********', // smtp授权码,到邮箱设置下获取
    },
  });

  let mailOptions = {
    from: 'Ming <491548306@qq.com>', // 发送者昵称和地址
    to: email, // 接收者的邮箱地址
    subject: '一封暖暖的小邮件', // 邮件主题
    // text: ``, //邮件的text
    html: html, //也可以用html发送
  };

  //发送邮件
  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      return console.log(error);
    }
    console.log('邮件发送成功 ID:', info.messageId);
  });
}

module.exports = sendEmail;

开启一个定时任务

开启一个定时任务,实现在服务启动后每天定时推送。node-schedule 模块能很好的实现一个定时任务。

// 开启一个定时任务
const schedule = require('node-schedule');
function job(fn) {
  // 定义规则, 这里的规则是每天早上06:50 执行fn函数参数
  let rule = new schedule.RecurrenceRule();
  rule.dayOfWeek = [0, new schedule.Range(1, 6)];
  rule.hour = 6;
  rule.minute = 50;
  // 启动任务
  let task = schedule.scheduleJob(rule, function () {
    fn();
  });
}
// 在服务启动后,执行定时任务
app.listen(1212, function () {
  console.log(`服务已启动`);
  job(function temp() {
    getData().then((res) => {
      // 遍历需要接受的邮箱数组
     for (const item of receiver) {
        sendEmail(item, res);
      }
    });
  });
});

这里需要谁接受邮件在utils/receiver.js 导出的数组里面添加上需要接受的邮箱即可

// receiver.js
module.exports = ['XXXXX@qq.com', 'XXXX@163.com'];

结尾

这是作者写的第一篇文章,想到什么就写了点什么,有什么不对的地方请多多包含,本文源码 地址 欢迎浏览。
笔芯