[Dimelo Project] nodemailer로 이메일 보내기 (임시비밀번호 발급)

Suyeon Pi·2022년 1월 12일
0

Dimelo

목록 보기
7/22
post-custom-banner

비밀번호를 까먹었을 때 해당 이메일로 임시비밀번호를 이메일로 보내주도록 해보자. token방식으로 하면 비밀번호를 변경할 수 있도록 url을 보내줄 수 있지만 나는 추가로 토큰을 발급하지 않고 그냥 임시비밀번호를 발급해 메일로 보내주고 해당 유저의 비밀번호를 임시비밀번호로 바꾸게 만들었다.

작성코드

// auth.module.ts
import { MailerModule } from '@nestjs-modules/mailer';
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';

@Module({
  imports: [
    PassportModule.register({ session: true }),
    TypeOrmModule.forFeature([Users]),
    MailerModule.forRoot({
      transport: {
        service: process.env.NODEMAILER_SERVICE,
        host: process.env.NODEMAILER_HOST,
        port: 587,
        secure: false,
        auth: {
          user: process.env.NODEMAILER_USER,
          pass: process.env.NODEMAILER_PASS,
        },
        template: {
          dir: process.cwd() + '/template/',
          adaptor: new HandlebarsAdapter(),
          options: {
            strict: true,
          },
        },
      },
    }),
  ],
  controllers: [AuthController],
  providers: [
    AuthService,
    GoogleStrategy,
    GithubStrategy,
    LocalStrategy,
    LocalSerializer,
  ],
})
export class AuthModule {}
// auth.service.ts
import generator from 'generate-password';
import { MailerService } from '@nestjs-modules/mailer';

@Injectable()
export class AuthService {
  constructor(
    @InjectRepository(Users) private usersRepository: Repository<Users>,
    private readonly mailerService: MailerService,
  ) {}
  
  ...

  async sendMail(email: string) {
    const user = await this.usersRepository.findOne({
      where: { email },
    });
    if (!user) {
      throw new NotFoundException('해당 유저를 찾을 수 없습니다');
    }
    const password = generator.generate({ length: 10, numbers: true });
    const hashedPassword = await bcrypt.hash(
      password,
      parseInt(process.env.BCRYPT_SALT_ROUNDS),
    );
    try {
      await this.mailerService.sendMail({
        to: email,
        from: 'Dimelo Team',
        subject: '<Dimelo> 임시 비밀번호 발급',
        html: `임시 비밀번호 입니다. 해당 비밀번호로 로그인 후 비밀번호를 변경해주세요 : ${password}`,
      });

      return this.usersRepository.save({
        ...user,
        password: hashedPassword,
      });
    } catch (err) {
      console.log(err);
    }
  }

나는 우선 간단하게 테스팅 해보기 위해 mailtrap이라는 서비스를 사용했는데 메세지가 잘 전달한 것을 볼 수 있었다. 구글이나 네이버 서비스를 이용할 수 있는데 어떤 것을 사용할지는 좀 더 찾아봐야겠다.

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

profile
Stay hungry, Stay foolish!
post-custom-banner

0개의 댓글