1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
/* |
6
|
|
|
* Copyright (C) 2013 Mailgun |
7
|
|
|
* |
8
|
|
|
* This software may be modified and distributed under the terms |
9
|
|
|
* of the MIT license. See the LICENSE file for details. |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
namespace Mailgun\Api; |
13
|
|
|
|
14
|
|
|
use Exception; |
15
|
|
|
use Mailgun\Assert; |
16
|
|
|
use Mailgun\Model\EmailValidationV4\CreateBulkJobResponse; |
17
|
|
|
use Mailgun\Model\EmailValidationV4\CreateBulkPreviewResponse; |
18
|
|
|
use Mailgun\Model\EmailValidationV4\DeleteBulkJobResponse; |
19
|
|
|
use Mailgun\Model\EmailValidationV4\GetBulkJobResponse; |
20
|
|
|
use Mailgun\Model\EmailValidationV4\GetBulkJobsResponse; |
21
|
|
|
use Mailgun\Model\EmailValidationV4\GetBulkPreviewResponse; |
22
|
|
|
use Mailgun\Model\EmailValidationV4\GetBulkPreviewsResponse; |
23
|
|
|
use Mailgun\Model\EmailValidationV4\PromoteBulkPreviewResponse; |
24
|
|
|
use Mailgun\Model\EmailValidationV4\ValidateResponse; |
25
|
|
|
use Psr\Http\Message\ResponseInterface; |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* @see https://documentation.mailgun.com/en/latest/api-email-validation.html |
29
|
|
|
*/ |
30
|
|
|
class EmailValidationV4 extends HttpApi |
31
|
|
|
{ |
32
|
|
|
/** |
33
|
|
|
* Addresses are validated based off defined checks. |
34
|
|
|
* |
35
|
|
|
* @param string $address An email address to validate. Maximum: 512 characters. |
36
|
|
|
* @param bool $providerLookup A provider lookup will be performed if Mailgun’s internal analysis is insufficient |
37
|
|
|
* |
38
|
|
|
* @return ValidateResponse|ResponseInterface |
39
|
|
|
* |
40
|
|
|
* @throws Exception Thrown when we don't catch a Client or Server side Exception |
41
|
|
|
*/ |
42
|
2 |
View Code Duplication |
public function validate(string $address, bool $providerLookup = true) |
|
|
|
|
43
|
|
|
{ |
44
|
2 |
|
Assert::stringNotEmpty($address); |
45
|
|
|
|
46
|
|
|
$params = [ |
47
|
2 |
|
'address' => $address, |
48
|
2 |
|
'provider_lookup' => $providerLookup, |
49
|
|
|
]; |
50
|
|
|
|
51
|
2 |
|
$response = $this->httpGet('/v4/address/validate', $params); |
52
|
|
|
|
53
|
|
|
return $this->hydrateResponse($response, ValidateResponse::class); |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
/** |
57
|
|
|
* @param string $listId ID given when the list created |
58
|
|
|
* @param mixed $filePath File path or file content |
59
|
|
|
* |
60
|
|
|
* @return mixed|ResponseInterface |
61
|
|
|
* |
62
|
|
|
* @throws Exception |
63
|
|
|
*/ |
64
|
1 |
View Code Duplication |
public function createBulkJob(string $listId, $filePath) |
|
|
|
|
65
|
|
|
{ |
66
|
1 |
|
Assert::stringNotEmpty($listId); |
67
|
|
|
|
68
|
1 |
|
if (strlen($filePath) < PHP_MAXPATHLEN && is_file($filePath)) { |
69
|
1 |
|
$fileData = ['filePath' => $filePath]; |
70
|
|
|
} else { |
71
|
|
|
$fileData = [ |
72
|
|
|
'fileContent' => $filePath, |
73
|
|
|
'filename' => 'file', |
74
|
|
|
]; |
75
|
|
|
} |
76
|
|
|
|
77
|
1 |
|
$postDataMultipart = []; |
78
|
1 |
|
$postDataMultipart[] = $this->prepareFile('file', $fileData); |
79
|
|
|
|
80
|
1 |
|
$response = $this->httpPostRaw(sprintf('/v4/address/validate/bulk/%s', $listId), $postDataMultipart); |
81
|
1 |
|
$this->closeResources($postDataMultipart); |
82
|
|
|
|
83
|
|
|
return $this->hydrateResponse($response, CreateBulkJobResponse::class); |
84
|
|
|
} |
85
|
|
|
|
86
|
|
|
/** |
87
|
|
|
* @param string $listId ID given when the list created |
88
|
|
|
* |
89
|
|
|
* @return DeleteBulkJobResponse|ResponseInterface |
90
|
|
|
* |
91
|
|
|
* @throws Exception |
92
|
|
|
*/ |
93
|
1 |
View Code Duplication |
public function deleteBulkJob(string $listId) |
|
|
|
|
94
|
|
|
{ |
95
|
1 |
|
Assert::stringNotEmpty($listId); |
96
|
|
|
|
97
|
1 |
|
$response = $this->httpDelete(sprintf('/v4/address/validate/bulk/%s', $listId)); |
98
|
|
|
|
99
|
|
|
return $this->hydrateResponse($response, DeleteBulkJobResponse::class); |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
/** |
103
|
|
|
* @param string $listId ID given when the list created |
104
|
|
|
* |
105
|
|
|
* @return GetBulkJobResponse|ResponseInterface |
106
|
|
|
* |
107
|
|
|
* @throws Exception |
108
|
|
|
*/ |
109
|
1 |
View Code Duplication |
public function getBulkJob(string $listId) |
|
|
|
|
110
|
|
|
{ |
111
|
1 |
|
Assert::stringNotEmpty($listId); |
112
|
|
|
|
113
|
1 |
|
$response = $this->httpGet(sprintf('/v4/address/validate/bulk/%s', $listId)); |
114
|
|
|
|
115
|
|
|
return $this->hydrateResponse($response, GetBulkJobResponse::class); |
116
|
|
|
} |
117
|
|
|
|
118
|
|
|
/** |
119
|
|
|
* @param int $limit Jobs limit |
120
|
|
|
* |
121
|
|
|
* @return GetBulkJobsResponse|ResponseInterface |
122
|
|
|
* |
123
|
|
|
* @throws Exception |
124
|
|
|
*/ |
125
|
1 |
View Code Duplication |
public function getBulkJobs(int $limit = 500) |
|
|
|
|
126
|
|
|
{ |
127
|
1 |
|
Assert::greaterThan($limit, 0); |
128
|
|
|
|
129
|
1 |
|
$response = $this->httpGet('/v4/address/validate/bulk', [ |
130
|
1 |
|
'limit' => $limit, |
131
|
|
|
]); |
132
|
|
|
|
133
|
|
|
return $this->hydrateResponse($response, GetBulkJobsResponse::class); |
134
|
|
|
} |
135
|
|
|
|
136
|
|
|
/** |
137
|
|
|
* @param int $limit Previews Limit |
138
|
|
|
* |
139
|
|
|
* @return mixed|ResponseInterface |
140
|
|
|
* |
141
|
|
|
* @throws Exception |
142
|
|
|
*/ |
143
|
1 |
View Code Duplication |
public function getBulkPreviews(int $limit = 500) |
|
|
|
|
144
|
|
|
{ |
145
|
1 |
|
Assert::greaterThan($limit, 0); |
146
|
|
|
|
147
|
1 |
|
$response = $this->httpGet('/v4/address/validate/preview', [ |
148
|
1 |
|
'limit' => $limit, |
149
|
|
|
]); |
150
|
|
|
|
151
|
|
|
return $this->hydrateResponse($response, GetBulkPreviewsResponse::class); |
152
|
|
|
} |
153
|
|
|
|
154
|
|
|
/** |
155
|
|
|
* @param string $previewId ID given when the list created |
156
|
|
|
* @param mixed $filePath File path or file content |
157
|
|
|
* |
158
|
|
|
* @return mixed|ResponseInterface |
159
|
|
|
* |
160
|
|
|
* @throws Exception |
161
|
|
|
*/ |
162
|
1 |
View Code Duplication |
public function createBulkPreview(string $previewId, $filePath) |
|
|
|
|
163
|
|
|
{ |
164
|
1 |
|
Assert::stringNotEmpty($previewId); |
165
|
|
|
|
166
|
1 |
|
if (strlen($filePath) < PHP_MAXPATHLEN && is_file($filePath)) { |
167
|
1 |
|
$fileData = ['filePath' => $filePath]; |
168
|
|
|
} else { |
169
|
|
|
$fileData = [ |
170
|
|
|
'fileContent' => $filePath, |
171
|
|
|
'filename' => 'file', |
172
|
|
|
]; |
173
|
|
|
} |
174
|
|
|
|
175
|
1 |
|
$postDataMultipart = []; |
176
|
1 |
|
$postDataMultipart[] = $this->prepareFile('file', $fileData); |
177
|
|
|
|
178
|
1 |
|
$response = $this->httpPostRaw(sprintf('/v4/address/validate/preview/%s', $previewId), $postDataMultipart); |
179
|
1 |
|
$this->closeResources($postDataMultipart); |
180
|
|
|
|
181
|
|
|
return $this->hydrateResponse($response, CreateBulkPreviewResponse::class); |
182
|
|
|
} |
183
|
|
|
|
184
|
|
|
/** |
185
|
|
|
* @param string $previewId ID given when the list created |
186
|
|
|
* |
187
|
|
|
* @return mixed|ResponseInterface |
188
|
|
|
* |
189
|
|
|
* @throws Exception |
190
|
|
|
*/ |
191
|
1 |
View Code Duplication |
public function getBulkPreview(string $previewId) |
|
|
|
|
192
|
|
|
{ |
193
|
1 |
|
Assert::stringNotEmpty($previewId); |
194
|
|
|
|
195
|
1 |
|
$response = $this->httpGet(sprintf('/v4/address/validate/preview/%s', $previewId)); |
196
|
|
|
|
197
|
|
|
return $this->hydrateResponse($response, GetBulkPreviewResponse::class); |
198
|
|
|
} |
199
|
|
|
|
200
|
|
|
/** |
201
|
|
|
* @param string $previewId ID given when the list created |
202
|
|
|
* |
203
|
|
|
* @return bool |
204
|
|
|
*/ |
205
|
1 |
|
public function deleteBulkPreview(string $previewId) |
206
|
|
|
{ |
207
|
1 |
|
Assert::stringNotEmpty($previewId); |
208
|
|
|
|
209
|
1 |
|
$response = $this->httpDelete(sprintf('/v4/address/validate/preview/%s', $previewId)); |
210
|
|
|
|
211
|
1 |
|
return 204 === $response->getStatusCode(); |
212
|
|
|
} |
213
|
|
|
|
214
|
|
|
/** |
215
|
|
|
* @param string $previewId ID given when the list created |
216
|
|
|
* |
217
|
|
|
* @return mixed|ResponseInterface |
218
|
|
|
* |
219
|
|
|
* @throws Exception |
220
|
|
|
*/ |
221
|
1 |
|
public function promoteBulkPreview(string $previewId) |
222
|
|
|
{ |
223
|
1 |
|
Assert::stringNotEmpty($previewId); |
224
|
|
|
|
225
|
1 |
|
$response = $this->httpPut(sprintf('/v4/address/validate/preview/%s', $previewId)); |
226
|
|
|
|
227
|
|
|
return $this->hydrateResponse($response, PromoteBulkPreviewResponse::class); |
228
|
|
|
} |
229
|
|
|
|
230
|
|
|
/** |
231
|
|
|
* @param string $fieldName Field Name |
232
|
|
|
* @param array $filePath ['fileContent' => 'content'] or ['filePath' => '/foo/bar'] |
233
|
|
|
* |
234
|
|
|
* @return array File Data |
235
|
|
|
*/ |
236
|
2 |
|
private function prepareFile(string $fieldName, array $filePath): array |
237
|
|
|
{ |
238
|
2 |
|
$filename = isset($filePath['filename']) ? $filePath['filename'] : null; |
239
|
|
|
|
240
|
2 |
|
$resource = null; |
241
|
|
|
|
242
|
2 |
|
if (isset($filePath['fileContent'])) { |
243
|
|
|
// File from memory |
244
|
|
|
$resource = fopen('php://temp', 'r+'); |
245
|
|
|
fwrite($resource, $filePath['fileContent']); |
246
|
|
|
rewind($resource); |
247
|
2 |
|
} elseif (isset($filePath['filePath'])) { |
248
|
|
|
// File form path |
249
|
2 |
|
$path = $filePath['filePath']; |
250
|
2 |
|
$resource = fopen($path, 'r'); |
251
|
|
|
} |
252
|
|
|
|
253
|
|
|
return [ |
254
|
2 |
|
'name' => $fieldName, |
255
|
2 |
|
'content' => $resource, |
256
|
2 |
|
'filename' => $filename, |
257
|
|
|
]; |
258
|
|
|
} |
259
|
|
|
|
260
|
|
|
/** |
261
|
|
|
* Close open resources. |
262
|
|
|
* |
263
|
|
|
* @param array $params Resource params |
264
|
|
|
*/ |
265
|
2 |
View Code Duplication |
private function closeResources(array $params): void |
|
|
|
|
266
|
|
|
{ |
267
|
2 |
|
foreach ($params as $param) { |
268
|
2 |
|
if (is_array($param) && array_key_exists('content', $param) && is_resource($param['content'])) { |
269
|
2 |
|
fclose($param['content']); |
270
|
|
|
} |
271
|
|
|
} |
272
|
2 |
|
} |
273
|
|
|
} |
274
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.