使用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'];
结尾
这是作者写的第一篇文章,想到什么就写了点什么,有什么不对的地方请多多包含,本文源码 地址 欢迎浏览。
笔芯