在开发中我们有时候需要每隔 一段时间发送一次电子邮件,或者在某个特定的时间进行发送邮件,
无需手动去操作,基于这样的情况下我们需要用到了定时任务,一般可以写个定时器,来完成相应的需求,在 node.js 中自已实现也非常容易,接下来要介绍的是node-schedule来完成定时任务
用express.js实现 每个星期三中午12点 发送邮件给某个用户
1.安装第三方库 Node Schedule、nodemailer
npm i -s node-schedule nodemailer
2.新建一个 TaskScheduler 定时任务类
const schedule = require('node-schedule');
class TaskScheduler { constructor(cronExpression, task) { this.cronExpression = cronExpression; this.task = task; this.job = null; }
start() { if (!this.job) { this.job = schedule.scheduleJob(this.cronExpression, this.task); console.log(`定时任务启动: ${this.cronExpression}`); } }
stop() { if (this.job) { this.job.cancel(); console.log(`定时任务停止: ${this.cronExpression}`); this.job = null; } } }
module.exports = TaskScheduler;
|
3.创建一个发送邮件的方法
const nodemailer = require("nodemailer");
let transporter = nodemailer.createTransport( { service: 'QQ', port: 465, secureConnection: true, auth: { user: '1840354092@qq.com', pass: '******', } } );
exports.send = (to, content) => { return new Promise((resolve, reject) => { transporter.sendMail({ from: `"ZY.API" <1840354092@qq.com>`, to: to, subject: "Welcome to ZY.API", html: ` <img src="http://www.zhouyi.run:3001/api/v1/files/preview?p=pexels-photo-276452.jpeg&&mimetype=image/jpeg" alt="" style="height:auto;display:block;" /> <p >??? <a href="http://www.zhouyi.run/#/">ZY.API</a></p> <p style="font-weight: bold">${content}</p> <p ><a style="font-size: 18px;font-weight: bolder" href="http://www.zhouyi.run/#/">确认</a></p> <p style="text-indent: 2em;">祝您工作顺利,心想事成</p>` }, (error, info) => { if (error) { reject(error) } resolve(info) }); }) }
|
4.创建一个 每个星期三中午12点 发送邮件的任务实例并且引入发送邮件的方法
const TaskScheduler = require('./TaskScheduler') const {send} = require('../../utils/utils.mailer')
const task = async function () { await send('1840354092@qq.com', '每个星期三中午12点 发送邮件') return console.log('允许定时任务每个星期三中午12点 发送邮件...' + new Date().getMinutes() + "-" + new Date().getSeconds()); };
module.exports = new TaskScheduler('0 0 12 ? * WED', task);
|
5.路由使用该定时发送邮件类
const express = require('express'); const router = express.Router(); const SendEmail = require('../../scheduler/task/SendEmail')
router.get('/startSendEmail', function (req, res) { SendEmail.start(); res.send('用户的定时任务开始!'); });
router.get('/stopSendEmail', function (req, res) { SendEmail.stop(); res.send('用户的定时任务开始!'); });
module.exports = router;
|
6.到这里差不多就可以开始定时任务和停止定时任务了,我这里是设置30秒发一次邮件
![image.png](http://zhouyi.run:5222/api/public/admin/getFiles?id=d37170f4f9c53a151212801e496e48eb.png&&mimetype=image/png)
![e747763d0a54354115cc9b00fda0f34.jpg](http://zhouyi.run:5222/api/public/admin/getFiles?id=170145f7aca5138d97f2d4e8d5f35b17.jpg&&mimetype=image/jpeg)
✨狂点这里查看完整项目代码