Nodemailer와 Google 앱 비밀번호를 사용한 인증 메일 전송 설정 가이드

👀·2024년 6월 12일
0

Google의 앱 비밀번호와 Nodemailer를 활용해 Gmail SMTP 서버를 통해 인증 메일을 전송하는 방법을 단계별로 서술.
이 과정에서는 Google 계정의 2단계 인증과 앱 비밀번호 설정이 필요하다.
설정을 완료한 후에는 Nodemailer를 사용해 원하는 이메일을 쉽게 전송할 수 있다.

1. Google 앱 비밀번호 설정

  • Gmail 계정을 SMTP 서버로 사용하려면 Google 계정의 2단계 인증과 앱 비밀번호 발급이 필요하다.
  • 이 보안 설정은 Gmail을 외부 애플리케이션에서 안전하게 사용할 수 있도록 한다.

단계별 설정

  1. Google 계정에 로그인하고, 계정 설정 페이지로 이동한다. Google 계정 관리에서 설정을 변경할 수 있다.

  2. 2단계 인증 활성화:

  • 보안 탭으로 이동.
  • 2단계 인증을 활성화. 이 설정을 통해 Google 계정에 추가 보안 계층을 추가할 수 있습니다.
  1. 앱 비밀번호 생성:
  • 2단계 인증이 활성화된 상태에서 앱 비밀번호 항목을 클릭.
  • 앱 비밀번호 생성 메뉴에서 앱 유형(예: "메일")과 기기 유형(예: "컴퓨터")을 선택.
  • 생성된 16자리 앱 비밀번호를 복사해 Nodemailer에서 사용할 수 있도록 한다.

💡 참고: Google 계정에서 생성한 앱 비밀번호는 평생 유효하며, Google이 허용하는 다른 애플리케이션과의 연동에서도 사용할 수 있습니다. 노출되지 않도록 안전하게 보관하는 것이 좋습니다.

2. Nodemailer 설정

Nodemailer는 Node.js 애플리케이션에서 이메일을 손쉽게 전송할 수 있도록 도와주는 SMTP 기반의 메일 전송 라이브러리이다.

Gmail SMTP 서버를 통해 메일을 전송하기 위한 Nodemailer 설정

설치

pnpm install nodemailer

SMTP 설정

import nodemailer from "nodemailer";

export const transporter = nodemailer.createTransport({
  service: "gmail",
  host: 'smtp.gmail.com',
  port: 465, // SSL 
  // port: 587, // TLS
  secure: true, // SSL은 true TLS는 false
  requireTLS: false,
  auth: {
    user: "TEST_SENDER@gmail.com", //구글 메일 주소
    pass: "", //구글 앱 비밀번호
  },
});

SMTP 설정 설명

  • service: gmail을 입력하면 Gmail SMTP 서버 설정이 자동으로 적용됩니다.
  • host: Gmail SMTP 서버 호스트 주소입니다.
  • port: SSL 연결에 사용할 포트로, 465를 사용.
  • secure: SSL 연결을 사용할 경우 true, TLS 연결을 사용할 경우 false로 설정.
  • auth: Google 계정의 user와 앱 비밀번호 pass를 지정하여 인증.

3. 인증 메일 전송 함수 구현

Nodemailer의 transporter 객체를 사용하여 인증 메일을 전송할 수 있도록 함수 작성.

이 예제에서는 Next.js의 API 라우트를 사용하여 HTTP POST 요청을 통해 이메일을 전송하는 API를 구현.

// api/mail.ts
import { NextRequest, NextResponse } from "next/server";
import { transporter } from "./transporter";

export async function POST(req: NextRequest) {
  try {
    // 요청에서 메일 수신자, 제목, 내용 추출
    const { to, subject, html } = await req.json();

    // 이메일 옵션 설정
    const mailOptions = {
      from: `발신자 이름 <TEST_SENDER@gmail.com>`, // 발신자 이메일 주소
      to, // 수신자 이메일 주소
      subject, // 이메일 제목
      html, // 이메일 내용 (HTML 형식)
      // attachments: ["첨부파일"], // 첨부 파일이 있을 경우 추가
    };

    // Nodemailer를 이용해 이메일 전송
    await transporter.sendMail(mailOptions);

    // 전송 성공 응답
    return NextResponse.json(
      { ok: true, msg: "인증 메일 전송 성공" },
      { status: 200 }
    );
  } catch (e: any) {
    // 전송 실패 시 에러 코드와 메시지 반환
    return NextResponse.json(
      { ok: false, msg: "인증 메일 전송 실패!" },
      { status: e.responseCode || 500 }
    );
  }
}

주요 구현 설명

  • POST 요청 처리: POST 함수에서 요청 데이터를 받아 메일을 전송.
  • 메일 옵션 설정 (mailOptions):
    - from: 발신자 이메일 주소와 이름을 지정.
    - to, subject, html: 각각 수신자, 이메일 제목, HTML 형식의 내용을 지정.
    - attachments: 첨부 파일을 추가할 수 있다.
    - transporter.sendMail: Nodemailer를 이용해 이메일을 전송.
    - 에러 처리: 메일 전송 실패 시 에러 메시지와 상태 코드를 클라이언트에 전달.

Next.js와 Nodemailer를 활용한 메일 전송 예제

이제 작성한 API와 Nodemailer 설정을 통해 이메일을 전송할 수 있다. 예를 들어, fetch 요청으로 서버의 /api/mail 엔드포인트에 POST 요청을 보내 인증 메일을 전송할 수 있다.

const sendEmail = async () => {
  const response = await fetch("/api/mail", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      to: "RECIPIENT@example.com",
      subject: "인증 메일 도착!",
      html: "<p>여기를 클릭하여 인증하세요: <a href='https://example.com'>인증 링크</a></p>",
    }),
  });

  const data = await response.json();
  if (data.ok) {
    console.log("이메일 전송 성공!");
  } else {
    console.error("이메일 전송 실패:", data.msg);
  }
};

마무리 및 주의사항

Gmail SMTP 서버는 무료로 사용할 수 있으나, 한 시간당 전송 제한이 있으며 무분별한 메일 전송은 계정 제한이 될 수 있다. 테스트 시에는 적절한 빈도로 메일을 보내는 것이 좋다.

구글 앱 비밀번호 발급

2단계 인증

0개의 댓글