Nodemailer
Nodemailer는 이름에서 알 수 있듯이 node 기반의 메일을 쉽게 보낼 수 있는 라이브러리다.
설치
yarn을 이용하는 경우
yarn add nodemailer
npm을 이용하는 경우
npm install --save nodemailer
메일을 보내보자
/* mail.js */
var nodemailer = require('nodemailer');
var smtpConfig = {
host: ${SMTP Server 주소},
port: ${SMTP SErver 포트},
secure: true, // use SSL
auth: {
user: ${SMTP ID},
pass: ${SMTP 비밀번호}
}
};
var mailOptions = {
from: ${받는사람 메일 주소},
to: ${보내는사람 메일 주소},
subject: ${제목},
text: ${본문 내용}
};
var smtpTransport = nodemailer.createTransport(smtpConfig);
smtpTransport.sendMail(mailOptions, function (error/*, response*/) {
if (error) {
console.log(error);
} else {
console.log('Complete');
}
smtpTransport.close();
});
실행
node mail.js
위 코드에 ${} 형태로 된 부분만 각자 입맛에 맛게 채워주면 끝이다.
파일을 첨부해보자
메일을 보낼 때 파일을 첨부하고 싶은 경우 mailOptions에 attachments 값을 넣어 주면 끝이다.
node에서 파일을 읽기 위해서는 fs를 사용한다.
/* mail.js */
var nodemailer = require('nodemailer');
var fs = require('fs');
var smtpConfig = {
host: ${SMTP Server 주소},
port: ${SMTP SErver 포트},
secure: true, // use SSL
auth: {
user: ${SMTP ID},
pass: ${SMTP 비밀번호}
}
};
var mailOptions = {
from: ${받는사람 메일 주소},
to: ${보내는사람 메일 주소},
subject: ${제목},
text: ${본문 내용}
};
var smtpTransport = nodemailer.createTransport(smtpConfig);
smtpTransport.sendMail(mailOptions, function (error/*, response*/) {
if (error) {
console.log(error);
} else {
console.log('Complete');
}
smtpTransport.close();
});
원하는 파일을 읽어서 attachments 배열에 원하는 파일을 넣어주면 되는데 형태는 아래와 같다.
{
filename: ${파일 이름},
content: ${파일 내용}
}
myDir이란 디렉토리 안의 모든 파일을 첨부파일로 넣기 위해 fs.readdirSync과 fs.createReadStream을 사용한다.
/* mail.js */
var nodemailer = require('nodemailer');
var moment = require('moment');
var fs = require('fs');
var smtpConfig = {
host: ${SMTP Server 주소},
port: ${SMTP SErver 포트},
secure: true, // use SSL
auth: {
user: ${SMTP ID},
pass: ${SMTP 비밀번호}
}
};
var mailOptions = {
from: ${받는사람 메일 주소},
to: ${보내는사람 메일 주소},
subject: ${제목},
text: ${본문 내용}
attachments: _getFiles()
};
var smtpTransport = nodemailer.createTransport(smtpConfig);
smtpTransport.sendMail(mailOptions, function (error/*, response*/) {
if (error) {
console.log(error);
} else {
console.log('Complete');
}
smtpTransport.close();
});
function _getFiles() {
var attachments = [];
fs.readdirSync('myDir').forEach(function (item) {
attachments.push({
filename: item,
content: fs.createReadStream(['myDir', item].join('/'))
})
});
return attachments;
}
추가
Nodemailer를 이용해서 메일을 보낼때 아래와 같은 에러를 발견하게 됐다.
{ Error: unable to verify the first certificate
at TLSSocket.<anonymous> (_tls_wrap.js:1108:38)
at emitNone (events.js:105:13)
at TLSSocket.emit (events.js:207:7)
at TLSSocket._finishInit (_tls_wrap.js:638:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:468:38) code: 'ECONNECTION', command: 'CONN' }
인증서와 관련된 문제인듯 한데. 정확히는 모르겠지만 SMTP 서버에서 사용하는 SSL 인증서가 인증기관에서 발급받은게 아니라는 에러인듯 하다.
아마 SSC(Self Signed Certificate)를 사용하는 것 같다.
이 에러를 당장 해결(무시?)할 수 있는 방법은 두 가지가 있다.
1. node 환경 변수 `NODE_TLS_REJECT_UNAUTHORIZED=0`로 값을 설정.
NODE_TLS_REJECT_UNAUTHORIZED=0 node mail.js
2. Nodemailer의 옵션 설정
var smtpConfig = {
...
tls: {
rejectUnauthorized: false
}
};
댓글
댓글 쓰기