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 January 2019.
44 public function sendMessage(PhabricatorMailExternalMessage
$message) {
45 $access_token = $this->getOption('access-token');
47 $parameters = array();
49 $subject = $message->getSubject();
50 if ($subject !== null) {
51 $parameters['Subject'] = $subject;
54 $from_address = $message->getFromAddress();
56 $parameters['From'] = (string)$from_address;
59 $to_addresses = $message->getToAddresses();
62 foreach ($to_addresses as $address) {
63 $to[] = (string)$address;
65 $parameters['To'] = implode(', ', $to);
68 $cc_addresses = $message->getCCAddresses();
71 foreach ($cc_addresses as $address) {
72 $cc[] = (string)$address;
74 $parameters['Cc'] = implode(', ', $cc);
77 $reply_address = $message->getReplyToAddress();
79 $parameters['ReplyTo'] = (string)$reply_address;
82 $headers = $message->getHeaders();
85 foreach ($headers as $header) {
87 'Name' => $header->getName(),
88 'Value' => $header->getValue(),
91 $parameters['Headers'] = $list;
94 $text_body = $message->getTextBody();
95 if ($text_body !== null) {
96 $parameters['TextBody'] = $text_body;
99 $html_body = $message->getHTMLBody();
100 if ($html_body !== null) {
101 $parameters['HtmlBody'] = $html_body;
104 $attachments = $message->getAttachments();
107 foreach ($attachments as $attachment) {
109 'Name' => $attachment->getFilename(),
110 'ContentType' => $attachment->getMimeType(),
111 'Content' => base64_encode($attachment->getData()),
114 $parameters['Attachments'] = $files;
117 id(new PhutilPostmarkFuture())
118 ->setAccessToken($access_token)
119 ->setMethod('email', $parameters)