[node.js] nodemailer통해서 gmail로 메일 전송하기
nodemailer가 언제 업데이트되었는지 구글링으로 찾은 gmail 인증 방법이 작동하지 않는다.
좀더 구글링해보니 nodemailer가 업데이트되면서 oauth2가 기본내장되어 xoauth2를 쓰는 방법이 작동하지 않는 것이었다. xoauth2를 계속사용하면 responsecode: 535, username and password not accepted 라는 오류가 나온다.
간단히 구글 아이디 비밀번호로도 gmail 전송이 되긴 하지만 oauth2를 통한 방법이 보안에 훨씬 좋으면서도 gmail에서 차단하지 않는다.
node.js 코드 예제
const nodemailer = require('nodemailer');
let transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
type: 'OAuth2',
user: '메일주소',
clientId: 'xxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
clientSecret: 'xxxxxxxxxxxxxxxxxxxx',
refreshToken: '1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
accessToken: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
expires: 3600
}
});
let mailOptions = {
from:{
name: 'xxxxx',
address: 'xxxxxx@gmail.com'
}, // sender address
to:{
address: 'xxxxxxxxx@xxxx.xxx'
}, // list of receivers
subject: "xxxxxxxxx", // Subject line
html: "xxxxxxxxxxxxxxxxx" // html body
};
transporter.sendMail(mailOptions, (error, info) => {
console.log(error,info)
});
이제 auth에 쓰이는 변수들을 얻어야한다.
인증정보 획득
서버에서 메일을 보내기위한 인증 절차이다.
구글링해보니 여기까지는 친절한 정보가 많이 있으므로 여기선 글로만 설명한다.
두 사이트에 접속한다
https://console.developers.google.com/apis
https://developers.google.com/oauthplayground/
구글 API에서 프로젝트가 없다면 생성한 후 라이브러리에서 Gmail API를 사용하도록 설정한다.
인증정보가 없으니 생성하라고 할텐데,
인증정보를 생성한다.
만들어야할 것은 OAuth 클라이언트 ID 이며 유형은 무난하게 웹애플리케이션을 선택한다.
승인된 리디렉션 URI에 https://developers.google.com/oauthplayground 를 입력한다.
(혹시모르니 http://developers.google.com/oauthplayground도 입력한다.)
나머지칸은 비워도된다.
클라이언트 ID를 생성하면 클라이언트 ID와 클라이언트 시크릿이 생성된다.
이 두 값은 위의 node.js코드에도 넣어야하고,
oauth playground 사이트에서 오른쪽 톱니를 누른 후
Use your own OAuth credentials 에 체크하면 나오는 두 칸에 각각 붙여넣는다.
왼쪽에 Input your own scopes 입력하는곳에 https://mail.google.com/ 을 입력하고 Authorize API 를 누르면 인증절차가 진행된다.
여기서 갑자기 막힐 수 있는데, invalid = mail.google.com 어쩌고 하면서 오류가 나는것이다.
자세히알아보기를 클릭해 들어가서 'Risky Access Permissions By Unreviewed Apps' 링크를 따라들어가면 어떤 그룹에 가입하게되는데 가입하면 인증이 문제없이 진행된다.
이제 파란버튼을 누르면 Refresh token과 Access token값이 나오는데 Auto-refresh the token before it expires.에도 체크해준다. 이 두값을 역시 위의 node.js 코드에 붙여넣는다.
이제 node.js를 실행하면 정상적으로 메일이 발송된다.
gmail은 하루 500건까지 발송제한이 있다고 하는데, 500건 미만에서도 발송제한이걸리기도 하는 모양이다.
또한 수상한 링크는 gmail에서 발송자체를 차단해버린다. 메일이 자꾸 반송되어온다면 링크를 삭제해야한다.