找回密码
 立即注册
首页 业界区 业界 Express实现定时发送邮件

Express实现定时发送邮件

飧沾 2025-6-6 09:43:26
在开发中我们有时候需要每隔 一段时间发送一次电子邮件,或者在某个特定的时间进行发送邮件
无需手动去操作,基于这样的情况下我们需要用到了定时任务,一般可以写个定时器,来完成相应的需求,在 node.js 中自已实现也非常容易,接下来要介绍的是node-schedule来完成定时任务
用express.js实现 每个星期三中午12点 发送邮件给某个用户

1.安装第三方库 Node Schedule、nodemailer
npm i -s node-schedule nodemailer
2.新建一个 TaskScheduler 定时任务类
  1. // 引入 node-schedule 模块
  2. const schedule = require('node-schedule');
  3. /*
  4. * TODO:编写 Cron 表达式时,有五个占位符可以使用,分别表示分钟、小时、日期、月份和星期几。
  5. *      每个占位符可以使用特定的值、值范围、逗号分隔的值列表和通配符等等
  6. *
  7. *       * * * * * *
  8. *       | | | | | |
  9. *       | | | | | day of week
  10. *       | | | | month
  11. *       | | | day of month
  12. *       | | hour
  13. *       | minute
  14. *       second ( optional )
  15. *
  16. *      示例 Cron 表达式:
  17. *           每分钟的第30秒触发: 30 * * * * *
  18. *           每小时的1分30秒触发 :30 1 * * * *
  19. *           每天的凌晨1点1分30秒触发 :30 1 1 * * *
  20. *           每月的1日1点1分30秒触发 :30 1 1 1 * *
  21. *           每年的1月1日1点1分30秒触发 :30 1 1 1 1 *
  22. *           每周1的1点1分30秒触发 :30 1 1 * * 1
  23. * */
  24. // 创建一个任务调度器类
  25. class TaskScheduler {
  26.     // 构造函数,接受 cron 表达式和要执行的任务作为参数
  27.     constructor(cronExpression, task) {
  28.         // 将传入的 cron 表达式和任务保存为成员变量
  29.         this.cronExpression = cronExpression;
  30.         this.task = task;
  31.         // 初始化 job 为 null
  32.         this.job = null;
  33.     }
  34.     // 启动任务
  35.     start() {
  36.         // 如果当前没有正在运行的任务,则创建新的任务
  37.         if (!this.job) {
  38.             this.job = schedule.scheduleJob(this.cronExpression, this.task);
  39.             console.log(`定时任务启动: ${this.cronExpression}`);
  40.         }
  41.     }
  42.     // 停止任务
  43.     stop() {
  44.         // 如果当前有正在运行的任务,则取消任务并将 job 设为 null
  45.         if (this.job) {
  46.             this.job.cancel();
  47.             console.log(`定时任务停止: ${this.cronExpression}`);
  48.             this.job = null;
  49.         }
  50.     }
  51. }
  52. // 导出任务调度器类
  53. module.exports = TaskScheduler;
复制代码
3.创建一个发送邮件的方法
  1. const nodemailer = require("nodemailer");
  2. /**
  3. * 邮箱发送
  4. *
  5. * @param  {string}  to 对方邮箱
  6. * @param  {string}  content 发送内容
  7. */
  8. // 创建Nodemailer传输器 SMTP 或者 其他 运输机制
  9. let transporter = nodemailer.createTransport(
  10.     {
  11.         service: 'QQ', // 使用内置传输发送邮件 查看支持列表:https://nodemailer.com/smtp/well-known/
  12.         port: 465, // SMTP 端口
  13.         secureConnection: true, // 使用 SSL
  14.         auth: {
  15.             user: '1840354092@qq.com', // 发送方邮箱的账号
  16.             pass: '******', // 邮箱授权密码
  17.         }
  18.     }
  19. );
  20. exports.send = (to, content) => {
  21.     return new Promise((resolve, reject) => {
  22.         transporter.sendMail({
  23.             from: `"ZY.API" <1840354092@qq.com>`, // 发送方邮箱的账号
  24.             to: to, // 邮箱接受者的账号
  25.             subject: "Welcome to ZY.API", // Subject line
  26.             // text: '"MG'Blog ?"', // 文本内容
  27.             html: `
  28.         <img src="http://www.zhouyi.run:3001/api/v1/files/preview?p=pexels-photo-276452.jpeg&&mimetype=image/jpeg" alt=""   />
  29.         <p >??? ZY.API</p>
  30.         <p >${content}</p>
  31.         <p >确认</p>
  32.         <p >祝您工作顺利,心想事成</p>`
  33.         }, (error, info) => {
  34.             if (error) {
  35.                 reject(error)
  36.             }
  37.             resolve(info)
  38.         });
  39.     })
  40. }
复制代码
4.创建一个 每个星期三中午12点 发送邮件的任务实例并且引入发送邮件的方法
  1. const TaskScheduler = require('./TaskScheduler')
  2. const {send} = require('../../utils/utils.mailer')
  3. const task = async function () {
  4.     await send('1840354092@qq.com', '每个星期三中午12点 发送邮件')
  5.     return console.log('允许定时任务每个星期三中午12点 发送邮件...' + new Date().getMinutes() + "-" + new Date().getSeconds());
  6. };
  7. // 创建一个 每个星期三中午12点 发送邮件
  8. module.exports = new TaskScheduler('0 0 12 ? * WED', task);
复制代码
5.路由使用该定时发送邮件类
  1. /**
  2. *@author ZY
  3. *@date 2023/4/10
  4. *@Description:任务相关的接口
  5. */
  6. const express = require('express');
  7. const router = express.Router();
  8. const SendEmail = require('../../scheduler/task/SendEmail')
  9. /****************************************************************************/
  10. /**
  11. * 开始发送邮件定时任务
  12. * @route GET /v1/task/startSendEmail
  13. * @group 定时任务 - 定时任务相关
  14. * @returns {object} 200 - {"status": 1,"message": "登录成功.","data": {...},"time": 1680598858753}
  15. * @returns {Error}  default - Unexpected error
  16. */
  17. router.get('/startSendEmail', function (req, res) {
  18.     //用户的定时任务开始
  19.     SendEmail.start();
  20.     res.send('用户的定时任务开始!');
  21. });
  22. /**
  23. * 停止发送邮件定时任务
  24. * @route GET /v1/task/stopSendEmail
  25. * @group 定时任务 - 定时任务相关
  26. * @returns {object} 200 - {"status": 1,"message": "登录成功.","data": {...},"time": 1680598858753}
  27. * @returns {Error}  default - Unexpected error
  28. */
  29. router.get('/stopSendEmail', function (req, res) {
  30.     SendEmail.stop();
  31.     res.send('用户的定时任务开始!');
  32. });
  33. module.exports = router;
复制代码
6.到这里差不多就可以开始定时任务和停止定时任务了,我这里是设置30秒发一次邮件
2.png

3.jpeg

✨狂点这里查看完整项目代码

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册