[Node] 이메일 전송
이메일을 보내기 위해서는 SMTP를 사용해야 한다. 지메일 또는 네이버에서는 기본적으로 SMTP 서버를 활용해서 메일을 전송하게 된다.
지메일의 SMTP를 사용하기 위해서는 앱 비밀번호를 생성해야 한다.
- 프로필에서 계정 관리
- 보안
- 2단계 인증
- 하단에 앱 비밀번호
💡 앱 비밀번호 위치는 달라질 수 있음. 비밀번호를 기억해놓자.
🎈 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);