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

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

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

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

概要

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

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

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

定時任務介紹

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

以下是如何在 NestJS 中創建和使用定時任務的步驟:mrU28資訊網——每日最新資訊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]。mrU28資訊網——每日最新資訊28at.com

郵件發送

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

  1. 安裝 Nodemailer:

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

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

在你的 NestJS 應用程序中,創建一個專門的郵件服務,該服務負責配置和發送郵件。你可以創建一個自定義的郵件服務類,也可以將郵件配置添加到現有的服務中。mrU28資訊網——每日最新資訊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 方法,用于發送郵件。mrU28資訊網——每日最新資訊28at.com

  1. 注冊郵件服務:

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

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

現在,你可以在你的控制器或其他服務中使用 EmailService 來發送郵件。例如,在你的控制器中:mrU28資訊網——每日最新資訊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 中發送郵件。你可以根據你的需求擴展和自定義郵件服務,以適應不同的郵件發送場景。確保你的配置信息正確,以及你的郵件服務提供了適當的錯誤處理來處理可能的發送失敗情況。mrU28資訊網——每日最新資訊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();  }

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

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

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

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

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

標簽:
  • 熱門焦點
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz&ldquo;難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?&rdquo;這一番話,出自百合網聯合創
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • 信通院:小米、華為等11家應用商店基本完成APP簽名及驗簽工作

    中國信通院表示,目前,小米、華為、OPPO、vivo、360手機助手、百度手機助手、應用寶、豌豆莢和努比亞等9家應用商店,以及抖音和快手2家新型應用分發平
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發布的朋友圈
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統和圖形事業部總經理 表示,Xe-HP“ Arctic Sound” 系列服務器 GPU 已經應用于 oneAPI devcloud 云服
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲一区三区视频在线观看| 一区久久精品| 欧美日韩成人综合| 欧美日韩一区二区三区在线视频 | 亚洲二区视频| 亚洲精品一区二区在线| 亚洲午夜视频在线| 欧美在线免费观看| 免费在线日韩av| 国产精品国产三级国产专播品爱网 | 校园激情久久| 免费久久99精品国产自在现线| 欧美日韩在线观看视频| 国产在线高清精品| 亚洲片国产一区一级在线观看| 亚洲一区精品视频| 噜噜噜91成人网| 国产精品久久二区| 国产一区二区三区四区五区美女| 亚洲日本久久| 校园春色国产精品| 欧美精品一区二区视频| 国产日本欧美一区二区三区| 亚洲欧洲一区二区天堂久久| 欧美亚洲免费高清在线观看| 欧美激情在线| 国产综合av| 亚洲视频视频在线| 美日韩精品视频免费看| 国产精品日韩欧美| 亚洲欧洲日本在线| 久久er精品视频| 欧美日韩在线观看一区二区三区| 国产区二精品视| 99国产麻豆精品| 老司机午夜精品视频| 国产精品视频不卡| 99国产精品久久| 麻豆成人小视频| 国产日韩三区| 亚洲视频一区二区免费在线观看| 美女被久久久| 国产一区二区三区自拍| 亚洲一区二区成人在线观看| 欧美国产日韩在线| 精品成人一区二区三区四区| 午夜综合激情| 国产精品久久久久77777| 亚洲日本va午夜在线影院| 久久久999精品免费| 国产精品久久久久一区二区三区共| 亚洲激情另类| 久久亚洲一区二区三区四区| 国产日韩一区二区三区| 亚洲一区二区三区在线播放| 欧美噜噜久久久xxx| 在线观看一区二区精品视频| 亚洲免费影院| 国产精品成人免费精品自在线观看| 亚洲精品免费网站| 免费一级欧美片在线播放| 在线观看成人一级片| 欧美中文字幕在线视频| 国产精品私拍pans大尺度在线| 一本久道综合久久精品| 欧美精品日韩一本| 亚洲黄色免费电影| 欧美a级在线| 亚洲第一福利社区| 久久资源在线| 在线观看的日韩av| 久久在线91| 在线欧美日韩国产| 免费成人在线视频网站| 在线成人中文字幕| 蜜臀99久久精品久久久久久软件 | 亚洲美女av黄| 欧美理论电影在线观看| 日韩一二三区视频| 欧美日韩在线播放| 亚洲一区二区日本| 国产精品婷婷| 久久本道综合色狠狠五月| 国产丝袜一区二区三区| 欧美一级网站| 国外成人免费视频| 久久亚洲国产成人| 亚洲国产91精品在线观看| 美女黄毛**国产精品啪啪| 亚洲电影有码| 欧美日本韩国在线| 中文欧美字幕免费| 国产精品免费一区二区三区在线观看| 亚洲在线视频一区| 国产日韩欧美在线看| 久久久精品欧美丰满| 亚洲电影在线观看| 欧美男人的天堂| 亚洲一区二区精品视频| 国产麻豆视频精品| 久久综合中文色婷婷| 亚洲国产小视频| 欧美日韩高清在线一区| 亚洲一区一卡| 国产综合婷婷| 欧美韩日亚洲| 亚洲中午字幕| 一区二区三区在线免费观看| 欧美成人一品| 亚洲一级特黄| 国产综合视频在线观看| 欧美成人中文| 亚洲一区免费在线观看| 韩国精品在线观看| 欧美精品国产| 午夜在线视频观看日韩17c| 国外精品视频| 欧美精品在线一区二区三区| 亚洲一区视频在线观看视频| 国产亚洲欧美一区二区| 欧美成人免费网站| 亚洲一区在线免费| 一区二区在线观看视频| 欧美人成在线视频| 性做久久久久久久免费看| 亚洲国产欧美日韩精品| 欧美午夜片欧美片在线观看| 久久精品亚洲一区二区三区浴池| 亚洲人成在线免费观看| 国产精品自拍视频| 欧美成人免费在线视频| 亚洲欧美成人精品| 亚洲国产成人91精品| 国产精品免费观看视频| 蜜桃av久久久亚洲精品| 亚洲欧美日韩在线不卡| 亚洲国产精品成人久久综合一区| 国产精品xvideos88| 老司机aⅴ在线精品导航| 在线综合视频| 伊人春色精品| 国产精品美女久久久久久久| 麻豆精品一区二区av白丝在线| 亚洲午夜在线观看| 亚洲国产精品va在线看黑人| 国产伦一区二区三区色一情| 欧美精品xxxxbbbb| 久久久91精品国产一区二区三区 | 欧美高清视频一区| 性8sex亚洲区入口| 日韩视频国产视频| 黄色一区二区在线| 国产精品海角社区在线观看| 蜜乳av另类精品一区二区| 欧美一区二区三区在线免费观看| 亚洲精品一区中文| 狠狠色狠狠色综合系列| 国产精品久久久久久久第一福利| 欧美成人一品| 久久久久国内| 亚洲欧美日韩综合aⅴ视频| 亚洲精品国产无天堂网2021| 激情综合色丁香一区二区| 国产精品毛片| 欧美日韩国产首页在线观看| 毛片av中文字幕一区二区| 久久av免费一区| 亚洲一区亚洲| 一区二区三区四区国产| 亚洲国产综合视频在线观看| 国内精品写真在线观看| 国产精品专区h在线观看| 欧美视频一区二区三区| 欧美激情久久久久久| 六月丁香综合| 久久一区二区精品| 久久福利毛片| 欧美一区二区三区日韩| 亚洲综合色噜噜狠狠| 亚洲视频在线观看一区| 日韩亚洲欧美一区二区三区| 亚洲激情国产精品| 亚洲电影天堂av| 在线观看视频亚洲| 激情成人综合| 国内外成人免费激情在线视频网站 | 久久久久**毛片大全| 小处雏高清一区二区三区| 亚洲午夜久久久| 日韩亚洲国产精品| 亚洲人体一区| 亚洲国产欧美日韩另类综合| 永久555www成人免费| 影音先锋日韩有码| 伊人久久综合| 在线看片第一页欧美| 精品1区2区3区4区| 激情久久久久久久| 黄色工厂这里只有精品| 极品日韩av| 黄色一区三区| 在线观看日产精品| 亚洲二区视频| 亚洲精品一区二区三区福利|