key = $key; $this->client = $client; $this->endpoint = $endpoint ?? 'api.mailgun.net'; $this->setDomain($domain); } /** * {@inheritdoc} */ public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null) { $this->beforeSendPerformed($message); $to = $this->getTo($message); $message->setBcc([]); $this->client->request( 'POST', "https://{$this->endpoint}/v3/{$this->domain}/messages.mime", $this->payload($message, $to) ); $this->sendPerformed($message); return $this->numberOfRecipients($message); } /** * Get the HTTP payload for sending the Mailgun message. * * @param \Swift_Mime_SimpleMessage $message * @param string $to * @return array */ protected function payload(Swift_Mime_SimpleMessage $message, $to) { return [ 'auth' => [ 'api', $this->key, ], 'multipart' => [ [ 'name' => 'to', 'contents' => $to, ], [ 'name' => 'message', 'contents' => $message->toString(), 'filename' => 'message.mime', ], ], ]; } /** * Get the "to" payload field for the API request. * * @param \Swift_Mime_SimpleMessage $message * @return string */ protected function getTo(Swift_Mime_SimpleMessage $message) { return collect($this->allContacts($message))->map(function ($display, $address) { return $display ? $display." <{$address}>" : $address; })->values()->implode(','); } /** * Get all of the contacts for the message. * * @param \Swift_Mime_SimpleMessage $message * @return array */ protected function allContacts(Swift_Mime_SimpleMessage $message) { return array_merge( (array) $message->getTo(), (array) $message->getCc(), (array) $message->getBcc() ); } /** * Get the API key being used by the transport. * * @return string */ public function getKey() { return $this->key; } /** * Set the API key being used by the transport. * * @param string $key * @return string */ public function setKey($key) { return $this->key = $key; } /** * Get the domain being used by the transport. * * @return string */ public function getDomain() { return $this->domain; } /** * Set the domain being used by the transport. * * @param string $domain * @return string */ public function setDomain($domain) { return $this->domain = $domain; } }