[prismagram] [BackEnd] 8. nodemailer를 활용한 메일보내기 - Part1

업데이트:

모든 내용은 MacOS Catalina 기준으로 작성되었습니다

await, async, _, args 등 JavaScript내용은 따로 정리하겠습니다.

1. nodemailer 설치하기

nodemailer를 활용하여 메일을 보내봅시다.
먼저 nodemailer를 설치합니다.

yarn add nodemailer

nodemailer를 설치했으면 utils.js에 메일에 들어갈 내용을 작성해줍니다.

export const sendMail = email => null;

export const sendSecretMail = (adress, secret) => {
    const email = {
        from: 'sbs@prismagram.com',
        to: adress,
        subject: '🔒Login Secret for Prismagram🔒',
        html: `Hello Your login secret is ${secret}. <br/> Copy paste on the app/website to login`
    };
};

2. transport 설치하기

그런데, 메일을 전송해주기 위해서는 transport를 설치해줘야 합니다. 일단 sendgrid를 사용해보겠습니다.
sendgrid에서 회원가입을 하고 sendgrid transport를 설치합니다.

yarn add nodemailer-sendgrid-transport

utils.js에 노드메일러와 트랜스포트를 import 합니다.

import nodemailer from 'nodemailer';
import sgTransport from 'nodemailer-sendgrid-transport';

그리고 export const sendMail = email => null;에서 null을 지우고 api_user와 api_key를 입력합니다.

export const sendMail = email => {
    const options = {
        auth: {
            api_user: 'SENDGRID_USERNAME',
            api_key: 'SENDGRID_PASSWORD'
        }
    };
};

그리고 username과 password는 .env에 저장합니다.

SENDGRID_USERNAME="사용자이름 입력";
SENDGRID_PASSWORD="비밀번호 입력";

server.js에 utils를 import 합니다.

import './utils';

console.log로 .env 상의 내용을 확인하면 undefined로 출력되는데 이는 server와 util에 동일한 내용을 import 해주면 해결됩니다.

utils.js

import dotenv from 'dotenv';
import path from 'path';
dotenv.config({ path: path.resolve(__dirname, '.env') });

3. 메일 전송되는지 테스트해보기

sendSecretmail은 내부에서 실행되는 함수이므로 export를 지웁니다.

const sendSecretMail = (adress, secret) => {
    const email = {
        from: 'sbs@prismagram.com',
        to: adress,
        subject: '🔒Login Secret for Prismagram🔒',
        html: `Hello Your login secret is ${secret}. <br/> Copy paste on the app/website to login`
    };
};

server.js에 함수를 실행시켜봅니다.

import { sendSecretMail } from './utils';

sendSecretMail('k1a11220@naver.com', '123');

그런데, sendgrid가 계정승인을 안해줘서 mailgun으로 바꾸겠습니다.

이슈

yarn dev 할때 포트 중복이라고 오류가 나옵니다

events.js:298
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE: address already in use :::4000
    at Server.setupListenHandle [as _listen2] (net.js:1309:16)
    at listenInCluster (net.js:1357:12)
    at Server.listen (net.js:1445:7)
    at /Users/beomsoo/Documents/GitHub/prismagram/node_modules/graphql-yoga/src/index.ts:391:22
    at new Promise (<anonymous>)
    at GraphQLServer.start (/Users/beomsoo/Documents/GitHub/prismagram/node_modules/graphql-yoga/src/index.ts:389:12)
    at Object.<anonymous> (/Users/beomsoo/Documents/GitHub/prismagram/src/server.js:16:8)
    at Module._compile (internal/modules/cjs/loader.js:1157:30)
    at Module._compile (/Users/beomsoo/Documents/GitHub/prismagram/node_modules/pirates/lib/index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1177:10)
Emitted 'error' event on WebSocketServer instance at:
    at Server.emit (events.js:321:20)
    at Server.EventEmitter.emit (domain.js:482:12)
    at emitErrorNT (net.js:1336:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'EADDRINUSE',
  errno: 'EADDRINUSE',
  syscall: 'listen',
  address: '::',
  port: 4000
}

nodemon에 –delay 2s를 추가하거나 포트값을 변경해도 동일하게 오류가 나옵니다. 따라서 그냥 server.js에 시작포트를 입력해줍니다.

server.start({ port: 4000 }, () => console.log(`Server running on port http://localhost:${PORT}`));

댓글남기기