[NestJS] nodemailer로 email 보내기

joo·2022년 12월 5일
0

nestJS

목록 보기
2/3

0. 들어가기전

이메일이 발송이 되다니 진짜 서비스 같네
  • 폴라 프로젝트(멘토링 매칭)을 할때 유저의 상태 변화를 slack으로 알림을 하고 싶었으나, 권한을 받기 어려워서 이메일로 하게 되었다.
  • nodemailer로 email 기능을 구현하였다. g-mail api를 사용하자는 의견도 나왔지만, g-mail만 지원하는 것이 탈락이유였다.

1. 설치

https://www.npmjs.com/package/@nestjs-modules/mailer
공식문서는 아닌 것 같은데 docs까지 잘 정리되어 있네요.

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

이메일의 내용을 작성할 때 html을 편하게 작성하기 위한 부분입니다.
저는 handlebars를 설치했습니다.

npm install --save handlebars
#or
npm install --save pug
#or
npm install --save ejs

yarn add handlebars
#or
yarn add pug
#or
yarn add ejs

2. 적용

생각보다 간단?

docs를 보고 충실히 따라해 줍시다.

configuration

  • mail.module.ts
import { Module } from '@nestjs/common';
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';
import { MailerModule } from '@nestjs-modules/mailer';
import { MailService } from './mail.service';

@Module({
  imports: [
    MailerModule.forRoot({
      transport: {
        host: 'smtp.gmail.com',
        port: 587,
        auth: {
          user: process.env.MAIL_USER,
          pass: process.env.MAIL_PASS,
        },
      },
      defaults: {
        from: '"nest-modules" <modules@nestjs.com>',
      },
      template: {
        dir: __dirname + '/templates',
        adapter: new HandlebarsAdapter(),
        options: {
          strict: true,
        },
      },
    }),
  ],
  providers: [MailService],
  exports: [MailService],
})
export class MailModule {}
  • docs에서는 'transport'부분이 'transport: smtps://user@domain.com:pass@smtp.domain.com'으로 되어있는데, 불편해서 저는 docs 맨 밑의 transport부분을 사용했습니다.
  • 그리고 app.module에 imports하는 것보다 mail에 imports하여 설정하는게 편할것 같아서 mail.module에 적용했습니다.

    port로 메일 전송시 SMTP 서버연결에 옵션설정을 합니다.
    587은 single connection 입니다.

service

  • mail.service.ts
import { MailerService } from '@nestjs-modules/mailer';
import { ConflictException, Injectable } from '@nestjs/common';

@Injectable()
export class MailService {
  constructor(private readonly mailerService: MailerService) {}

  sendHello(): boolean {
    this.mailerService
      .sendMail({
        to: 'user@gmail.com',
        from: 'noreplay@gmail.com',
        subject: 'Hello',
        text: 'Hello World',
        html: '<b>Hello World</b>',
      })
      .then((result) => {
        console.log(result);
      })
      .catch((error) => {
        new ConflictException(error);
      });
    return true;
  }
}

이게 끝입니다..! 한번 확인해 볼까요?

감사합니다..!

profile
간절한 개발자

0개의 댓글