日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Nest.js寫一個定時發郵件任務?太簡單了!

來源: 責編: 時間:2024-02-05 09:33:13 217觀看
導讀概要前面幾章完成了,當日任務和長期目標的基礎模塊,現在我將要完成定時任務模塊。就像我一開始介紹的那樣,我要對我每天沒有完成的任務,或者長期目標沒有達成的情況下,發送電子郵件來提醒我。如果大家時間充裕的話,可以看下

概要

前面幾章完成了,當日任務和長期目標的基礎模塊,現在我將要完成定時任務模塊。就像我一開始介紹的那樣,我要對我每天沒有完成的任務,或者長期目標沒有達成的情況下,發送電子郵件來提醒我。5eQ28資訊網——每日最新資訊28at.com

如果大家時間充裕的話,可以看下相關的文章使用Cron Jobs和NestJS實現任務自動化[1]和通過工作隊列發送郵件[2]。重點要看下Cron Jobs,里面有對時間設置的具體說明。5eQ28資訊網——每日最新資訊28at.com

由于個人管理項目,沒有什么特別需要處理高并發的需求,所以我只寫了普通的郵件發送就足夠了,不需要通過工作隊列來處理。5eQ28資訊網——每日最新資訊28at.com

定時任務介紹

NestJS 提供了一種非常方便的方式來創建定時任務,通常用于執行周期性的后臺任務,例如數據同步、數據清理、報告生成等等。5eQ28資訊網——每日最新資訊28at.com

以下是如何在 NestJS 中創建和使用定時任務的步驟:5eQ28資訊網——每日最新資訊28at.com

  1. 安裝相關依賴:
$ pnpm install --save @nestjs/schedule
  1. 在app.module.ts中注冊定時任務:
// app.module.tsimport { Module } from '@nestjs/common';import { ScheduleModule } from '@nestjs/schedule';@Module({  imports: [    ScheduleModule.forRoot()  ],})export class AppModule {}
  1. 創建定時任務服務
import { Injectable, Logger } from '@nestjs/common';import { Cron } from '@nestjs/schedule';@Injectable()export class TasksService {  private readonly logger = new Logger(TasksService.name);  @Cron('45 * * * * *')  handleCron() {    this.logger.debug('Called when the current second is 45');  }}

詳細內容請參照官方文檔[3]。5eQ28資訊網——每日最新資訊28at.com

郵件發送

在 NestJS 中發送郵件通常涉及使用郵件發送庫,如 Nodemailer。下面是如何在 NestJS 中發送郵件的一般步驟:5eQ28資訊網——每日最新資訊28at.com

  1. 安裝 Nodemailer:

首先,你需要在你的 NestJS 項目中安裝 Nodemailer。可以使用以下命令安裝:5eQ28資訊網——每日最新資訊28at.com

$ pnpm install nodemailer
  1. 創建一個郵件服務:

在你的 NestJS 應用程序中,創建一個專門的郵件服務,該服務負責配置和發送郵件。你可以創建一個自定義的郵件服務類,也可以將郵件配置添加到現有的服務中。5eQ28資訊網——每日最新資訊28at.com

import { Injectable } from '@nestjs/common';import * as nodemailer from 'nodemailer';import { ConfigService } from '@nestjs/config';import { ConfigEnum } from './enum/config.enum';@Injectable()export class EmailService {  private transporter;  constructor(private readonly configService: ConfigService) {    const mailConfig = this.configService.get(ConfigEnum.MAIL_CONFIG);    this.transporter = nodemailer.createTransport({      host: mailConfig.host,      port: mailConfig.port,      secure: true, // 如果是 SMTPS 連接,設置為 true      auth: {        user: mailConfig.authUser,        pass: mailConfig.authPass,      },    });  }  async sendMail(to: string, subject: string, text: string): Promise<void> {    const mailOptions = {      from: this.configService.get(ConfigEnum.MAIL_CONFIG).authUser,      to,      subject,      text,    };    await this.transporter.sendMail(mailOptions);  }}

在這個示例中,我們創建了一個 EmailService,它接收郵件配置信息并初始化 Nodemailer 的傳輸器。然后,它提供了一個 sendMail 方法,用于發送郵件。5eQ28資訊網——每日最新資訊28at.com

  1. 注冊郵件服務:

將 EmailService 添加到你的 NestJS 模塊的 providers 數組中,以便在整個應用程序中使用它。5eQ28資訊網——每日最新資訊28at.com

import { Module } from '@nestjs/common';import { EmailService } from './email.service';@Module({  providers: [EmailService],  // ...})export class AppModule {}
  1. 使用郵件服務:

現在,你可以在你的控制器或其他服務中使用 EmailService 來發送郵件。例如,在你的控制器中:5eQ28資訊網——每日最新資訊28at.com

import { Controller, Get } from '@nestjs/common';import { EmailService } from './email.service';@Controller('email')export class EmailController {  constructor(private readonly emailService: EmailService) {}  @Get('send')  async sendEmail() {    try {      await this.emailService.sendMail('recipient@example.com', 'Hello', 'This is the email body.');      return 'Email sent successfully!';    } catch (error) {      return 'Email sending failed: ' + error;    }  }}

這是一個簡單的示例,說明如何在 NestJS 中發送郵件。你可以根據你的需求擴展和自定義郵件服務,以適應不同的郵件發送場景。確保你的配置信息正確,以及你的郵件服務提供了適當的錯誤處理來處理可能的發送失敗情況。5eQ28資訊網——每日最新資訊28at.com

定時任務做成

  • 首先,因為需要用到當日任務的長期目標模塊里面的方法。先導入這2個模塊
import { Module } from '@nestjs/common';import { TasksCronService } from './tasks-cron.service';import { TasksModule } from '../tasks/tasks.module';import { LongTeamGoalsModule } from '../long-team-goals/long-team-goals.module';@Module({  imports: [TasksModule, LongTeamGoalsModule],  providers: [TasksCronService],})export class TasksCronModule {}
  • 然后都要用到郵件發送,所以要在構造函數中初期化transporter。并且發送成功或者失敗,希望能在log日志中能看到,所以loggerError個loggerNomal2個函數。
import * as nodemailer from 'nodemailer';import { TasksService } from '../tasks/tasks.service';import { LongTeamGoalsService } from '../long-team-goals/long-team-goals.service';import { ConfigService } from '@nestjs/config';import { ConfigEnum } from '../enum/config.enum';import { Injectable, Logger } from '@nestjs/common';@Injectable()export class TasksCronService {  private transporter;  private readonly logger = new Logger(TasksCronService.name);  constructor(    private readonly configService: ConfigService,    private readonly tasksService: TasksService,    private readonly longsService: LongTeamGoalsService,  ) {    const MAIL_CONFIG = this.configService.get(ConfigEnum.MAIL_CONFIG);    this.transporter = nodemailer.createTransport({      host: MAIL_CONFIG.host,      port: MAIL_CONFIG.port,      secure: true,      auth: {        user: MAIL_CONFIG.authUser,        pass: MAIL_CONFIG.authPass,      },    });  }    loggerError(message: string, error?: any) {    this.logger.error(message, error);  }  loggerNomal(message: string, info?: any) {    this.logger.log(message, info);  }    // 發送郵件  async sendReminderEmail(taskTitles: string) {    const MAIL_CONFIG = this.configService.get(ConfigEnum.MAIL_CONFIG);    const mailOptions = {      from: MAIL_CONFIG.authUser,      to: MAIL_CONFIG.destUser,      subject: '您有未完成的任務',      text: `以下是您今天尚未完成的任務:/n/n${taskTitles}`,    };    this.transporter.sendMail(mailOptions, (error, info) => {      if (error) {        this.loggerError(`郵件發送失敗: ${error}`);      } else {        this.loggerNomal(`郵件已發送: ${info.response}`);      }    });  }}
  • 簡單的介紹下,項目中定時任務的內容。
  1. 每天下午17:30點,檢查當日任務里面有沒有沒完成的任務。如果有就發送電子郵件
@Cron('30 17 * * *') // 每天下午7點30分執行  async handleCron() {    this.loggerNomal('開始檢查未完成的任務');    const currentDate = dayjs().format('YYYY-MM-DD');    const startDate = currentDate;    const endDate = currentDate;    const tasks = await this.tasksService.search({      startDate,      endDate,    });    // 過濾當日任務中已完成的任務。    const incompleteTasks = tasks.data.filter((task) => !task.isCompleted);    if (incompleteTasks.length) {      const titles = incompleteTasks.map((task) => task.title).join('/n');      await this.sendReminderEmail(titles);    }  }
  1. 每天晚上22:00點,檢查長期目標里面有沒有臨近的任務還沒有完成。如果有就發送電子郵件
@Cron('0 22 * * *')  async handleLongCron() {    const nearlyExpiredGoals = await this.longsService.findNearlyExpiredGoals(      3,    );    if (nearlyExpiredGoals.length) {      const titles = nearlyExpiredGoals.map((long) => long.title).join('/n');      await this.sendReminderEmail(titles);      await this.longsService.setWarned(nearlyExpiredGoals);    }  }
  • 長期目標模塊中的方法
// 在你的目標服務中  async findNearlyExpiredGoals(days: number): Promise<any[]> {    const deadlineDate = new Date(Date.now() + days * 24 * 60 * 60 * 1000);    return this.longTermGoalModel      .find({        deadline: { $lte: deadlineDate },        isWarned: false,      })      .exec();  }

5eQ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-73796-0.htmlNest.js寫一個定時發郵件任務?太簡單了!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Vue 10 歲了!你知道它最初的名字嗎?

下一篇: 個掌握C++編程的關鍵要點

標簽:
  • 熱門焦點
  • 石頭智能洗地機A10 Plus體驗:雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機A10 Plus。從這個產品名上就不難看出,這次石頭推出的并不是常見的掃地機器
  • 六大權益!華為8月服務日開啟:手機免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務日也式開啟,到店可享六大專屬權益。華為用戶可在華為商城Ap
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的&ldquo;網紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內直播,
  • 2納米決戰2025

    集微網報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風扇版本

    據10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風扇版本。另外,這款顯卡 PCB
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 浦东新区| 莲花县| 海兴县| 浏阳市| 汨罗市| 樟树市| 庄河市| 迁安市| 台北县| 志丹县| 阜阳市| 和硕县| 尤溪县| 和政县| 本溪| 德保县| 岳普湖县| 怀宁县| 邵阳县| 耒阳市| 盐边县| 和龙市| 湘潭市| 崇左市| 金乡县| 襄城县| 将乐县| 涿鹿县| 临城县| 高尔夫| 陵水| 台山市| 大田县| 新竹市| 甘泉县| 岳西县| 馆陶县| 博爱县| 军事| 绵阳市| 广平县|