3 final class PhabricatorMailPostmarkAdapter
4 extends PhabricatorMailAdapter
{
6 const ADAPTERTYPE
= 'postmark';
8 public function getSupportedMessageTypes() {
10 PhabricatorMailEmailMessage
::MESSAGETYPE
,
14 protected function validateOptions(array $options) {
15 PhutilTypeSpec
::checkMap(
18 'access-token' => 'string',
19 'inbound-addresses' => 'list<string>',
22 // Make sure this is properly formatted.
23 PhutilCIDRList
::newList($options['inbound-addresses']);
26 public function newDefaultOptions() {
28 'access-token' => null,
29 'inbound-addresses' => array(
30 // Via Postmark support circa February 2018, see:
32 // https://postmarkapp.com/support/article/800-ips-for-firewalls
34 // "Configuring Outbound Email" should be updated if this changes.
36 // These addresses were last updated in December 2021.
45 public function sendMessage(PhabricatorMailExternalMessage
$message) {
46 $access_token = $this->getOption('access-token');
48 $parameters = array();
50 $subject = $message->getSubject();
51 if ($subject !== null) {
52 $parameters['Subject'] = $subject;
55 $from_address = $message->getFromAddress();
57 $parameters['From'] = (string)$from_address;
60 $to_addresses = $message->getToAddresses();
63 foreach ($to_addresses as $address) {
64 $to[] = (string)$address;
66 $parameters['To'] = implode(', ', $to);
69 $cc_addresses = $message->getCCAddresses();
72 foreach ($cc_addresses as $address) {
73 $cc[] = (string)$address;
75 $parameters['Cc'] = implode(', ', $cc);
78 $reply_address = $message->getReplyToAddress();
80 $parameters['ReplyTo'] = (string)$reply_address;
83 $headers = $message->getHeaders();
86 foreach ($headers as $header) {
88 'Name' => $header->getName(),
89 'Value' => $header->getValue(),
92 $parameters['Headers'] = $list;
95 $text_body = $message->getTextBody();
96 if ($text_body !== null) {
97 $parameters['TextBody'] = $text_body;
100 $html_body = $message->getHTMLBody();
101 if ($html_body !== null) {
102 $parameters['HtmlBody'] = $html_body;
105 $attachments = $message->getAttachments();
108 foreach ($attachments as $attachment) {
110 'Name' => $attachment->getFilename(),
111 'ContentType' => $attachment->getMimeType(),
112 'Content' => base64_encode($attachment->getData()),
115 $parameters['Attachments'] = $files;
118 id(new PhutilPostmarkFuture())
119 ->setAccessToken($access_token)
120 ->setMethod('email', $parameters)