본문 바로가기
개발/NestJS

[NestJS] mail 발송(Gmail,nodeMailer)

by coking 2022. 12. 1.

설치법

yarn add @nestjs-modules/mailer nodemailer
#or
npm install --save @nestjs-modules/mailer nodemailer

 

만약 template을 사용하려면 셋 중에 하나를 다운 받아야 한다. 

// with npm

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

 

// with yarn

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


일단 모듈 구현 코드 먼저 보면서 설명을 하겠다. 

// email.module.ts

import { Module } from "@nestjs/common";
import { EmailService } from "./email.service";
import { EmailController } from "./email.controller";
import { MailerModule } from "@nestjs-modules/mailer";
import { ConfigModule, ConfigService } from "@nestjs/config";

@Module({
	imports: [
		MailerModule.forRootAsync({
			useFactory: async (config: ConfigService) => ({
				imports: [ConfigModule],
				transport: {
					host: config.get("EMAIL_HOST"),
					port: 587,
					auth: {
						user: config.get("EMAIL"),
						pass: config.get("EMAIL_PASSWORD")
					}
				},
				defaults: {
					from: `"test" <${config.get("EMAIL")}>`
				},
				preview: true
				// template: {
				// 	dir: __dirname + "/templates",
				// 	adapter: new PugAdapter(),
				// 	options: {
				// 		strict: true
				// 	}
				// }
			}),
			inject: [ConfigService]
		})
	],
	controllers: [EmailController],
	providers: [EmailService, ConfigService]
})
export class EmailModule {}



// 위에 forRootAsync말고 이렇게 구현도 가능하다 
// 보기 쉽게 필요한 값들을 넣어 놓았다. 
MailerModule.forRoot({
        transport: {
            service: "Gmail",
            host: "smtp.gmail.com",
            port: 587,
            auth: {
                user: process.env.EMAIL,
                pass: process.env.EMAIL_PASSWORD
            }
        },
        defaults: {
            from: '"No Reply" <no-reply@localhost>'
        },
        preview: true
        //   template: {
        // 	dir: process.cwd() + '/template/',
        // 	adapter: new HandlebarsAdapter(), // or new PugAdapter() or new EjsAdapter()
        // 	options: {
        // 	  strict: true,
        // 	},
        //   },
})

 

template가 주석 처리되어 있는 이유는 아직 회사에서 정해진 게 없어서 추후에 구현 후 수정해서 올리도록 하겠다. 

 

일단 여기서 제일 중요한 건 어디 메일을 사용할 것인데 나는 Gmail을 사용하기로 하였다. 

 

gmail 사용 시 사용할 설정 

 

문자 발송 코드 

export class EmailService {

	constructor(private mailerService: MailerService) {}

    async sendEmail(sendEmailDto: SendEmailDto) {
            const { to, subject, text, html } = sendEmailDto;

            try {
                await this.mailerService.sendMail({
                    to,
                    subject,
                    text,
                    html
                });
            } catch (err) {
                throw err;
            }
        }
    
 }

// semdMail에 들어갈 요소는 

{
  from: "sender@server.com",
  to: "receiver@sender.com",
  subject: "Message title",
  text: "Plaintext version of the message",
  html: "<p>HTML version of the message</p>"
}; 

이렇게 정의 되어있는데 우리는 module에서 default from을 설정했기에 코드에서는 생략했다.

 

이제 mail 발송을 해보면 무조건 이런 에러를 뱉을 것이다.  이건 사용 smtp가 gmail일 경우이다.

POST 500 535-5.7.8 Username and Password not accepted. 
Learn more at 535 5.7.8 https://support.google.com/mail/?p=BadCredentials 
q17-20020a170902eb9100b00188b5d25438sm36859plg.35 - gsmtp

 

이때 확인해야 할 내용은 첫 번째로 IMAP 설정을 확인하는 것인데 밑에 이미지에 있는 내용을 따라 하면 된다. 

이 설정을 했는데도 에러가 발생한다면 두 번째로 앱 비밀번호를 생성해야 한다. 현재 google에 mail발송 구현에 관해 검색해보면 많은 글들이 해결법을 메일 발송의 계정의 보안 설정을 "보안 수준이 낮은 앱의 액세스 허용"으로 바꿔서 해결했다고 나오는데 

 구글 정책이 최근 2022.05.30 기준으로 바뀜에 따라 그 방법은 사용할 수 없다. 

 

앱 비밀번호를 생성하는 방법은 

 

-> 구글 계정을 클릭 후 계정관리 선택 

->  왼쪽 메뉴의 보안 선택 

-> Google에 로그인하는 방법 메뉴에서 2단계 인증 메뉴를 클릭하고 2단계 인증 후 맨 밑으로 이동하면 앱 비밀번호 메뉴를 찾을 수 있다. 

 

비밀번호 생성 시 앱 선택을 기타(맞춤 이름으로 선택 후 이름 설정 후 생성 버튼 클릭)

 

이렇게 생성된 비밀번호를 module 비밀번호 입력하는 곳에 넣어주면 된다. 

 

 

이렇게 하면 잘 발송되는 메일을 확인할 수 있을 것이다. 이 글을 보시는 분들은 나처럼 host에 smtp.google.com을 넣는 실수는 하지 않기를 바란다!

 

참고링크

 

https://nodemailer.com/about/

 

Nodemailer :: Nodemailer

Nodemailer Nodemailer is a module for Node.js applications to allow easy as cake email sending. The project got started back in 2010 when there was no sane option to send email messages, today it is the solution most Node.js users turn to by default. npm i

nodemailer.com

 

https://nest-modules.github.io/mailer/

 

NestJS - Mailer · Modules for the nestjs framework

Modules for the nestjs framework

nest-modules.github.io

 

https://notiz.dev/blog/send-emails-with-nestjs

 

Send Emails with NestJS

Create Email Templates and send them with nodemailer from your Nest application

notiz.dev

 

댓글