Postmark에서 옮기기
Postmark 라이브러리는 그대로 두고 OpenEmail을 통해 보냅니다. 호스트와 서버 토큰만 바꾸면 보내는 코드는 그대로입니다.
바꿀 것
라이브러리가 https://api.openemail.uk/compat/postmark를 가리키게 하고, 서버 토큰 자리에 emails:send 권한이 있는 OpenEmail API 키를 넣으세요. 키는 같은 X-Postmark-Server-Token 헤더로 전달됩니다. 메일을 보내는 호출은 그대로이며, 메시지가 나갈 수 있는지는 OpenEmail의 다른 모든 곳과 마찬가지로 From 주소가 정합니다.
import { ServerClient } from 'postmark' const client = new ServerClient(process.env.OPENEMAIL_API_KEY, { requestHost: 'api.openemail.uk/compat/postmark',}) await client.sendEmail({ From: '[email protected]', To: '[email protected]', Subject: 'Your invoice', HtmlBody: '<p>Your invoice is attached.</p>', MessageStream: 'outbound',})Node에서는 requestHost에 호스트와 경로를 함께, 스킴 없이 끝 슬래시도 없이 넣습니다. Ruby에서는 path_prefix의 양 끝에 슬래시가 필요합니다. Python에서는 공식 postmark-python 패키지를 base_url과 함께 쓰세요. 커뮤니티 패키지인 postmarker는 호스트 아래 경로에 닿지 못하므로 여기서는 동작하지 않습니다. PHP에서는 PostmarkClient::$BASE_URL에 스킴, 호스트, 경로를 끝 슬래시 없이 넣습니다. 이 값은 static이므로 프로세스의 모든 Postmark 클라이언트에 적용되며, PostmarkAdminClient도 마찬가지입니다.
무엇이 무엇에 대응하나
제공하는 엔드포인트는 POST /email, /email/batch, /email/withTemplate, /email/batchWithTemplates입니다. 필드 이름은 Postmark와 마찬가지로 대소문자를 가리지 않고 맞추며, 빈 문자열은 생략한 것으로 봅니다.
| Postmark | OpenEmail에서 |
|---|---|
| From | 발신자와 그 이름. |
| To | 쉼표로 구분한 수신자. Cc, Bcc와 합쳐 메시지당 최대 50명입니다. |
| ReplyTo | 회신 주소 하나. |
| Subject | 제목. |
| HtmlBody | HTML 본문. TextBody는 텍스트 본문이 되며, 둘 중 하나는 필수입니다. |
| Headers | Name과 Value로 주는 사용자 지정 헤더: X-*, List-*, Reply-To, Precedence, Auto-Submitted, Importance, Priority, Feedback-ID. |
| Attachments | 파일은 최대 20개, 합계 5MB까지. HTML이 cid:로 ContentID를 참조하는 이미지는 그 자리에 삽입됩니다. 그 밖의 파일은 일반 첨부로 도착합니다. |
| Tag | tag라는 이름의 태그. |
| Metadata | 같은 이름과 값을 가진 태그. Tag와 합쳐 메시지당 최대 10개입니다. |
| TrackOpens | 그 메시지의 열람 추적을 켜거나 끕니다. |
| TrackLinks | HtmlAndText와 HtmlOnly는 클릭 추적을 켜고, None은 끕니다. |
| MessageStream | outbound, 또는 다른 트랜잭션 스트림의 ID면 메시지를 평소대로 보냅니다. |
| TemplateAlias | OpenEmail 템플릿의 슬러그 또는 ID(tpl_...)로, TemplateModel의 값으로 채워집니다. InlineCss는 받아들이지만 아무것도 바꾸지 않습니다. |
거부되는 것과 그 이유
- ErrorCode 1101과 함께 거부되는
TemplateId. Postmark 템플릿 ID는 여기서 의미가 없으므로, OpenEmail에서 템플릿을 다시 만들고 그 슬러그나 ID를TemplateAlias로 보내세요. - ErrorCode 1236과 함께 거부되는
broadcast스트림. 이 엔드포인트들은 트랜잭션 메일을 보내며, 뉴스레터는 OpenEmail 브로드캐스트로 보냅니다. - 템플릿을 쓰는 메시지의
Subject,HtmlBody,TextBody. 템플릿이 제공하므로 ErrorCode 1123과 함께 거부됩니다.TextOnly로 설정한TrackLinks도 거부됩니다. OpenEmail은 HTML 부분의 링크를 추적하기 때문입니다. - 두 개 이상의 회신 주소, 두 번 주었거나 위 목록에 없는 헤더, 10개를 넘는 태그, 영문자·숫자·
_·-외의 문자가 들어간 태그 이름이나Metadata이름. - ErrorCode 410과 함께 거부되는, 메시지가 100통을 넘는 배치. Postmark는 500통까지 받으므로 더 큰 배치는 나누세요.
응답과 오류
- 발송은
To,SubmittedAt,MessageID, 값이 0인ErrorCode, 값이 OK인Message와 함께 200으로 응답합니다.MessageID는GET /emails/{id}와 웹훅이 쓰는 OpenEmail 메시지 ID입니다.Idempotency-Key헤더는 API의 다른 곳과 똑같이 동작합니다. - 배치는 메시지마다 결과 하나씩, 같은 순서로 담아 200으로 응답합니다. 실패한 메시지에는
ErrorCode와Message만 담기고, 나머지는 그대로 나갑니다. - 오류는
ErrorCode와Message로 돌아옵니다. 키가 없거나 알 수 없는 경우, 또는emails:send가 없는 키는 ErrorCode 10과 함께 HTTP 401을 받습니다. 나머지는 HTTP 422를 받으며, ErrorCode 300은 메시지 자체의 문제, 400은 키가 쓸 수 없는 From 주소, 401은 아직 보낼 수 없는 도메인, 402는 JSON이 아닌 본문, 405는 발송 한도를 다 쓴 워크스페이스입니다. HTTP 413은 본문이 10MB(배치는 50MB)를 넘거나 첨부가 5MB를 넘는다는 뜻입니다.