이메일 전송 기능이 필요해서 Mailgun 서비스를 사용해보았는데, 간단한 테스트 메일 보내기까지 예상치 못하게 1시간 이상 걸렸다. 어떤 문제가 있었고 어떻게 해결했는지 글로 정리해본다.
(Mailgun을 처음 사용해보는 것이라 관련 지식이 많지는 않습니다.)
개발 중인 프로젝트에 적용해볼 예정이라 무료 플랜을 쓰다 나중에 유료로 전환할 예정이었고, https://www.mailgun.com/pricing/ 페이지에서 Try For Free 버튼을 통해 신용 카드 등록 없이 무료 플랜으로 사용이 가능했다. (사용 기한이 있는지는 아직 잘 모르겠다)
필요한 기능은 내가 소유한 도메인의 메일 주소로 메일을 발신하는 기능었다. Send -> Sending -> Domains 에서 Mailgun에 도메인 설정을 추가했다.

Domain settings -> Records 탭에 가서 도메인 소유권 확인 등을 위한 레코드 추가 셋팅 값들을 확인할 수 있다. 이 정보를 도메인 관리 사이트에가서 레코드로 추가해줘야한다.

나는 AWS Route53에서 도메인을 관리하고 있어서 여기에 추가해주었다. 한가지 어려웠던건 상단의 긴 TXT 타입의 Value를 복사 붙여넣기로 입력할 때 문자열이 너무 길다는 에러가 발생했다.
InvalidChangeBatch 400: CharacterStringTooLong (Value is too long) encountered with ...
Chat-GPT 및 Route 53에서 255자보다 긴 TXT 레코드를 구성하려면 어떻게 해야 합니까? 가이드를 참고하여 해결했는데, 예를들어 값이 아래와 같다면,
k=rsa; p=aaaaaaaaabbbbbbbbbbbccccccccccdddddddddddddeeeeeeeeeeffffffgggggggghhhhhhhhhhiiiiiiiijjjjjjjkkkkkkllllllllllnnnnnnmmmmmm
✅ 다음과 같이 각 부분별로 잘라서 따옴표로 묶어서 입력해야한다. (각 부분은 최대 255자까지 가능)
"k=rsa; ""p=aaaaaaaaabbbbb""bbbbbbccccccccccddddddddd""ddddeeeeeeeeeeffffffgggg""gggghhhhhhhhhhiiiiiiiijj""jjjjjkkkkkkllllllllllnnnnnnmmmmmm"
❌ 참고로 이렇게 개행을 하면 안된다:
"k=rsa;"
"p=aaaaaaaaabbbbb"
"bbbbbbccccccccccddddddddd"
"ddddeeeeeeeeeeffffffgggg"
"gggghhhhhhhhhhiiiiiiiijj"
"jjjjjkkkkkkllllllllllnnnnnnmmmmmm"
이메일 전송 기능만 활용할 예정이라 Sending records, Tracking records 이 두 항목만 셋팅했다. 레코드 셋팅 후 상단에 Verify 버튼을 눌러 Status가 Active 상태로 바뀌었다면 잘 셋팅된 것이다. 나는 신규 레코드 셋팅이라 그런지 딜레이 없어 바로 되었는데, 기존것을 변경한다면 DNS Cache 시간이 있어서 조금 기다려야할 수 있다.
AWS Route53 Web Console 입력기 기준이므로 다른 서비스를 사용할 경우 차이가 있을 수 있어요. 어떤 서비스에서는 이런 부분을 자동으로 처리해 줄 것 같다고 생각!
Dashbaord에서 API Keys 링크를 찾아 API Keys 페이지에 가서 Add new key API key를 생성할 수 있다. 이 부분은 어려운건 없다.
Get Started -> Send a Test Email -> API -> NODE 에서 Nodejs 예제 코드를 확인할 수 있다.

예제 코드는 다음과 같다. (실제 코드를 그대로 복사 한 뒤, 나의 소유 도메인만 my-service.com 으로 수정함)
const formData = require('form-data');
const Mailgun = require('mailgun.js');
const mailgun = new Mailgun(formData);
const mg = mailgun.client({username: 'api', key: process.env.MAILGUN_API_KEY || 'key-yourkeyhere'});
mg.messages.create('sandbox-123.mailgun.org', {
from: "Excited User <mailgun@my-service.com>",
to: ["test@example.com"],
subject: "Hello",
text: "Testing some Mailgun awesomeness!",
html: "<h1>Testing some Mailgun awesomeness!</h1>"
})
.then(msg => console.log(msg)) // logs response data
.catch(err => console.log(err)); // logs any error
위에서 만든 API Key를 MAILGUN_API_KEY 환경 변수로 제공하여 시도해봤는데 아래와 같은 에러가 발생했다.
[Error: Unauthorized] {
status: 401,
details: 'Forbidden',
type: 'MailgunAPIError'
}
샘플 코드가 매우 불친절하다고 생각했고, 이 글을 쓰는 계기가 되었다. 결론은 sandbox-123.mailgun.org를 나의 도메인으로 변경해야한다. 예제 코드가 from 부분은 내 도메인을 사용해서 알려주고, create 메서드의 첫번째 인자에는 sandbox-123.mailgun.org 같은 Mailgun 서비스 서버 주소 같은 것을 알려주는게 매우 헷갈렸던 포인트였다. 예를들어 my-service.com 도메인을 사용한다면 아래와 같은 코드가 되어야한다.
const formData = require('form-data');
const Mailgun = require('mailgun.js');
const mailgun = new Mailgun(formData);
const mg = mailgun.client({username: process.env.MAILGUN_API_KEY, key })
mg.messages.create('my-service.com', {
from: "Excited User <support@my-service.com>",
to: ["b6pzeusbc54tvhw5jgpyw8pwz2x6gs@gmail.com"],
subject: "Hello",
text: "Testing some Mailgun awesomeness!",
html: "<h1>Testing some Mailgun awesomeness!</h1>"
})
.then(msg => console.log(msg)) // logs response data
.catch(err => console.log(err)); // logs any error
support 부분은 다른걸로 바꾸어도된다.
참고로 수신을 gmail로 하니 스팸함으로 들어와있었다. 끝.