mailgun-php/src/Mailgun/Mailgun.php

264 lines
6.9 KiB
PHP
Raw Normal View History

<?PHP
/*
* Copyright (C) 2013-2016 Mailgun
*
* This software may be modified and distributed under the terms
* 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;
use Http\Discovery\MessageFactoryDiscovery;
use Http\Message\RequestFactory;
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\Serializer\ObjectSerializer;
use Mailgun\Serializer\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 $serializer;
/**
* @var RequestFactory
*/
private $requestFactory;
/**
* @param string|null $apiKey
* @param HttpClient|null $httpClient
* @param string $apiEndpoint
* @param ResponseDeserializer|null $serializer
* @param HttpClientConfigurator|null $clientConfigurator
*/
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 $serializer = null,
HttpClientConfigurator $clientConfigurator = 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->requestFactory = MessageFactoryDiscovery::find();
$this->serializer = $serializer ?: new ObjectSerializer();
}
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 getStatsApi()
{
return new Api\Stats($this->httpClient, $this->requestFactory, $this->serializer);
}
}