-
[NodeJS] 간단히 구현해 본 메일발송 예제Javascript & TypeScript 2021. 2. 27. 17:32반응형
예전에 .NET 기반으로 메일발송 예제를 간단히 구현해본 적이 있었다.
ddochea.tistory.com/78?category=568955
이번엔 nodeJS 기반으로 구현해보았다. 닷넷때와 마찬가지로 실제 발송 메일계정이 존재하지 않아도 되는데, 이번엔 날짜 패키지인 moment를 제외하고 직접 구현했다. 물론 통신기능 구현 연습차 작업한 코드라서 실제 모듈로서 사용하기엔 부적합하다.
const net = require('net'); const moment = require('moment'); // MX레코드를 확인하여 host 에 넣는다. 기존 SMTP 통신이므로 포트번호는 25를 쓴다. const socket = net.connect({ host: 'outlook-com.olc.protection.outlook.com', port: 25, writable: true }); socket.on('connect', function () { console.log('connect'); }); let i = 0; const proto = [ "HELO outlook.com\r\n", "MAIL FROM:<sender@example.com>\r\n", "RCPT TO:<수신받을메일주소>\r\n", "DATA\r\n", "QUIT\r\n" ]; socket.on('data', function(data) { const res = data.toString("ascii", 0, data.length).split(' '); console.log("res:", res); if(res[0] == '354'){ // DATA 를 전달하여 354 응답코드를 받았을 경우엔 .으로 끝낼때까지 메일발송 정보를 전달해야한다. console.log("send:","mail datas"); socket.write(`From: "sender" <sender@example.com>\r\n`); socket.write(`To: "ddochea" <수신받을메일주소>\r\n`); socket.write(`Date: ${moment().format('llll')}\r\n`) socket.write(`Subject: Test message\r\n`) socket.write(`\r\n`); // 메일 헤더 끝 socket.write(`Hello\r\n`); socket.write(`Bye\r\n`); socket.write(`.\r\n`); // 메시지 끝 } else { // 원랜 수신된 코드번호가 250 이어야 다음단계를 진행해야 하지만 그냥 구현해본 것이므로 넘어간다. console.log("send:",proto[i]); socket.write(proto[i]); i++; if(i == proto.length) { socket.end(); socket.destroy(); } } }) socket.on('error', function(err){ console.error(err); }) socket.on('close', function() { console.log('send done'); }) // 구현 결론 : smtp 프로토콜은 그냥 구현된 거 쓰세요. (https://github.com/xpepermint/smtp-client)
금방 구현할 줄 알았는데 개행문자(\r\n) 없이 통신하면 안된다는걸 깨닫는데 오래걸렸다.
발송환경에 따라 일부 사이트에선 block 당해 발송 테스트를 해볼 수 없었다. 환경에 따라 성공/실패하는 사이트가 다르다.
회사에선 dotnet 기반으로 메일발송엔진을 개발중인데, 개인프로젝트론 nodeJS 기반으로 한번 구현해볼까 싶다.
반응형'Javascript & TypeScript' 카테고리의 다른 글
[React] React Router를 적용해도 첫 메인페이지("/") 위치만 표시되는 현상 해결법 (0) 2021.04.26 [gRPC] nodeJS 에선 google.protobuf.Any 가 지원되지 않는다. (3) 2021.03.01 [Javascript] moment로 audio 태그의 currentTime 및 duration 값을 mm:ss 형식으로 쉽게 표시하기 (0) 2021.02.13 [React Hook] 상태 훅(State Hook)을 내부함수로 정의할 경우 유의사항 (0) 2021.02.12 [React Hook] 상태 훅(State Hook)을 EventListener에 사용시 유의사항 (1) 2021.02.11