nodemailer를 사용해서 이메일 전송하기(hiwork 서버 사용)

이애옹·2023년 8월 31일
0

Node.js

목록 보기
32/32
post-thumbnail

특정 시점에서 사용자에게 메일을 보내는 작업이 필요해서,
nodemailer를 이용해서 작업을 진행했다!!!

📌 nodemailer란?

Node.js 기반의 서버 사이드 애플리케이션에서 이메일을 보내기 위해 사용되는 이메일 전송 라이브러리로, Node.js 애플리케이션에서 간단하게 이메일을 보내거나 템플릿화된 이메일을 보내는 작업을 할 수 있다.

또한 nodemailer는 SMTP, Gmail, SendGrid 등 다양한 전송 서비스와 연동하여 이메일을 보낼 수 있다.

📌 nodemailer 사용법

📝 설치하기

일단 nodemailer 사용을 위해서 라이브러리를 설치해줘야 한다.

npm install nodemailer

📝 기본 사용법

다음 코드는 nodemailer 기본 사용법이다.

const nodemailer = require('nodemailer');

// 이메일 전송을 위한 transporter 생성
const transporter = nodemailer.createTransport({
  service: 'Gmail', // 이메일 서비스 (Gmail, Yahoo 등)
  port: 465, // SSL/TLS 포트
  secure: true, // 보안 연결 사용
  auth: {
    user: 'your_email@gmail.com', // 발송자 이메일
    pass: 'your_password', // 발송자 이메일의 비밀번호
  },
});

// 이메일 내용 설정
const mailOptions = {
  from: 'your_email@gmail.com', // 발송자 이메일
  to: 'recipient@example.com', // 수신자 이메일
  subject: 'Hello from nodemailer', // 이메일 제목
  text: 'Hello world!', // 이메일 본문
};

// 이메일 전송
transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    console.error('Error sending email:', error);
  } else {
    console.log('Email sent:', info.response);
  }
});

먼저 이메일 전송을 위해서 transporter를 생성해야 한다.

service : 어떤 이메일 서비스를 사용할지 설정하는부분 ! 보통 Gmail을 많이 쓰는 것 같은데 나는 hiworks를 사용했다.

port : 이메일 서비스와 통신에 사용되는 포트 번호를 지정한다. 일반적으로 SMTP와 통신을 위하 25번 포트를 사용하며, 보안 연결을 위해 SSL/TLS를 위한 포트인 465번이나 STARTTLS를 위한 587번을 사용하기도 한다.

secure : 통신 시 보안 연결을 사용할 것인지를 지정한다. true로 설정 시 SSL/TLS를 사용하는 보안 연결을 설정한다.

auth : 발송자의 이메일과 이메일 비밀번호를 설정한다. 개인정보이므로 env 파일을 생성해서 넣어두는게 좋다 !!

그 외에는 이메일 내용 설정 부분과 이메일 전송 부분인데, 이 내용은 따로 어려운게 없으니까 패스 ㅎ-ㅎ

참고로 이메일 내용은 html 형식으로 넣어줄 수도 있다.

나도 메일 내에 버튼을 누르면 번호가 복사되는 부분이나, 다른 페이지로 이동하는 버튼을 추가해야해서 html 내에 간단하게 스크립트를 작성해서 넣어줬다.

참고로 나는 하이웍스를 사용하기 때문에,

let transporter = nodemailer.createTransport({
          service: 'hiworks',
          host: 'smtps.hiworks.com', 
          port: 587,
          secure: false,
          auth: {
              user: 발송자 이메일, 
              pass: 발송자 비밀번호, 
          },
      });

이런식으로 넣어주고 있다.

여기서 host는 직접적으로 이메일 서버의 호스트 주소를 지정할 때 사용된다고 한다.
여기서 말하는 호스트 주소는 SMTP 서버 주소이다.

따라서 나같은 경우, hiworks 서비스를 사용하되, host를 직접 지정하는 것이라고 생각하면 된다 !!!

📌 nodemailer 에러 수정

nodemailer를 구현하고 테스트를 진행하던 중 몇가지 에러가 발생했다.

첫번째로

Invalid login: Username and Password not accepted

Username과 Password를 올바르게 작성했음에도 불구하고 다음과 같은 에러가 발생했다.
해당 계정으로 하이웍스에 직접 접속하여 메일 기본설정 -> POP3/SMTP 설정을 "사용함"으로 전환하니 해결 됐었다.

이렇게 하니 개발에서는 구현이 잘 되는것을 확인했고, 운영에 배포를 했는데

Your IP is not allowed

에러가 발생했다. . 이것 또한 하이웍스내에 접속해서 IP 설정을 열어줘야 해결이 가능하다고 한다.

📌 nodemailer 응용하기

처음에는 첨부 파일을 보내는 기능이 따로 없었는데, 추후에 추가 되었다!!

그래서 다음과 같은 코드를 추가해줬다.

  // 메일에 첨부할 파일 경로
    const pdfFilePaths = [
      './jpg/첨부파일_1.jpg',
      './jpg/첨부파일_2.jpg',
      './jpg/첨부파일_3.jpg',
      './jpg/첨부파일_4.jpg',
      './jpg/첨부파일_5.jpg',
    ];

    // 첨부할 파일들을 담을 attachments 배열 생성
    const attachments = pdfFilePaths.map(filePath => ({ path: filePath }));

    const message = {
      from: '보내는 사람 이메일주소', // 보내는 사람
      to: params.MEMBER_ID, // 받는 사람 이름과 이메일 주소
      subject: subject, // 메일 제목
      html: html,
      attachments: attachments // 파일 첨부
    };

나는 총 5개의 첨부파일이 들어가야해서 다음과 같이 코드를 추가 해 줬다.

이렇게 하면 메일 전송 시 파일을 첨부해서 함께 보내줄 수 있다 😁

profile
안녕하세요

0개의 댓글