Javascript

[Node] 이메일 전송

맨날개발 2025. 4. 13. 23:46

이메일을 보내기 위해서는 SMTP를 사용해야 한다. 지메일 또는 네이버에서는 기본적으로 SMTP 서버를 활용해서 메일을 전송하게 된다.

 

지메일의 SMTP를 사용하기 위해서는 앱 비밀번호를 생성해야 한다.

  1. 프로필에서 계정 관리
  2. 보안
  3. 2단계 인증
  4. 하단에 앱 비밀번호

💡 앱 비밀번호 위치는 달라질 수 있음. 비밀번호를 기억해놓자.

 

 

🎈 nodemailer

노드에서 메일 전송을 위해서는 nodemailer 라이브러리를 사용하면 간편하게 메일을 전송할 수 있다.

설치

아래와 같이 설치해준다.

yarn add nodemailer
npm install nodemailer

 

사용방법

메일을 보내기 위해서는 먼저 transporter 객체를 생성해주어야 한다.

const transporter = nodemailer.createTransport(options[, defaults]);
  • options : 메일 전송하기 위한 설정 정보를 작성. 주소 auth  service 를 사용
    • host : SMTP에 사용될 호스트 주소
    • post : SMTP에 사용될 포트
    • secure : 포트 465에 연결하는 경우 true, 587 또는 25를 사용하는 경우 false
    • auth : 계정 정보

 

일반적으로 아래의 정보를 가지고 transporter 객체를 생성할 수 있다.

const transporter = nodemailer.createTransport({
  host: "smtp.example.com",
  port: 587,
  secure: false,
  auth: {
    user: "username",
    pass: "password",
  },
});

 

SMTP를 제공해주는 유명한 서비스인경우 service 속성을 통해서 host, port, secure 정보 없이 간편하게 작성할 수 있다.

const transporter = nodemailer.createTransport({
	service: 'gmail',
  auth: {
    user: "지메일 아이디",
    pass: "앱 비밀번호",
  },
});

 

메일 전송

메일을 전송하기 위해서는 transporter 객체의 sendMail 메서드를 사용하면 된다. 기본적으로 메일 전송시에 사용되는 속성은 아래와 같다.

const message = {
  from: "sender@server.com",
  to: "receiver@sender.com",
  subject: "Message title",
  text: "Plaintext version of the message",
  html: "<p>HTML version of the message</p>",
};

transporter.sendMail(message, (error, info) => {

});
  • from : 보내는 사람 주소
  • to : 받는 사람 주소
  • subject : 메일 제목
  • text : 메일 본문 텍스트
    • 일반 텍스트만 사용 가능
  • html : 메일 본문 html
    • HTML 태그를 활용해서 다채롭운 메일 전송 가능

sendMail 의 두번째 파라미터로 콜백함수를 전달 할 수 있다. 메일 전송이 완료되면 error info 객체를 전달받을 수 있다.

💡 에러만 발생했다면 error의 값이 null이 아닌 값을 전달 받는다.

 

🛒 첨부파일

data uri

메일 전송시 data uri를 통해 첨부파일을 전송할 수 있다. 클라이언트에서 파일을 업로드 하여 data uri를 서버로 전달 후 해당 data uri를 전달하는 방법을 알아보겠다.

 

프론트

아래와 같이 FileReader 를 통해서 업로드한 파일의 data uri를 생성할 수 있다.

const handleChange = (e) => {
	const [file] = e.target.file.files;
  const reader = new FileReader();

  reader.readAsDataURL(file);
  reader.onloadend = () => {
    const base64 = reader.result;
    const base64Sub = base64.toString() || "";   
  };
};

💡 위 코드에서 `base64Sub` 가 결과값.

 

서버

sendMail 전송 시 attachments 속성을 전달하면 첨부파일을 보낼 수 있다. 이때 배열을 전달한다. data uri에서 사용되는 속성은 filename  path 를 사용하면 된다.

const dataURI = request.dataURI;

const message = {
  from: "sender@server.com",
  to: "receiver@sender.com",
  subject: "Message title",
  text: "Plaintext version of the message",
  attachments: [
    {
      filename: '파일명',
      path: dataURI,
    }
  ]
};

transporter.sendMail(message);