Web/NodeJS

NodeJS, nodemailer로 API 요청시 메일 보내기

songye 2024. 7. 24. 09:59

우리가 흔히 회원가입 절차에서 이메일인증을 받을 때

 

API요청을 통해 수신자의 메일로 서버를 통해 메일을 보냅니다.

 

오늘은 Nodejs를 통해 이것을 간단히 구현해봅시다.

Installation

npm i express nodemailer

먼저 express와 nodemailer 패키지를 설치해줍시다.

 

필요하다면 dotenv 패키지를 설치해서 환경변수를 사용해 사용자의 이메일 주소와 비밀번호를 숨겨줍시다.

 

SMTP Service 이용

SMTP 서버는 Gmail 혹은 Outlook 등 다양한 이메일 플랫폼을 활용하면 됩니다.

 

필자는 gmail을 사용할 것입니다. (Gmail은 무료계정은 하루에 500통, workspace는 2000통까지 가능합니다)

gmail 이메일 한도

자 이제 Gmail 셋팅을 해봅시다!

셋팅 클릭
모든 설정 보기 클릭
전달 및 POP/IMAP 클릭
IMAP 사용 설정

POP3가 아닌 IMAP을 사용할 것이기 때문에 IMAP만 설정해줍니다.

POP3 와 IMAP의 차이는 나중에 다시 살펴봅시다

 

이제 API 요청시 Gmail 계정에서 인증할 수 있도록 앱 비밀번호를 생성할겁니다.

 

구글 계정 관리 클릭

크롬 오른쪽 상단에 있는 아이콘을 클릭하여 계정 관리로 이동합니다.

앱 비밀번호 검색

상단 검색창에 앱 비밀번호를 검색하고 클릭합니다. (참고로 구글 보안 인증 2단계 이상이어야 가능합니다)

앱 비밀번호 생성

앱 이름을 지정하고 만들기를 눌러줍니다. 그러면 16글자의 비밀번호가 생성되는 것을 확인할 수 있습니다.

Code

const nodemailer = require('nodemailer');
const express = require('express');
const bodyParser = require('body-parser');
require('dotenv').config();

const app = express();
const port = 3000;


app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: process.env.NODE_MAIL_ID,
        pass: process.env.NODE_MAIL_PW
    }
});

app.post('/send-email', (req, res) => {
    const { to, subject, text } = req.body;

    const mailOptions = {
        from: process.env.NODE_MAIL_ID,
        to: to,
        subject: subject,
        text: text,
    };

    transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
            console.log(error);
            return res.status(500).send('Error: Sending Email');
        }
        console.log('Email send:' + info.response);
        res.status(200).send('Email Sent Successfully!');
    })
})

app.listen(port, () => {
    console.log(`Server is running on port ${port}`);

});

 

 

코드를 살펴보면 크게 3영역이 있습니다.

1. createTransporter, SMTP Service와 Auth를 설정하여 새로운 인스턴스 transporter를 만듭니다.

2. Mail Option, API 요청을 통해 받은 전달할 수신자 메일주소, 제목, 텍스트를 설정합니다.

3. sendMail, transporter 인스턴스의 메소드로 송신자의 정보를 토대로 미리 설정한 Mail Option을 인자로 받아 메일을 전송합니다.

 

Test

Client쪽을 만드는게 귀찮으니 Postman을 활용해서 테스트해봅시다.

다음과 같이 body에 데이터들을 담아 API 요청을 보내면

성공했다는 응답과 함께 메일이 도착했음을 확인할 수 있습니다!

 

Google Workspace의 Gmail 전송 한도 - Google Workspace 관리자 고객센터

도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com

 

후기

생각보다 간단한 과정이라 신기하기도 하면서 당황스럽기도 합니다. SMTP Server가 만들어져 있는 것을 활용함으로서 모듈을 통해 정말로 간단히 보낼 수 있구나 생각이들면서도 Email Server를 만들어봐야겠다라는 생각이 듭니다. 다음엔 SMTP와 IMAP POP3에 대한 개념과 Mail Server관련 포스팅으로 돌아오지 않을까 생각합니다.