[Dimelo Project] nodemailer smtp 메일 google 에서 못받는 문제

Suyeon Pi·2022년 2월 24일
0

Dimelo

목록 보기
13/22

https://velog.io/@suyeonpi/Dimelo-Project-nodemailer%EB%A1%9C-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EB%B3%B4%EB%82%B4%EA%B8%B0-%EC%9E%84%EC%8B%9C%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EB%B0%9C%EA%B8%89

이전 포스팅에 이어서 nodemailer host를 나는 google로 선택했다.
google로 host를 할 경우 해당 google id의 Gmail을 "보안 수준이 낮은 앱"으로 해주어야한다.

하지만 저렇게 하니 naver로는 smtp메일이 잘 전달되는데 google로 메일을 보낼때는 메일전송은 가능했지만 해당 구글이메일로 메일이 도착하지 않았다.
smtp메일이 안전하지 않다고 생각해서 구글측에서 막는건지..
우선 "보안 수준이 낮은 앱"이라고 설정하는 것도 약간 찝찝함이 있었고
사람들이 가장 많이 쓰는 이메일인 구글에서 메일을 받아볼 수 없다는 건 말도안되는 문제라고 생각했다.

nodemailer에서 gmail을 "보안수준 낮은앱"을 설정하지 않고 구글에서도 smtp메일을 받아 볼 수 있는 방법을 찾다가 nodemailer transport를 Oauth2를 사용해서 보다 안전하게 메일을 보낼 수 있는 법을 찾았다.

https://nodemailer.com/smtp/oauth2/
OAuth2 allows your application to store and use authentication tokens instead of actual login credentials. This is great for security as tokens or valid only for specific actions and can be easily revoked thus, once stolen, can’t to as much harm as actual account credentials.

위의 공식문서와 아래 블로그를 참고하여 따라하고 코드를 변경 했다.

https://velog.io/@13circle/Nodemailer-X-Gmail-OAuth-2.0

변경 코드 :

// mail.module.ts
@Module({
  imports: [
    TypeOrmModule.forFeature([Users]),
    MailerModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => {
        return {
          transport: {
            service: config.get<string>('NODEMAILER_SERVICE'),
            host: config.get<string>('NODEMAILER_HOST'),
            port: config.get<number>('NODEMAILER_PORT'),
            secure: true,
            auth: {
              type: 'OAuth2',
              user: config.get<string>('OAUTH_USER'),
              clientId: config.get<string>('OAUTH_CLIENT_ID'),
              clientSecret: config.get<string>('OAUTH_CLIENT_SECRET'),
              refreshToken: config.get<string>('OAUTH_REFRESH_TOKEN'),
            },
          },
        };
      },
    }),
  ],
  providers: [MailService],
  exports: [MailService],
})
export class MailModule {}

nodemailer Oauth2를 이용하니 구글에서도 성공적으로 메일을 받을 수 있었다!!

profile
Stay hungry, Stay foolish!

0개의 댓글