mailgun-php/src/Mailgun/Mailgun.php

304 lines
7.8 KiB
PHP
Raw Normal View History

<?PHP
/*
* Copyright (C) 2013-2016 Mailgun
*
* This software may be modified and distributed under the terms
2016-12-06 21:12:52 +03:00
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun;
use Http\Client\Common\HttpMethodsClient;
2015-10-30 16:28:43 +03:00
use Http\Client\HttpClient;
2013-08-13 23:26:34 +04:00
use Mailgun\Connection\RestClient;
2016-07-24 14:42:47 +03:00
use Mailgun\Constants\ExceptionMessages;
2013-08-16 22:20:01 +04:00
use Mailgun\Lists\OptInHandler;
2016-07-24 14:42:47 +03:00
use Mailgun\Messages\BatchMessage;
use Mailgun\Messages\Exceptions;
2013-08-08 04:41:14 +04:00
use Mailgun\Messages\MessageBuilder;
use Mailgun\Deserializer\ModelDeserializer;
use Mailgun\Deserializer\ResponseDeserializer;
/**
* This class is the base class for the Mailgun SDK.
*/
2016-07-24 14:40:50 +03:00
class Mailgun
{
/**
* @var RestClient
*
* @depracated Will be removed in 3.0
*/
protected $restClient;
/**
* @var null|string
*/
2014-06-25 01:36:21 +04:00
protected $apiKey;
/**
* @var HttpMethodsClient
*/
private $httpClient;
/**
* @var ResponseDeserializer
*/
private $deserializer;
/**
* @var RequestBuilder
*/
private $requestBuilder;
/**
* @param string|null $apiKey
* @param HttpClient|null $httpClient
* @param string $apiEndpoint
* @param ResponseDeserializer|null $deserializer
* @param HttpClientConfigurator|null $clientConfigurator
* @param RequestBuilder|null $requestBuilder
*/
public function __construct(
$apiKey = null,
HttpClient $httpClient = null, /* Deprecated, will be removed in 3.0 */
$apiEndpoint = 'api.mailgun.net', /* Deprecated, will be removed in 3.0 */
ResponseDeserializer $deserializer = null,
HttpClientConfigurator $clientConfigurator = null,
RequestBuilder $requestBuilder = null
) {
$this->apiKey = $apiKey;
$this->restClient = new RestClient($apiKey, $apiEndpoint, $httpClient);
if (null === $clientConfigurator) {
$clientConfigurator = new HttpClientConfigurator();
/*
* To be backward compatible
*/
if ($apiEndpoint !== 'api.mailgun.net') {
$clientConfigurator->setEndpoint($apiEndpoint);
}
if ($httpClient !== null) {
$clientConfigurator->setHttpClient($httpClient);
}
}
$clientConfigurator->setApiKey($apiKey);
$this->httpClient = $clientConfigurator->createConfiguredClient();
$this->requestBuilder = $requestBuilder ?: new RequestBuilder();
$this->deserializer = $deserializer ?: new ModelDeserializer();
}
2013-08-08 04:41:14 +04:00
/**
* This function allows the sending of a fully formed message OR a custom
* MIME string. If sending MIME, the string must be passed in to the 3rd
* position of the function call.
*
2016-07-24 14:41:21 +03:00
* @param string $workingDomain
* @param array $postData
* @param array $postFiles
*
* @throws Exceptions\MissingRequiredMIMEParameters
2016-07-24 14:42:47 +03:00
*
* @return \stdClass
*/
2016-07-24 14:42:47 +03:00
public function sendMessage($workingDomain, $postData, $postFiles = [])
2016-07-24 14:40:50 +03:00
{
2016-07-24 14:41:21 +03:00
if (is_array($postFiles)) {
return $this->post("$workingDomain/messages", $postData, $postFiles);
2016-07-24 14:41:21 +03:00
} elseif (is_string($postFiles)) {
$tempFile = tempnam(sys_get_temp_dir(), 'MG_TMP_MIME');
$fileHandle = fopen($tempFile, 'w');
fwrite($fileHandle, $postFiles);
2016-07-24 14:42:47 +03:00
$result = $this->post("$workingDomain/messages.mime", $postData, ['message' => $tempFile]);
fclose($fileHandle);
unlink($tempFile);
2016-07-24 14:41:21 +03:00
return $result;
2016-07-24 14:41:21 +03:00
} else {
throw new Exceptions\MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS);
}
}
/**
* This function checks the signature in a POST request to see if it is
* authentic.
*
* Pass an array of parameters. If you pass nothing, $_POST will be
* used instead.
*
* If this function returns FALSE, you must not process the request.
* You should reject the request with status code 403 Forbidden.
*
2016-07-24 14:41:21 +03:00
* @param array|null $postData
*
* @return bool
*/
2016-07-24 14:41:21 +03:00
public function verifyWebhookSignature($postData = null)
2016-07-24 14:40:50 +03:00
{
2016-07-24 14:41:21 +03:00
if ($postData === null) {
$postData = $_POST;
}
2016-07-24 14:41:21 +03:00
if (!isset($postData['timestamp']) || !isset($postData['token']) || !isset($postData['signature'])) {
return false;
}
2016-07-24 14:41:21 +03:00
$hmac = hash_hmac('sha256', "{$postData['timestamp']}{$postData['token']}", $this->apiKey);
$sig = $postData['signature'];
2016-07-24 14:41:21 +03:00
if (function_exists('hash_equals')) {
// hash_equals is constant time, but will not be introduced until PHP 5.6
return hash_equals($hmac, $sig);
2016-07-24 14:41:21 +03:00
} else {
return $hmac === $sig;
}
}
2013-08-13 23:26:34 +04:00
/**
* @param string $endpointUrl
2016-07-24 14:40:50 +03:00
* @param array $postData
* @param array $files
2016-07-24 14:41:21 +03:00
*
* @return \stdClass
*/
2016-07-24 14:42:47 +03:00
public function post($endpointUrl, $postData = [], $files = [])
2016-07-24 14:40:50 +03:00
{
return $this->restClient->post($endpointUrl, $postData, $files);
}
2014-10-07 02:53:33 +04:00
/**
* @param string $endpointUrl
2016-07-24 14:40:50 +03:00
* @param array $queryString
2016-07-24 14:41:21 +03:00
*
* @return \stdClass
*/
2016-07-24 14:42:47 +03:00
public function get($endpointUrl, $queryString = [])
2016-07-24 14:40:50 +03:00
{
return $this->restClient->get($endpointUrl, $queryString);
}
2014-10-07 02:53:33 +04:00
/**
* @param string $endpointUrl
2016-07-24 14:41:21 +03:00
*
* @return \stdClass
*/
2016-07-24 14:40:50 +03:00
public function delete($endpointUrl)
{
return $this->restClient->delete($endpointUrl);
}
2014-10-07 02:53:33 +04:00
/**
* @param string $endpointUrl
2016-07-24 14:40:50 +03:00
* @param array $putData
2016-07-24 14:41:21 +03:00
*
* @return \stdClass
*/
2016-07-24 14:40:50 +03:00
public function put($endpointUrl, $putData)
{
return $this->restClient->put($endpointUrl, $putData);
}
2014-10-07 02:53:33 +04:00
/**
* @param string $apiVersion
*
* @return Mailgun
*/
public function setApiVersion($apiVersion)
{
$this->restClient->setApiVersion($apiVersion);
return $this;
}
/**
2016-07-24 14:41:21 +03:00
* @param bool $sslEnabled
*
* @return Mailgun
*
2016-09-30 16:04:43 +03:00
* @deprecated This will be removed in 3.0. Mailgun does not support non-secure connections to their API.
*/
public function setSslEnabled($sslEnabled)
{
$this->restClient->setSslEnabled($sslEnabled);
return $this;
}
/**
* @return MessageBuilder
*/
2016-07-24 14:40:50 +03:00
public function MessageBuilder()
{
return new MessageBuilder();
}
2014-10-07 02:53:33 +04:00
/**
* @return OptInHandler
*/
2016-07-24 14:40:50 +03:00
public function OptInHandler()
{
return new OptInHandler();
}
2014-10-07 02:53:33 +04:00
/**
* @param string $workingDomain
2016-07-24 14:40:50 +03:00
* @param bool $autoSend
2016-07-24 14:41:21 +03:00
*
* @return BatchMessage
*/
2016-07-24 14:40:50 +03:00
public function BatchMessage($workingDomain, $autoSend = true)
{
return new BatchMessage($this->restClient, $workingDomain, $autoSend);
}
/**
* @return Api\Stats
*/
public function stats()
{
return new Api\Stats($this->httpClient, $this->requestBuilder, $this->deserializer);
}
2016-10-27 09:34:27 +03:00
/**
* @return Api\Domain
*/
public function domains()
2016-10-27 09:34:27 +03:00
{
return new Api\Domain($this->httpClient, $this->requestBuilder, $this->deserializer);
2016-10-27 09:34:27 +03:00
}
/**
* @return Api\Event
*/
public function events()
{
return new Api\Event($this->httpClient, $this->requestBuilder, $this->deserializer);
}
Routes API (#249) * Add initial (empty) Routes PHP Unit Test file We still need to provide the automated tests * Add initial Routes file * Describe API Methods * Inherit method from TestCase - adding @inheritdoc annotation * Add new DTOs to map API responses to known objects * Add new Response to manage the Routes list * Implement method to retrieve a list of Routes * Add new Response to manage a single Route resource * Implement method to retrieve a single Route * Set ShowResponse as final * Add new Response to manage the Create process * Implement method to create a new Route * Fix missing annotation * Add new Response to manage the Delete Route process * Implement method to delete a Route based on the ID * Add new Response to manage the Update Route process This response is based on Domain API docs due there are no examples on Routes API docs. We may need to update the response. * Implement method to update a Route based on the ID * Require a $limit value greater than 0 * Require a $skip value greater than or equal to 0 * Set UpdateResponse as final * Add new (empty) public methods to test the Routes API * Provide method to get the Routes API from Mailgun Client * Add missed annotation * Update ShowResponse to return an instance of ApiResponse instead of the DTO * Update annotation * Fix annotation * Update array $actions to provide an empty array by default * Update parameters to make sure the last arg always is a DateTime (or null) * Use empty() * Remove DTO suffix * Move DTOs to the parent folder/namespace * Fix annotations
2016-12-10 01:15:06 +03:00
/**
* @return Api\Routes
*/
public function routes()
{
return new Api\Routes($this->httpClient, $this->requestBuilder, $this->deserializer);
}
/**
* @return Api\Webhook
*/
public function webhooks()
{
return new Api\Webhook($this->httpClient, $this->requestBuilder, $this->deserializer);
}
/**
* @return Api\Message
*/
public function messages()
{
return new Api\Message($this->httpClient, $this->requestBuilder, $this->deserializer);
}
}