문서로 건너뛰기
지식 베이스

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와 마찬가지로 대소문자를 가리지 않고 맞추며, 빈 문자열은 생략한 것으로 봅니다.

PostmarkOpenEmail에서
From발신자와 그 이름.
To쉼표로 구분한 수신자. Cc, Bcc와 합쳐 메시지당 최대 50명입니다.
ReplyTo회신 주소 하나.
Subject제목.
HtmlBodyHTML 본문. TextBody는 텍스트 본문이 되며, 둘 중 하나는 필수입니다.
HeadersName과 Value로 주는 사용자 지정 헤더: X-*, List-*, Reply-To, Precedence, Auto-Submitted, Importance, Priority, Feedback-ID.
Attachments파일은 최대 20개, 합계 5MB까지. HTML이 cid:로 ContentID를 참조하는 이미지는 그 자리에 삽입됩니다. 그 밖의 파일은 일반 첨부로 도착합니다.
Tagtag라는 이름의 태그.
Metadata같은 이름과 값을 가진 태그. Tag와 합쳐 메시지당 최대 10개입니다.
TrackOpens그 메시지의 열람 추적을 켜거나 끕니다.
MessageStreamoutbound, 또는 다른 트랜잭션 스트림의 ID면 메시지를 평소대로 보냅니다.
TemplateAliasOpenEmail 템플릿의 슬러그 또는 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를 넘는다는 뜻입니다.