250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

devlog_owen

240109 [TIL] nest.js mailer 사용하기 본문

TIL

240109 [TIL] nest.js mailer 사용하기

developer_owen 2024. 1. 10. 03:44
728x90

nest.js mailer 사용하기

 

 

@nestjs-modules/mailer

NestJS - a mailer module (@mailer). Latest version: 1.10.3, last published: 20 days ago. Start using @nestjs-modules/mailer in your project by running `npm i @nestjs-modules/mailer`. There are 60 other projects in the npm registry using @nestjs-modules/mai

www.npmjs.com

 

 

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

 

 

npm, yarn에 따라 모듈을 설치해준다.

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

 

템플릿을 사용하려면 설치하는 건데 나는 템플릿을 사용하지않아서 설치하지 않았다.

 

 

@Module({
    imports: [
        AuthModule,
        JwtModule,
        MailerModule.forRootAsync({
            useFactory: (configService: ConfigService) => ({
                transport: {
                    host: "smtp.gmail.com",
                    port: 587,
                    auth: {
                        user: configService.get<string>("MAIL_USER"),
                        pass: configService.get<string>("MAIL_PASS"),
                    },
                },
                defaults: {
                    from: '"nest-modules" <modules@nestjs.com>',
                },
                template: {
                    dir: __dirname + "/templates",
                    adapter: new HandlebarsAdapter(),
                    options: {
                        strict: true,
                    },
                },
            }),
            inject: [ConfigService],
        }),
        TypeOrmModule.forFeature([Board, User, InvitedUsers]),
    ],
    controllers: [InvitedUsersController],
    providers: [InvitedUsersService],
})
export class InvitedUsersModule {}

 

나는 따로 메일 모듈이나 컨트롤러같은 레이어를 안만들고 바로 invitedusers 모듈에 넣었다. 환경변수로 이메일과 비밀번호를 관리했다. 

587포트는 통상의 메일 송신(SMTP)에 이용되는 TCP의 25번 포트 외의 전용포트다. 따로 어딘가에서 설정할 필요없이 그대로 코드에 입력하면 된다.

비밀번호는 구글 계정에서 앱 비밀번호를 생성하면 4자리 4개씩 총 16자리 비밀번호를 주니까 꼭 어딘가에 적어놓아야 한다.

 

const token = this.generateAccessToken(user.id, board.id);

        const baseUrl = "http://localhost:5000"; 

        const url = `${baseUrl}/invited-users?token=${token.accessToken}`;

        await this.mailerService
            .sendMail({
                to: user.email,
                from: this.configService.get<string>("MAIL_USER"),
                subject: "트렐로 초대합니다",
                html: `
        초대수락 버튼를 누르시면 초대 인증이 완료됩니다.<br/>
        <form action="${url}" method="POST">
          <button>초대수락</button>
        </form>
      `,
               
            })
        return { message: "초대가 성공적으로 발송되었습니다." };
    }

 

 

추후에 userboard 테이블에 해당 userId,boardId를 넣기위해서 토큰에 userId,boardId를 넣어서 링크에 보내줬다. 

 

728x90