Node.js 이메일 전송 구현

김두현·2024년 5월 6일
0

CafeOasis 개발일지

목록 보기
3/5
post-thumbnail

기존에 node mvc 시리즈와 다른 프로젝트이긴 한데 전 프로젝트는 무기한 연기라 현재 공부겸 개발 중인 프로젝트 기준으로 계속 시리즈를 이어가 포스팅해보겠다!

Intro

현재 node.js 기반의 웹 프로젝트를 진행하고 있는데 대구, 경산권 카페관련 다양한 서비스를 제공하는 것을 목표로 하는 중이다. 그 중 기본이 될 사용자 관련 기능들을 추가 및 리팩토링 중이다.

회원가입 등에서 본인인증 용도로 사용하기 위해 이메일 인증 기능을 추가하고자 한다.

이메일 인증 용도

  1. 최초 회원가입시 이메일 인증을 통해 본인인증
    1. 회원가입 페이지에서 이메일 입력 칸 옆에 이메일 인증 버튼을 추가해 입력한 이메일 주소로 인증 코드를 전송
    2. 사용자가 인증 코드를 정상적으로 입력하면 본인인증 완료
  2. 비밀번호를 분실한 경우 이메일 인증을 통해 비밀번호 초기화
    1. 사용자가 등록한 이메일 주소로 비밀번호 초기화 링크를 전송
    2. 링크를 통해 사용자는 비밀번호 초기화 가능

이메일 전송 서버 구축

1. Setup

npm 라이브러리 중 nodemailer를 사용해 구현 예정이다. nodemailer 모듈의 대표적인 장점은 다음과 같다.

  • 기본 SMTP 전송 외에도 HTML 메일, 텍스트 메일, 첨부 파일 지원 등 다양한 이메일 전송 옵션을 제공
  • SMTP를 기본으로 하지만, sendmail, Amazon SES, SMTP Pool, Direct 등 다양한 전송 방식을 지원
  • HTML 파일을 이메일 본문으로 사용할 수 있으며, 템플릿 엔진을 통해 동적인 이메일 생성이 가능
  • UTF-8 인코딩을 포함한 다양한 문자 인코딩을 지원
npm i nodemailer

2. gmail 및 config 설정

아래의 링크를 따라 gmail api 연동을 신청한다.

https://iamiet.tistory.com/entry/Nodemailer-Gmail-OAuth20으로-이메일-발송기능-구현하기

참고로 test로 api 신청하면 일주일 뒤에 토큰이 만료됨!

위에 링크와 같이 자신의 gmail을 통해 OAtuh2 api 신청을 하면 clientId, cliendSecret, refreshToken의 값들을 발급 받을 수 있다.

config.js에 smtp와 관련 config 추가

const dotenv = require("dotenv");
dotenv.config();

const smtp_config = {
  host: "smtp.gmail.com",
  port: 587,
  secure: false, // true for 465, false for other ports
  auth: {
    type: "OAuth2",
    user: process.env.GMAIL_OAUTH_USER,
    clientId: process.env.GMAIL_OAUTH_CLIENT_ID,
    clientSecret: process.env.GAMIL_OAUTH_CLIENT_SECRET,
    refreshToken: process.env.GAMIL_OAUTH_REFRESH_TOKEN,
  },
  from: "youremail",
};
  • dotenv 모듈을 사용해 중요 env 파일을 사용 권장!! → 보안 이슈

3. 이메일 전송

이제 사용자의 요청이든 필요에 따라 각 api에서 사용 가능한 특정 이메일로 전송하는 service 구현 필요

  • nodemailer 모듈에서 transporter 객체를 생성해 sendMail 함수를 통해 전송 지원
  • nodeemailer 모듈에 대해 더 궁금한 것은 공식 문서 참조 바람

async, await 키워드를 통해 동기로 구현 가능하지만 node server 자체에서 email을 발송하지 않고 gmail api에 의탁해 대신 메일을 발송하므로 동기적으로 처리하면 gmail에게 response를 받을 때까지 wait하는 시간이 비효율적이라고 판단해 비동기적으로 구현

// service/emailService.js

const emailService = {
	sendEmail(to, subject, text, html) {
  const transporter = nodemailer.createTransport(config.smtp_config);
  const mailOptions = {
    from: config.smtp_config.from,
    to: to,
    subject: subject,
    text: text,
    html: html,
  };

  transporter.sendMail(mailOptions, (err) => {
    if (err) console.error(err);
  });
}
}
  • mailOptions 객체를 통해 email의 제목, 내용 등을 지정
  • 각 service에서 해당 함수를 호출할 때 파라미터(to, subjet, text, html) 값만 변경하면 자유롭게 사용 가능!
  • 아직 error 처리에 대해서는 구현이 필요
  • sendMail 함수 파라미터에 callback을 추가해 해당 함수를 호출하는 로직에서 error 처리 function 구현 고려중...

Reference

Usage :: Nodemailer

[Node.js] 이메일 인증 구현하기 - 인증번호 / 인증 링크 (verify Email)

profile
끄적끄적

0개의 댓글

관련 채용 정보