| 1 | <?php |
||||||
| 2 | |||||||
| 3 | namespace ByJG\Mail\Wrapper; |
||||||
| 4 | |||||||
| 5 | use ByJG\Mail\Envelope; |
||||||
| 6 | use ByJG\Mail\Exception\InvalidEMailException; |
||||||
| 7 | use ByJG\Mail\Exception\MailApiException; |
||||||
| 8 | use ByJG\Util\CurlException; |
||||||
|
0 ignored issues
–
show
|
|||||||
| 9 | use ByJG\Util\Helper\RequestMultiPart; |
||||||
| 10 | use ByJG\Util\HttpClient; |
||||||
| 11 | use ByJG\Util\MultiPartItem; |
||||||
| 12 | use ByJG\Util\Psr7\Request; |
||||||
| 13 | use ByJG\Util\Uri; |
||||||
| 14 | |||||||
| 15 | class MailgunApiWrapper extends PHPMailerWrapper |
||||||
| 16 | { |
||||||
| 17 | private $client; |
||||||
| 18 | |||||||
| 19 | private $regions = [ |
||||||
| 20 | 'us' => 'api.mailgun.net', |
||||||
| 21 | 'eu' => 'api.eu.mailgun.net', |
||||||
| 22 | ]; |
||||||
| 23 | |||||||
| 24 | 1 | public static function schema() |
|||||
| 25 | { |
||||||
| 26 | 1 | return ['mailgun']; |
|||||
| 27 | } |
||||||
| 28 | |||||||
| 29 | 5 | public function __construct(Uri $uri, HttpClient $client = null) |
|||||
| 30 | { |
||||||
| 31 | 5 | parent::__construct($uri); |
|||||
| 32 | |||||||
| 33 | 5 | $this->client = $client; |
|||||
| 34 | 5 | if (is_null($client)) { |
|||||
| 35 | 1 | $this->client = new HttpClient(); |
|||||
| 36 | } |
||||||
| 37 | } |
||||||
| 38 | |||||||
| 39 | /** |
||||||
| 40 | * @return Request |
||||||
| 41 | * @throws \ByJG\Util\Psr7\MessageException |
||||||
| 42 | */ |
||||||
| 43 | 5 | public function getRequestObject() |
|||||
| 44 | { |
||||||
| 45 | 5 | $domainName = $this->uri->getHost(); |
|||||
| 46 | 5 | $apiUri = $this->getApiUri(); |
|||||
| 47 | |||||||
| 48 | 5 | $uri = Uri::getInstanceFromString("https://$apiUri/v3/$domainName/messages") |
|||||
| 49 | 5 | ->withUserInfo('api', $this->uri->getUsername()); |
|||||
| 50 | |||||||
| 51 | 5 | return Request::getInstance($uri)->withMethod("POST"); |
|||||
| 52 | } |
||||||
| 53 | |||||||
| 54 | /** |
||||||
| 55 | * malgun://api:APIKEY@DOMAINNAME |
||||||
| 56 | * |
||||||
| 57 | * @param Envelope $envelope |
||||||
| 58 | * @return bool |
||||||
| 59 | * @throws MailApiException |
||||||
| 60 | * @throws InvalidEMailException |
||||||
| 61 | * @throws CurlException |
||||||
| 62 | * @throws \ByJG\Util\Psr7\MessageException |
||||||
| 63 | */ |
||||||
| 64 | 4 | public function send(Envelope $envelope) |
|||||
| 65 | { |
||||||
| 66 | 4 | $this->validate($envelope); |
|||||
| 67 | |||||||
| 68 | 4 | $message = [ |
|||||
| 69 | 4 | new MultiPartItem('from', $envelope->getFrom()), |
|||||
| 70 | 4 | new MultiPartItem('subject', $envelope->getSubject()), |
|||||
| 71 | 4 | new MultiPartItem('html', $envelope->getBody()), |
|||||
| 72 | 4 | new MultiPartItem('text', $envelope->getBodyText()), |
|||||
| 73 | 4 | ]; |
|||||
| 74 | |||||||
| 75 | |||||||
| 76 | 4 | foreach ((array)$envelope->getTo() as $to) { |
|||||
| 77 | 4 | $message[] = new MultiPartItem('to', $to); |
|||||
| 78 | } |
||||||
| 79 | |||||||
| 80 | 4 | foreach ((array)$envelope->getBCC() as $bcc) { |
|||||
| 81 | 3 | $message[] = new MultiPartItem('bcc', $bcc); |
|||||
| 82 | } |
||||||
| 83 | |||||||
| 84 | 4 | if (!empty($envelope->getReplyTo())) { |
|||||
| 85 | 4 | $message[] = new MultiPartItem('h:Reply-To', $envelope->getReplyTo()); |
|||||
| 86 | } |
||||||
| 87 | |||||||
| 88 | 4 | foreach ((array)$envelope->getCC() as $cc) { |
|||||
| 89 | 3 | $message[] = new MultiPartItem('cc', $cc); |
|||||
| 90 | } |
||||||
| 91 | |||||||
| 92 | 4 | foreach ((array)$envelope->getAttachments() as $name => $attachment) { |
|||||
| 93 | 2 | $message[] = new MultiPartItem( |
|||||
| 94 | 2 | $attachment['disposition'], |
|||||
| 95 | 2 | file_get_contents($attachment['content']), |
|||||
| 96 | 2 | $name, |
|||||
| 97 | 2 | $attachment['content-type'] |
|||||
| 98 | 2 | ); |
|||||
| 99 | } |
||||||
| 100 | |||||||
| 101 | 4 | $request = RequestMultiPart::buildMultiPart($message, $this->getRequestObject()); |
|||||
| 102 | |||||||
| 103 | 4 | $result = $this->client->sendRequest($request); |
|||||
|
0 ignored issues
–
show
The method
sendRequest() does not exist on null.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. Loading history...
|
|||||||
| 104 | 4 | if ($result->getStatusCode() != 200) { |
|||||
| 105 | throw new MailApiException("Mailgun result code is " . $result->getStatusCode()); |
||||||
| 106 | } |
||||||
| 107 | 4 | $resultJson = json_decode($result->getBody()->getContents(), true); |
|||||
| 108 | 4 | if (!isset($resultJson['id'])) { |
|||||
| 109 | throw new MailApiException('Mailgun: ' . $resultJson['message']); |
||||||
| 110 | } |
||||||
| 111 | |||||||
| 112 | 4 | return true; |
|||||
| 113 | } |
||||||
| 114 | |||||||
| 115 | 5 | private function getApiUri() |
|||||
| 116 | { |
||||||
| 117 | 5 | $query = $this->uri->getQueryPart('region'); |
|||||
| 118 | 5 | if (isset($this->regions[$query])) { |
|||||
| 119 | return $this->regions[$query]; |
||||||
| 120 | } |
||||||
| 121 | |||||||
| 122 | 5 | return $this->regions['us']; |
|||||
| 123 | } |
||||||
| 124 | |||||||
| 125 | } |
||||||
| 126 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths