NestJs에서 메일 보내는 방식에 대해서 작성하겠습니다.
라이브러리가 여러 종류 있긴한데 저는 nestjs-module/mailer 라는 종류를 사용하였습니다.
우선 라이브러리를 설치합니다.
npm install --save @nestjs-modules/mailer nodemailer
npm install --save-dev @types/nodemailer
or
yarn add @nestjs-modules/mailer nodemailer
yarn add -D @types/nodemailer
typescript를 사용하기에 type도 같이 받아줍니다.
그리고 이메일 작성시 사용할 handlebars나 pug, ejs 중 하나를 선택하여 설치하여 줍니다.
저는 ejs를 사용했습니다.
npm install --save handlebars
npm install --save pug
npm install --save ejs
or
yarn add handlebars
yarn add pug
yarn add ejs
메일 기능을 사용하기 위해서 Module에 등록을 해줍니다.
import { MailerModule } from "@nestjs-modules/mailer";
import { EjsAdapter } from "@nestjs-modules/mailer/dist/adapters/ejs.adapter";
import { HttpModule } from "@nestjs/axios";
import { Module } from "@nestjs/common";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { MailController } from "controller/MailController";
import { MailService } from "service/mail.service";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
@Module({
imports: [
MailerModule.forRootAsync({
useFactory: () => ({
transport: {
host: process.env.MAIL_HOST,
port: Number(process.env.MAIL_PORT),
auth: {
user: process.env.MAIL_ID,
pass: process.env.MAIL_PASS,
},
},
defaults: {
from: `'${process.env.MAIL_FROM_NAME}' <${process.env.MAIL_FROM_ID}>`, //보낸사람
},
template: {
dir: __dirname + "/templates",
adapter: new EjsAdapter(),
options: {
strict: true,
},
},
}),
}),
],
controllers: [AppController, MailController],
providers: [AppService, MailService],
})
export class AppModule {}
보여주는 용이기에 App.module.ts 파일에 컨트롤러와 서비스를 한번에 입력했습니다.
mail을 사용하기 위해서는 mailer module을 등록하고, 메일에 등록해놓은 host와 port 그리고 id, password를 입력후 사용할 템플릿의 종류의 따라 adapter을 변경해주면 됩니다. 저는 ejs를 사용하기에 EjsAdapter를 사용중입니다.
import { Injectable } from "@nestjs/common";
import { OcrComment } from "entities/OcrComment";
import { MailerService } from "@nestjs-modules/mailer";
@Injectable()
export class MailService {
constructor(private readonly mailerService: MailerService) {}
async sendOcrMail() {
await this.mailerService.sendMail({
to: 메일 주소,
subject: 메일 제목,
template: "Mail.ejs", // 메일에 사용할 템플릿
context: {
subtitle: 제목,
templetData: 내용,
}, // 템플릿에 전송할 데이터
});
}
}
템플릿을 사용할 경우 위와같이 template를 넣고 template에 전달할 데이터를 입력하면 되고
import { Injectable } from "@nestjs/common";
import { OcrComment } from "entities/OcrComment";
import { MailerService } from "@nestjs-modules/mailer";
@Injectable()
export class MailService {
constructor(private readonly mailerService: MailerService) {}
async sendOcrMail() {
await this.mailerService.sendMail({
to: 메일 주소,
subject: 메일 제목,
text: 메일 내용
});
}
}
간단한 메일을 보낼 경우 template 없이 이런 방식으로도 전송이 가능하다.