Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/metamta/adapter/PhabricatorMailSendGridAdapter.php
12256 views
1
<?php
2
3
/**
4
* Mail adapter that uses SendGrid's web API to deliver email.
5
*/
6
final class PhabricatorMailSendGridAdapter
7
extends PhabricatorMailAdapter {
8
9
const ADAPTERTYPE = 'sendgrid';
10
11
public function getSupportedMessageTypes() {
12
return array(
13
PhabricatorMailEmailMessage::MESSAGETYPE,
14
);
15
}
16
17
protected function validateOptions(array $options) {
18
PhutilTypeSpec::checkMap(
19
$options,
20
array(
21
'api-key' => 'string',
22
));
23
}
24
25
public function newDefaultOptions() {
26
return array(
27
'api-key' => null,
28
);
29
}
30
31
public function sendMessage(PhabricatorMailExternalMessage $message) {
32
$key = $this->getOption('api-key');
33
34
$parameters = array();
35
36
$subject = $message->getSubject();
37
if ($subject !== null) {
38
$parameters['subject'] = $subject;
39
}
40
41
$personalizations = array();
42
43
$to_addresses = $message->getToAddresses();
44
if ($to_addresses) {
45
$personalizations['to'] = array();
46
foreach ($to_addresses as $address) {
47
$personalizations['to'][] = $this->newPersonalization($address);
48
}
49
}
50
51
$cc_addresses = $message->getCCAddresses();
52
if ($cc_addresses) {
53
$personalizations['cc'] = array();
54
foreach ($cc_addresses as $address) {
55
$personalizations['cc'][] = $this->newPersonalization($address);
56
}
57
}
58
59
// This is a list of different sets of recipients who should receive copies
60
// of the mail. We handle "one message to each recipient" ourselves.
61
$parameters['personalizations'] = array(
62
$personalizations,
63
);
64
65
$from_address = $message->getFromAddress();
66
if ($from_address) {
67
$parameters['from'] = $this->newPersonalization($from_address);
68
}
69
70
$reply_address = $message->getReplyToAddress();
71
if ($reply_address) {
72
$parameters['reply_to'] = $this->newPersonalization($reply_address);
73
}
74
75
$headers = $message->getHeaders();
76
if ($headers) {
77
$map = array();
78
foreach ($headers as $header) {
79
$map[$header->getName()] = $header->getValue();
80
}
81
$parameters['headers'] = $map;
82
}
83
84
$content = array();
85
$text_body = $message->getTextBody();
86
if ($text_body !== null) {
87
$content[] = array(
88
'type' => 'text/plain',
89
'value' => $text_body,
90
);
91
}
92
93
$html_body = $message->getHTMLBody();
94
if ($html_body !== null) {
95
$content[] = array(
96
'type' => 'text/html',
97
'value' => $html_body,
98
);
99
}
100
$parameters['content'] = $content;
101
102
$attachments = $message->getAttachments();
103
if ($attachments) {
104
$files = array();
105
foreach ($attachments as $attachment) {
106
$files[] = array(
107
'content' => base64_encode($attachment->getData()),
108
'type' => $attachment->getMimeType(),
109
'filename' => $attachment->getFilename(),
110
'disposition' => 'attachment',
111
);
112
}
113
$parameters['attachments'] = $files;
114
}
115
116
$sendgrid_uri = 'https://api.sendgrid.com/v3/mail/send';
117
$json_parameters = phutil_json_encode($parameters);
118
119
id(new HTTPSFuture($sendgrid_uri))
120
->setMethod('POST')
121
->addHeader('Authorization', "Bearer {$key}")
122
->addHeader('Content-Type', 'application/json')
123
->setData($json_parameters)
124
->setTimeout(60)
125
->resolvex();
126
127
// The SendGrid v3 API does not return a JSON response body. We get a
128
// non-2XX HTTP response in the case of an error, which throws above.
129
}
130
131
private function newPersonalization(PhutilEmailAddress $address) {
132
$result = array(
133
'email' => $address->getAddress(),
134
);
135
136
$display_name = $address->getDisplayName();
137
if ($display_name) {
138
$result['name'] = $display_name;
139
}
140
141
return $result;
142
}
143
144
}
145
146