MailHog 로 개발/테스트 메일 서버(SMTP EMail Server) 구성하기



개요


서비스를 개발하다 보면 이메일을 사용하여 안내 메일을 전송할 경우가 많이 생깁니다.

예로 회원 가입/탈퇴등의 이벤트가 발생할때 고객 통보나 비밀 번호 찾기 기능등에는 email 전송은 필수 기능입니다.

문제는 개발 서버에 SMTP 서버를 구성하는건 꽤 번거로운 일이고 개발용으로 메일을 보내려다 실수로 운영 환경에서 실제 계정에 대량 메일을 보내는등의 실수를 할수 있다는 점입니다.


하지만 이메일 서버가 없으면 이벤트시 메일 보내는 기능에서 오류가 날수 있기때문에 운영 여부를 확인해서 이메일을 보내지 않도록 하드 코딩을 하거나((warning)) DI(Dependency Injection ) 패턴을 사용하여 개발 서버에서는 더미 이메일 클래스를 사용하고 운영에서는 실제 전송 로직을 처리하도록 하는 경우가 많았습니다.


MailHog 란


mailHog 는 이런 골치 아픈 문제를 해결해 주는 로컬 시스템용 SMTP 서버로 go 언어로 구현했으므로 별도의 의존성 필요없이 하나의 실행 파일만 있으면 되는 간편한 도구입니다.


SMTP 프로토콜을 구현했으므로 sendmail 이나 postfix 같은 SMTP 처럼 사용하면 되며 코드를 변경할 필요없이 SMTP 서버 주소만 Mailhog 포트로 변경해 주면 됩니다.


또 웹 기반의 관리자 기능을 제공하므로 메일 송신 이력 및 실제 메일 메시지를 조회할 수 있는 기능도 제공합니다.


설치는 매우 간단한데 MailHog github 의 Release 탭을 클릭해서 사용하는 운영 환경에 맞는 바이너리를 다운받으면 됩니다.



사용


다운받은 MailHog 를 실행하면 아래와 같은 메시지를 출력하고 서버가 하나 기동됩니다.


기본 SMTP 포트는 1025 이므로 mailer 설정에 SMTP 서버는 localhost, port 는 1025, 별도의 인증은 없다고 설정하면 됩니다.


예로 제가 즐겨 사용하는 laravel framework 에서는 아래와 같이 설정 파일(.env) 에 구성해 주면 됩니다.

MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null


이제 app 에서 메일을 보냈으면 관리자로 접속해서 메일 메시지를 확인할 수 있습니다.

관리자 포트는 8025 이므로 웹 브라우저로 이 포트에 연결하면 아래와 같은 화면을 볼 수 있습니다.


좌측의 Inbox 에서는 전체 송신한 메일 갯수가 표시되고 가운데에는 메일 목록이 표시되며 클릭하면 메일에 대한 상세 정보를 볼 수 있습니다.


Jim 으로 예외 대응하기


일이라는 건 늘 계획대로 되지 않고 더불어 예측하지 못한 다양한 문제까지 생기기 마련입니다.


이메일을 보내는 일만 해도 메일 서버가 죽거나 메일 서버의 인증 방식이 바뀌거나 상대방의 주소가 잘못 됐거나 상대방의 메일함이 꽉 차서 메일이 전송되지 않는등 다양한 문제를 겪을수 있습니다.


품질이 낮은 프로그램은 이런 상황을 만나면 예외를 제대로 체크하지 않아서 성공으로 표시해서 메일이 누락되거나 엉뚱한 예외를 표시하거나 심지어는 프로그램이 죽어버릴 수도 있습니다.


MailHog 는 이런 다양한 예외에 대응할 수 있도록 Jim 이라고 불리는 Chaos Monkey 기능을 내장했습니다.



좌측에서 Enable Jim 버튼을 클릭하면 Jim 이 활성화되고 랜덤하게 다양한 예외 상황이 생성됩니다.


위에서는  0.5% 확율로 랜덤하게 세션이 끊기며(disconnect chance ) 인증 거부가 전체 실행건 대비(Reject auth chance)  5% 확율로 발생하게 되므로 다양한 예외 상황에 맞게 프로그램을 작성할 수 있습니다.

MailHog 구동시 Jim 이 발생하는 다양한 예외 상황을 옵션으로 제어할 수 있으며 자세한 내용은 Jim 매뉴얼을 참고하세요.