티스토리 뷰

 

현재 듣고 있는 노드 js 강의에서 진행중인 authentication 수업에서는 node js에서 email 보내는 것을 SendGrid라는 api를 통해 진행했습니다

하지만 자꾸 SendGrid에서 제 계정을 block 하는 탓에.. 제대로 이메일 발송을 할 수 없었고 그래서 저는 구글에서 제공하는 gmail api로 변경하여 구현하였습니다

 

일단 이를 위해서는 npm과 최신버전 node js가 설치되어있는 환경이 필요 합니다!

 

0. 먼저 노드 js에 nodemailer를 설치해주세요.

npm install --save nodemailer

 

1. 구글 계정 설정 -> 보안 -> 덜 안전한 app 접근 허용을 해줍니다.

 

2. accounts.google.com/DisplayUnlockCaptcha 에 들어가 continue를 눌러줍니다. 이는 Captcha 프로그램을 일시적으로 unlcok해줍니다. 이걸 하지 않으면 이메일을 발송할 때 error: connect ETIMEDOUT가 떠요

 

3. 구글 개발자 콘솔에 들어가서 console.developers.google.com/apis 프로젝트를 생성해주세요. 이름은 임의로 지으셔도 됩니다.

 

4. 그 다음 개발자 콘솔 -> 라이브러리로 가서 Gmail API를 검색해 찾아주시고 활성화 시켜주세요!

 

5. 클라이언트와 클라이언트 시크릿을 받기 위해서 사용자 인증정보 탭 -> 사용자 인증정보 만들기 -> OAuth 클라이언트 ID를 선택해주세요

 

6. 아래와 같이 어플리케이션 타입을 웹 어플리케이션으로 정해주시고 승인된 리다이렉션 URI 에는 구글 OAuth의 플레이 그라운드의 주소를 입력해주셔야 합니다.  그러지 않으면 나중에 본인의 개발자 콘솔과 연동이 되지 않습니다. https://developers.google.com/oauthplayground

7. 이렇게 생성하면 클라이언트 ID와 클라이언트 시크릿이 생성됩니다. 그러면 이를 복사해줍니다. ( JSON 파일로도 저장해놓을 수 있습니다.)

 

8. 이제 인증을 위해서 refresh token과 access token을 발급받아야 합니다.

https://developers.google.com/oauthplayground

위의 주소로 가시면 오른쪽 상단에 보이는 톱니바퀴 모양을 누릅니다. 그리고 Use your own OAuth credentials를 체크하고 앞서 발급받은 클라이언트 ID와 클라이언트 시크릿을 입력해주고 close 합니다.

 

 

 

9.  그리고 왼쪽의 Select & Authorize API 항목을 클릭한 후 gmail api를 찾아주고 Authorize API를 클릭해줍니다.

그러면 본인의 계정의 개발자 콘솔과 연동되어서 진행이 될 것이고, 신뢰할 수 없는 앱이라는 경고창이 뜰 것입니다. 이 때 그냥 무시하고 진행해주세요. 

 

여기서 개발자 콘솔과 연동되지 않는다면 개발자 콘솔로 돌아가서 OAuth 클라이언트 정보를 다시 확인해주세요!

특히나 승인된 리다이렉션 URI에 구글 OAuth 플레이 그라운드의 주소를 넣었는지 잘 확인해주세요! ( 대쉬'/' 하나라도 더 들어가면 mismatch 됩니다)

 

10. 이제 step 2에 들어와서 Exchange authorization code for tokens 를 눌러주시면 refresh token 과 access token 이 생성됩니다.

 

 

11. 이제 노드 js 파일에 아래와 같이 구현을 해주세요

const nodemailer = require('nodemailer');

const sendMail = async (to, subject, html) => {
    const googleTransporter = await nodemailer.createTransport({
        host:  'smtp.gmail.com',
        port: 465, 
        secure: true,
        auth:{
            type:'OAuth2',
            user: '<본인의 구글 계정  >',
            clientId:'<발급받은 client ID>',
            clientSecret:'<발급받은 client secret> ',
            refreshToken: '<발급받은 refreshtoken>',
            accessToken: '<발급받은 accessToken>',
            expirse: 3600
        }
    }),
    mailOptions = {
        from: '<보내는 사람 이름, <test@test.gmail.com>>',
        to,
        subject,
        html
    }
    try{
        await googleTransporter.sendMail(mailOptions);
        googleTransporter.close();
        console.log(`mail have sent to ${ to }`);
    } catch(err){
        console.log(err);
    }
}
sendMail('randomuser@gmail.com', 'Welcome to our shop!', '<p>hi!</p>');

그리고 이렇게 보내면 됩니다

 

 

참조 : blog.eunsatio.io/develop/nodemailer%EC%99%80-gmail%EB%A1%9C-%EB%A9%94%EC%9D%BC-%EB%B0%9C%EC%86%A1%ED%95%98%EA%B8%B0-%E3%85%A1-OAuth2

 

메일보낼때 ETIMEDOUT 에러가 계속 뜬다면 아래 포스팅을 참조해보세요! firewall의 문제일 수도 있어서 포트 번호를 바꾸거나 PC를 재부팅하면 해결된다기도 합니다. 저도 이 에러가 계속 떴는데, 저는 captcha 를 제대로 unblock 하지 않은 문제였습니다

github.com/nodemailer/nodemailer/issues/749

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함