Node.js

[NodeJS] nodemailer로 이메일 보내기

SongMinu 2023. 4. 19. 23:21
728x90

옛날에 개발을 시작한지 얼마 안 됐을 때,

회사 내부에 자바로 만들어진 이메일 관련된 기능을 수정을 해본 적이 있었는데 참 어려웠었다.

최근 npm 이것저것을 둘러보다가 문득 그때 생각이 나서 노드로 이메일을 보낼 수 있는 npm이 있지 않을까 하고 찾아봤는데 역시나 있었다.

사용법도 매우 간단하다.

 

작업할 프로젝트 생성(생략해도 됨)

npm init
CommonJS 모듈 방식이 아니라 ECMAScript 모듈 방식으로 작업하고 싶어서 프로젝트를 생성 후 작업했습니다.
꼭 이렇게 할 필요는 없습니다.
package.json에 "type": "module" 추가

패키지 설치

npm install nodemailer dotenv

dotenv는 코드 작성 내용 중에 커밋하면 안 되는 항목이 있어서 설치

.env 작성

env 파일에 아래 내용 작성

email_service=gmail
user=이메일을 보내는 본인 이메일
pass=그 이메일 패스워드

이메일, 패스워드 때문에 env를 추가하고 작성했다.

만약 깃 같은 곳에 올려도 상관없으면 소스상에 하드 코딩 작성 ㄱㄱ...

email_service에는 지메일, 야후, 아웃룩 등 지원하는 종류는 좀 여러 가지가 있는 것 같고, 난 지메일로 사용했다.

그리고 user에 작성한 본인 이메일에 [2단계 인증]이 활성화되어 있으면 이메일 패스워드를 별도로 발급받아야 한다.

이 부분에 대해서는 본문 하단에 작성함.

사용법

import nodemailer from 'nodemailer';
import dotenv from 'dotenv';
dotenv.config();

const { email_service, user, pass } = process.env;

const transporter = nodemailer.createTransport({
  service: email_service,
  auth: {
    user: user,
    pass: pass
  }
});

const mailOptions = {
  from : user,
  to: '@',
  subject: 'Nodemailer Test',
  text: '노드 패키지 nodemailer를 이용해 보낸 이메일임'
};

transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    console.error(error);
  } else {
    console.log('Email Sent : ', info);
  }
})

mailOptions 안에 to는 이메일을 받을 상대방 이메일 작성, subject는 제목, text는 본문 내용이 들어간다.

이게 가장 기본적인 사용법이고 파일에 이 내용을 작성 후 실행하면 바로 이메일이 전송된다.

정상적으로 보냈을 때 로그
받은 메일

그리고 내 이메일에서 보낸 이메일이기 때문에 보낸 이메일에도 당연히 있다.

그리고 mailOptions으로 text 말고 html이라는 게 있는데

html을 이용해 본문 내용을 작성해서 보낼 수 있다.

주의할 점은 text와 html을 둘 다 넣어서 보내면 html이 text를 덮어 씌우는 것 같다.

둘 다 넣고 보내봤는데 text 내용은 없고 html 내용만 이메일 본문에 들어가져 있었다.

 

그리고 기본 예제 소스가 콜백 방식으로 작성되어 있는데, async/await을 이용해 만들어도 정상적으로 작동된다.

export const mailSand = async ({to, subject, text, html}) => {
    try {
      //메일 클래스 인스턴스 생성
      const mail = new Mail();
      
      //받는 사람 속성 없으면 에러 발생, 있으면 세팅
      if (!to) throw new Error('Need "to" Propertie.');
      mail.setTo(to);

      //제목 있으면 세팅
      if (subject) mail.setSubject(subject);

      /**
       * text나 html은 둘 중 하나가 꼭 있어야함
       * 둘다 있을 경우 text는 안들어가고 html이 이메일 내용으로 들어가짐
       */
      if (!text && !html) throw new Error('Need "text" or "html" Propertie.')
      if (text) mail.setText(text);
      if (html) mail.setHtml(html);

      //메일 보내기 실행
      const result = await mail.sendMail();

      return result.response;
    } catch (err) {
      throw new Error(err);
    }
}

테스트해볼 겸 만들어 봤던 소스이다.

2단계 인증 해결 방법

보내는 이메일이 2단계 인증이 있을 경우 아래와 같은 에러가 출력된다.

2단계 인증이 되어 있는 이메일로 이메일을 발송하려와 별도의 패스워드를 발급 받아야 한다.

 

먼저 구글 계정 관리 페이지로 이동한다.

이동 후 좌측 메뉴에서 [보안] 메뉴를 선택한다.

 

클릭하면 2단계 인증이라는 항목이 있는데 클릭

 

이동 후 맨 아래쯤 가면 앱 비밀번호라는 항목이 있는데 클릭

 

이동하면 아래와 같은 화면을 볼 수 있다.

앱 선택을 눌러서 기타를 클릭

 

클릭하면 입력창이 출력된다.

 

본인이 구분하기 쉬운 내용을 작성한다. 난 그냥 nodemailer라고 작성했다.

작성 후 생성을 클릭하면

기기용 앱 비밀번호가 생성된다.

저 비밀번호를 그대로 긁어서 복사 후 env안 pass에 입력해 주면 된다.(띄어쓰기 필요 없이 다 붙여서)

이렇게 세팅 후 다시 보내면 정상적으로 발송된다.

 

생각보다 쉽게 메일을 보낼 수 있는 것 같아 신기했다.

글 초반에서 작성했지만 기본적인 사용법이고 공식 홈페이지에 보면 추가적인 기능들을 더 볼 수 있다.

쓰기 좋게 모듈화 시켜서 사용하면 편리하게 사용할 수 있을 듯하다.

 

공식 홈페이지 :  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://github.com/smw0807/minu_1/tree/master/node/nodemailer

 

GitHub - smw0807/minu_1

Contribute to smw0807/minu_1 development by creating an account on GitHub.

github.com

 

반응형