added mailgun librarie

This commit is contained in:
Bachir Soussi Chiadmi 2016-07-19 19:58:07 +02:00
parent deae7e0b59
commit 918b4cd5e1
18 changed files with 275 additions and 753 deletions

View File

@ -1,16 +1,16 @@
language: php language: php
php: php:
- 5.3
- 5.4
- 5.5 - 5.5
- 5.6 - 5.6
- 7.0
- hhvm - hhvm
before_install: matrix:
- travis_retry composer self-update allow_failures:
- php: hhvm
install: before_script:
- travis_retry composer install - echo 'Installing composer dependencies now!'
- composer install
script:
- phpunit

View File

@ -22,32 +22,12 @@ composer and the Mailgun SDK.
curl -sS https://getcomposer.org/installer | php curl -sS https://getcomposer.org/installer | php
# Add Mailgun as a dependency # Add Mailgun as a dependency
php composer.phar require mailgun/mailgun-php:~2.0 php composer.phar require mailgun/mailgun-php:~1.7.1
``` ```
You do also need to choose what library to use when you are sending http messages. Consult the
[php-http/client-implementation](https://packagist.org/providers/php-http/client-implementation) virtual package to
find adapters to use. For more information about virtual packages please refer to
[Httplug](http://docs.httplug.io/en/latest/virtual-package/). Example:
```bash
php composer.phar require php-http/guzzle6-adapter:^1.0
```
When creating a new `Mailgun` object you must provide an instance of the `HttpClient`.
```php
$client = new \Http\Adapter\Guzzle6\Client();
$mailgun = new \Mailgun\Mailgun('api_key', $client);
```
You could also rely on the [auto discovery feature of Httplug](http://docs.php-http.org/en/latest/discovery.html). This
means that you need to install `puli/composer-plugin` and put a puli.phar in your project root.
**For shared hosts without SSH access, check out our [Shared Host Instructions](SharedHostInstall.md).** **For shared hosts without SSH access, check out our [Shared Host Instructions](SharedHostInstall.md).**
**Rather just download the files? [Library Download](https://9f67cbbd1116d8afb399-7760483f5d1e5f28c2d253278a2a5045.ssl.cf2.rackcdn.com/mailgun-php-1.7.2.zip).** **Rather just download the files? [Library Download](https://9f67cbbd1116d8afb399-7760483f5d1e5f28c2d253278a2a5045.ssl.cf2.rackcdn.com/mailgun-php-1.7.1.zip).**
Next, require Composer's autoloader, in your application, to automatically Next, require Composer's autoloader, in your application, to automatically
load the Mailgun SDK in your project: load the Mailgun SDK in your project:
@ -161,9 +141,7 @@ Go to http://bin.mailgun.net. The Postbin will generate a special URL. Save that
```php ```php
# First, instantiate the SDK with your API credentials and define your domain. # First, instantiate the SDK with your API credentials and define your domain.
$mg = new Mailgun('key-example', null, 'bin.mailgun.net'); $mg = new Mailgun('key-example', 'bin.mailgun.net', 'aecf68de', $ssl = False);
$mg->setApiVersion('aecf68de');
$mg->setSslEnabled('false');
$domain = 'example.com'; $domain = 'example.com';
# Now, compose and send your message. # Now, compose and send your message.
@ -187,15 +165,6 @@ Batch Message is an extension of Message Builder, and allows you to easily send
a batch message job within a few seconds. The complexity of a batch message job within a few seconds. The complexity of
batch messaging is eliminated! batch messaging is eliminated!
Framework integration
---------------------
If you are using a framework you might consider these composer packages to make the framework integration easier.
* [tehplague/swiftmailer-mailgun-bundle](https://github.com/tehplague/swiftmailer-mailgun-bundle) for Symfony2
* [Bogardo/Mailgun](https://github.com/Bogardo/Mailgun) for Laravel 4
* [katanyoo/yii2-mailgun-mailer](https://github.com/katanyoo/yii2-mailgun-mailer) for Yii2
Support and Feedback Support and Feedback
-------------------- --------------------

View File

@ -11,7 +11,7 @@ Linux / Mac OSX:
*PHP is typically installed by default, consult your distribution documentation. Instructions from [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix).* *PHP is typically installed by default, consult your distribution documentation. Instructions from [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix).*
1. curl -sS https://getcomposer.org/installer | php 1. curl -sS https://getcomposer.org/installer | php
2. php composer.phar require mailgun/mailgun-php:~1.7.2 2. php composer.phar require mailgun/mailgun-php:~1.7.1
3. The files will be downloaded to your local computer. 3. The files will be downloaded to your local computer.
4. Upload the files to your webserver. 4. Upload the files to your webserver.
@ -20,7 +20,7 @@ Windows:
*PHP must be installed on your computer, [download](http://windows.php.net/download/0). Instructions from [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-windows).* *PHP must be installed on your computer, [download](http://windows.php.net/download/0). Instructions from [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-windows).*
1. Download and run [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe). 1. Download and run [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe).
2. Open a Command Prompt and type "php composer require mailgun/mailgun-php:~1.7.2". 2. Open a Command Prompt and type "php composer require mailgun/mailgun-php:~1.7.1".
3. The files will be downloaded to your local computer. 3. The files will be downloaded to your local computer.
4. Upload the files to your webserver. 4. Upload the files to your webserver.

View File

@ -2,14 +2,10 @@
"name": "mailgun/mailgun-php", "name": "mailgun/mailgun-php",
"description": "The Mailgun SDK provides methods for all API functions.", "description": "The Mailgun SDK provides methods for all API functions.",
"require": { "require": {
"php": "^5.5|^7.0", "guzzle/guzzle": "<4.0,>=3.8"
"guzzlehttp/psr7": "~1.2",
"php-http/httplug": "^1.0",
"php-http/discovery": "^0.8"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~4.6", "phpunit/phpunit": "3.7.*"
"php-http/guzzle6-adapter": "^1.0"
}, },
"autoload": { "autoload": {
"psr-0": { "psr-0": {

View File

@ -2,325 +2,149 @@
namespace Mailgun\Connection; namespace Mailgun\Connection;
use GuzzleHttp\Psr7\MultipartStream; use Guzzle\Http\Client as Guzzle;
use GuzzleHttp\Psr7\Request; use Mailgun\MailgunClient;
use Http\Client\HttpClient;
use Http\Discovery\HttpClientDiscovery;
use Mailgun\Connection\Exceptions\GenericHTTPError; use Mailgun\Connection\Exceptions\GenericHTTPError;
use Guzzle\Http\QueryAggregator\DuplicateAggregator;
use Guzzle\Http\QueryAggregator\PhpAggregator;
use Mailgun\Connection\Exceptions\InvalidCredentials; use Mailgun\Connection\Exceptions\InvalidCredentials;
use Mailgun\Connection\Exceptions\NoDomainsConfigured;
use Mailgun\Connection\Exceptions\MissingRequiredParameters; use Mailgun\Connection\Exceptions\MissingRequiredParameters;
use Mailgun\Connection\Exceptions\MissingEndpoint; use Mailgun\Connection\Exceptions\MissingEndpoint;
use Mailgun\Constants\Api;
use Mailgun\Constants\ExceptionMessages;
use Psr\Http\Message\ResponseInterface;
/** /*
* This class is a wrapper for the Guzzle (HTTP Client Library). This class is a wrapper for the Guzzle (HTTP Client Library).
*/ */
class RestClient
{
/**
* Your API key
* @var string
*/
private $apiKey;
/** class RestClient{
* @var HttpClient
*/
protected $httpClient;
/** private $apiKey;
* @var string protected $mgClient;
*/ protected $hasFiles = False;
protected $apiHost;
/** public function __construct($apiKey, $apiEndpoint, $apiVersion, $ssl){
* The version of the API to use $this->apiKey = $apiKey;
* @var string $this->mgClient = new Guzzle($this->generateEndpoint($apiEndpoint, $apiVersion, $ssl));
*/ $this->mgClient->setDefaultOption('curl.options', array('CURLOPT_FORBID_REUSE' => true));
protected $apiVersion = 'v2'; $this->mgClient->setDefaultOption('auth', array (API_USER, $this->apiKey));
$this->mgClient->setDefaultOption('exceptions', false);
$this->mgClient->setUserAgent(SDK_USER_AGENT . '/' . SDK_VERSION);
}
/** public function post($endpointUrl, $postData = array(), $files = array()){
* If we should use SSL or not $request = $this->mgClient->post($endpointUrl, array(), $postData);
* @var bool
*/
protected $sslEnabled = true;
/** if(isset($files["message"])){
* @param string $apiKey $this->hasFiles = True;
* @param string $apiHost foreach($files as $message){
* @param HttpClient $httpClient $request->addPostFile("message", $message);
*/ }
public function __construct($apiKey, $apiHost, HttpClient $httpClient = null) }
{
$this->apiKey = $apiKey;
$this->apiHost = $apiHost;
$this->httpClient = $httpClient;
}
/** if(isset($files["attachment"])){
* @param string $method $this->hasFiles = True;
* @param string $uri foreach($files["attachment"] as $attachment){
* @param array $body // Backward compatibility code
* @param array $files if (is_array($attachment)){
* @param array $headers $request->addPostFile("attachment",
* $attachment['filePath'], null,
* @return \stdClass $attachment['remoteName']);
* }
* @throws GenericHTTPError else{
* @throws InvalidCredentials $request->addPostFile("attachment", $attachment);
* @throws MissingEndpoint }
* @throws MissingRequiredParameters }
*/ }
protected function send($method, $uri, $body = null, $files = [], array $headers = [])
{
$headers['User-Agent'] = Api::SDK_USER_AGENT.'/'.Api::SDK_VERSION;
$headers['Authorization'] = 'Basic '.base64_encode(sprintf('%s:%s', Api::API_USER, $this->apiKey));
if (!empty($files)) { if(isset($files["inline"])){
$body = new MultipartStream($files); $this->hasFiles = True;
$headers['Content-Type'] = 'multipart/form-data; boundary='.$body->getBoundary(); foreach($files["inline"] as $inline){
} // Backward compatibility code
if (is_array($inline)){
$request->addPostFile("inline",
$inline['filePath'], null,
$inline['remoteName']);
}
else{
$request->addPostFile("inline", $inline);
}
}
}
$request = new Request($method, $this->getApiUrl($uri), $headers, $body); /*
$response = $this->getHttpClient()->sendRequest($request); This block of code is to accommodate for a bug in Guzzle.
See https://github.com/guzzle/guzzle/issues/545.
It can be removed when Guzzle resolves the issue.
*/
return $this->responseHandler($response); if($this->hasFiles){
} $request->getPostFields()->setAggregator(new PhpAggregator());
}
/** else{
* @param string $endpointUrl $request->getPostFields()->setAggregator(new DuplicateAggregator());
* @param array $postData }
* @param array $files
*
* @return \stdClass
*
* @throws GenericHTTPError
* @throws InvalidCredentials
* @throws MissingEndpoint
* @throws MissingRequiredParameters
*/
public function post($endpointUrl, $postData = array(), $files = array())
{
$postFiles = [];
$fields = ['message', 'attachment', 'inline']; $response = $request->send();
foreach ($fields as $fieldName) { return $this->responseHandler($response);
if (isset($files[$fieldName])) { }
if (is_array($files[$fieldName])) {
foreach ($files[$fieldName] as $file) {
$postFiles[] = $this->prepareFile($fieldName, $file);
}
} else {
$postFiles[] = $this->prepareFile($fieldName, $files[$fieldName]);
}
}
}
$postDataMultipart = []; public function get($endpointUrl, $queryString = array()){
foreach ($postData as $key => $value) { $request = $this->mgClient->get($endpointUrl);
if (is_array($value)) { if(isset($queryString)){
foreach ($value as $subValue) { foreach($queryString as $key=>$value){
$postDataMultipart[] = [ $request->getQuery()->set($key, $value);
'name' => $key, }
'contents' => $subValue, }
]; $response = $request->send();
} return $this->responseHandler($response);
} else { }
$postDataMultipart[] = [
'name' => $key,
'contents' => $value,
];
}
}
return $this->send('POST', $endpointUrl, [], array_merge($postDataMultipart, $postFiles)); public function delete($endpointUrl){
} $request = $this->mgClient->delete($endpointUrl);
$response = $request->send();
return $this->responseHandler($response);
}
/** public function put($endpointUrl, $putData){
* @param string $endpointUrl $request = $this->mgClient->put($endpointUrl, array(), $putData);
* @param array $queryString $request->getPostFields()->setAggregator(new DuplicateAggregator());
* $response = $request->send();
* @return \stdClass return $this->responseHandler($response);
* }
* @throws GenericHTTPError
* @throws InvalidCredentials
* @throws MissingEndpoint
* @throws MissingRequiredParameters
*/
public function get($endpointUrl, $queryString = array())
{
return $this->send('GET', $endpointUrl.'?'.http_build_query($queryString));
}
/** public function responseHandler($responseObj){
* @param string $endpointUrl $httpResponseCode = $responseObj->getStatusCode();
* if($httpResponseCode === 200){
* @return \stdClass $data = (string) $responseObj->getBody();
* $jsonResponseData = json_decode($data, false);
* @throws GenericHTTPError $result = new \stdClass();
* @throws InvalidCredentials // return response data as json if possible, raw if not
* @throws MissingEndpoint $result->http_response_body = $data && $jsonResponseData === null ? $data : $jsonResponseData;
* @throws MissingRequiredParameters }
*/ elseif($httpResponseCode == 400){
public function delete($endpointUrl) throw new MissingRequiredParameters(EXCEPTION_MISSING_REQUIRED_PARAMETERS);
{ }
return $this->send('DELETE', $endpointUrl); elseif($httpResponseCode == 401){
} throw new InvalidCredentials(EXCEPTION_INVALID_CREDENTIALS);
}
elseif($httpResponseCode == 404){
throw new MissingEndpoint(EXCEPTION_MISSING_ENDPOINT);
}
else{
throw new GenericHTTPError(EXCEPTION_GENERIC_HTTP_ERROR, $httpResponseCode, $responseObj->getBody());
}
$result->http_response_code = $httpResponseCode;
return $result;
}
/** private function generateEndpoint($apiEndpoint, $apiVersion, $ssl){
* @param string $endpointUrl if(!$ssl){
* @param array $putData return "http://" . $apiEndpoint . "/" . $apiVersion . "/";
* }
* @return \stdClass else{
* return "https://" . $apiEndpoint . "/" . $apiVersion . "/";
* @throws GenericHTTPError }
* @throws InvalidCredentials }
* @throws MissingEndpoint
* @throws MissingRequiredParameters
*/
public function put($endpointUrl, $putData)
{
return $this->send('PUT', $endpointUrl, $putData);
}
/**
* @param ResponseInterface $responseObj
*
* @return \stdClass
*
* @throws GenericHTTPError
* @throws InvalidCredentials
* @throws MissingEndpoint
* @throws MissingRequiredParameters
*/
public function responseHandler(ResponseInterface $responseObj)
{
$httpResponseCode = $responseObj->getStatusCode();
if ($httpResponseCode === 200) {
$data = (string) $responseObj->getBody();
$jsonResponseData = json_decode($data, false);
$result = new \stdClass();
// return response data as json if possible, raw if not
$result->http_response_body = $data && $jsonResponseData === null ? $data : $jsonResponseData;
} elseif ($httpResponseCode == 400) {
throw new MissingRequiredParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_PARAMETERS.$this->getResponseExceptionMessage($responseObj));
} elseif ($httpResponseCode == 401) {
throw new InvalidCredentials(ExceptionMessages::EXCEPTION_INVALID_CREDENTIALS);
} elseif ($httpResponseCode == 404) {
throw new MissingEndpoint(ExceptionMessages::EXCEPTION_MISSING_ENDPOINT.$this->getResponseExceptionMessage($responseObj));
} else {
throw new GenericHTTPError(ExceptionMessages::EXCEPTION_GENERIC_HTTP_ERROR, $httpResponseCode, $responseObj->getBody());
}
$result->http_response_code = $httpResponseCode;
return $result;
}
/**
* @param ResponseInterface $responseObj
*
* @return string
*/
protected function getResponseExceptionMessage(ResponseInterface $responseObj)
{
$body = (string) $responseObj->getBody();
$response = json_decode($body);
if (json_last_error() == JSON_ERROR_NONE && isset($response->message)) {
return ' '.$response->message;
}
}
/**
* Prepare a file for the postBody.
*
* @param string $fieldName
* @param string|array $filePath
*/
protected function prepareFile($fieldName, $filePath)
{
$filename = null;
// Backward compatibility code
if (is_array($filePath)) {
$filename = $filePath['remoteName'];
$filePath = $filePath['filePath'];
}
// Remove leading @ symbol
if (strpos($filePath, '@') === 0) {
$filePath = substr($filePath, 1);
}
return [
'name' => $fieldName,
'contents' => fopen($filePath, 'r'),
'filename' => $filename,
];
}
/**
*
* @return HttpClient
*/
protected function getHttpClient()
{
if ($this->httpClient === null) {
$this->httpClient = HttpClientDiscovery::find();
}
return $this->httpClient;
}
/**
* @param $uri
*
* @return string
*/
private function getApiUrl($uri)
{
return $this->generateEndpoint($this->apiHost, $this->apiVersion, $this->sslEnabled).$uri;
}
/**
* @param string $apiEndpoint
* @param string $apiVersion
* @param bool $ssl
*
* @return string
*/
private function generateEndpoint($apiEndpoint, $apiVersion, $ssl)
{
if (!$ssl) {
return 'http://'.$apiEndpoint.'/'.$apiVersion.'/';
} else {
return 'https://'.$apiEndpoint.'/'.$apiVersion.'/';
}
}
/**
* @param string $apiVersion
*
* @return RestClient
*/
public function setApiVersion($apiVersion)
{
$this->apiVersion = $apiVersion;
return $this;
}
/**
* @param boolean $sslEnabled
*
* @return RestClient
*/
public function setSslEnabled($sslEnabled)
{
$this->sslEnabled = $sslEnabled;
return $this;
}
} }

View File

@ -1,16 +0,0 @@
<?php
namespace Mailgun\Constants;
class Api {
const API_USER = "api";
const SDK_VERSION = "1.7";
const SDK_USER_AGENT = "mailgun-sdk-php";
const RECIPIENT_COUNT_LIMIT = 1000;
const CAMPAIGN_ID_LIMIT = 3;
const TAG_LIMIT = 3;
const DEFAULT_TIME_ZONE = "UTC";
}

View File

@ -0,0 +1,23 @@
<?PHP
const API_USER = "api";
const SDK_VERSION = "1.7";
const SDK_USER_AGENT = "mailgun-sdk-php";
const RECIPIENT_COUNT_LIMIT = 1000;
const CAMPAIGN_ID_LIMIT = 3;
const TAG_LIMIT = 3;
const DEFAULT_TIME_ZONE = "UTC";
//Common Exception Messages
const EXCEPTION_INVALID_CREDENTIALS = "Your credentials are incorrect.";
const EXCEPTION_GENERIC_HTTP_ERROR = "An HTTP Error has occurred! Check your network connection and try again.";
const EXCEPTION_MISSING_REQUIRED_PARAMETERS = "The parameters passed to the API were invalid. Check your inputs!";
const EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS = "The parameters passed to the API were invalid. Check your inputs!";
const EXCEPTION_MISSING_ENDPOINT = "The endpoint you've tried to access does not exist. Check your URL.";
const TOO_MANY_RECIPIENTS = "You've exceeded the maximum recipient count (1,000) on the to field with autosend disabled.";
const INVALID_PARAMETER_NON_ARRAY = "The parameter you've passed in position 2 must be an array.";
const INVALID_PARAMETER_ATTACHMENT = "Attachments must be passed with an \"@\" preceding the file path. Web resources not supported.";
const INVALID_PARAMETER_INLINE = "Inline images must be passed with an \"@\" preceding the file path. Web resources not supported.";
const TOO_MANY_PARAMETERS_CAMPAIGNS = "You've exceeded the maximum (3) campaigns for a single message.";
const TOO_MANY_PARAMETERS_TAGS = "You've exceeded the maximum (3) tags for a single message.";
const TOO_MANY_PARAMETERS_RECIPIENT = "You've exceeded the maximum recipient count (1,000) on the to field with autosend disabled.";

View File

@ -1,21 +0,0 @@
<?php
namespace Mailgun\Constants;
class ExceptionMessages {
const EXCEPTION_INVALID_CREDENTIALS = "Your credentials are incorrect.";
const EXCEPTION_GENERIC_HTTP_ERROR = "An HTTP Error has occurred! Check your network connection and try again.";
const EXCEPTION_MISSING_REQUIRED_PARAMETERS = "The parameters passed to the API were invalid. Check your inputs!";
const EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS = "The parameters passed to the API were invalid. Check your inputs!";
const EXCEPTION_MISSING_ENDPOINT = "The endpoint you've tried to access does not exist. Check your URL.";
const TOO_MANY_RECIPIENTS = "You've exceeded the maximum recipient count (1,000) on the to field with autosend disabled.";
const INVALID_PARAMETER_NON_ARRAY = "The parameter you've passed in position 2 must be an array.";
const INVALID_PARAMETER_ATTACHMENT = "Attachments must be passed with an \"@\" preceding the file path. Web resources not supported.";
const INVALID_PARAMETER_INLINE = "Inline images must be passed with an \"@\" preceding the file path. Web resources not supported.";
const TOO_MANY_PARAMETERS_CAMPAIGNS = "You've exceeded the maximum (3) campaigns for a single message.";
const TOO_MANY_PARAMETERS_TAGS = "You've exceeded the maximum (3) tags for a single message.";
const TOO_MANY_PARAMETERS_RECIPIENT = "You've exceeded the maximum recipient count (1,000) on the to field with autosend disabled.";
}

View File

@ -6,20 +6,17 @@ use Mailgun\Messages\Exceptions\InvalidParameter;
use Mailgun\Messages\Exceptions\TooManyParameters; use Mailgun\Messages\Exceptions\TooManyParameters;
use Mailgun\Messages\Expcetions\InvalidParameterType; use Mailgun\Messages\Expcetions\InvalidParameterType;
/** /*
* This class is used for creating a unique hash for This class is used for creating a unique hash for
* mailing list subscription double-opt in requests. mailing list subscription double-opt in requests.
* */
* @link https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Lists/README.md
*/
class OptInHandler{ class OptInHandler{
/** function __construct(){
* @param string $mailingList
* @param string $secretAppId }
* @param string $recipientAddress
* @return string
*/
public function generateHash($mailingList, $secretAppId, $recipientAddress){ public function generateHash($mailingList, $secretAppId, $recipientAddress){
$innerPayload = array('r' => $recipientAddress, 'l' => $mailingList); $innerPayload = array('r' => $recipientAddress, 'l' => $mailingList);
$encodedInnerPayload = base64_encode(json_encode($innerPayload)); $encodedInnerPayload = base64_encode(json_encode($innerPayload));
@ -30,11 +27,6 @@ class OptInHandler{
return urlencode(base64_encode(json_encode($outerPayload))); return urlencode(base64_encode(json_encode($outerPayload)));
} }
/**
* @param string $secretAppId
* @param string $uniqueHash
* @return array|bool
*/
public function validateHash($secretAppId, $uniqueHash){ public function validateHash($secretAppId, $uniqueHash){
$decodedOuterPayload = json_decode(base64_decode(urldecode($uniqueHash)), true); $decodedOuterPayload = json_decode(base64_decode(urldecode($uniqueHash)), true);

View File

@ -2,57 +2,36 @@
namespace Mailgun; namespace Mailgun;
use Http\Client\HttpClient; require_once 'Constants/Constants.php';
use Mailgun\Constants\ExceptionMessages;
use Mailgun\Messages\Messages;
use Mailgun\Messages\Exceptions; use Mailgun\Messages\Exceptions;
use Mailgun\Connection\RestClient; use Mailgun\Connection\RestClient;
use Mailgun\Messages\BatchMessage; use Mailgun\Messages\BatchMessage;
use Mailgun\Lists\OptInHandler; use Mailgun\Lists\OptInHandler;
use Mailgun\Messages\MessageBuilder; use Mailgun\Messages\MessageBuilder;
/** /*
* This class is the base class for the Mailgun SDK. This class is the base class for the Mailgun SDK.
* See the official documentation (link below) for usage instructions. See the official documentation for usage instructions.
* */
* @link https://github.com/mailgun/mailgun-php/blob/master/README.md
*/
class Mailgun{ class Mailgun{
protected $workingDomain;
/**
* @var RestClient
*/
protected $restClient; protected $restClient;
/**
* @var null|string
*/
protected $apiKey; protected $apiKey;
/** public function __construct($apiKey = null, $apiEndpoint = "api.mailgun.net", $apiVersion = "v2", $ssl = true){
* @param string|null $apiKey
* @param HttpClient $httpClient
* @param string $apiEndpoint
*/
public function __construct(
$apiKey = null,
HttpClient $httpClient = null,
$apiEndpoint = 'api.mailgun.net'
) {
$this->apiKey = $apiKey; $this->apiKey = $apiKey;
$this->restClient = new RestClient($apiKey, $apiEndpoint, $httpClient); $this->restClient = new RestClient($apiKey, $apiEndpoint, $apiVersion, $ssl);
} }
/**
* 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.
*
* @param string $workingDomain
* @param array $postData
* @param array $postFiles
* @throws Exceptions\MissingRequiredMIMEParameters
*/
public function sendMessage($workingDomain, $postData, $postFiles = array()){ public function sendMessage($workingDomain, $postData, $postFiles = array()){
/*
* 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.
*/
if(is_array($postFiles)){ if(is_array($postFiles)){
return $this->post("$workingDomain/messages", $postData, $postFiles); return $this->post("$workingDomain/messages", $postData, $postFiles);
} }
@ -68,24 +47,21 @@ class Mailgun{
return $result; return $result;
} }
else{ else{
throw new Exceptions\MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); throw new Exceptions\MissingRequiredMIMEParameters(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.
*
* @param array|null $postData
* @return bool
*/
public function verifyWebhookSignature($postData = NULL) { public function verifyWebhookSignature($postData = NULL) {
/*
* 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.
*/
if(is_null($postData)) { if(is_null($postData)) {
$postData = $_POST; $postData = $_POST;
} }
@ -100,85 +76,30 @@ class Mailgun{
} }
} }
/**
* @param string $endpointUrl
* @param array $postData
* @param array $files
* @return \stdClass
*/
public function post($endpointUrl, $postData = array(), $files = array()){ public function post($endpointUrl, $postData = array(), $files = array()){
return $this->restClient->post($endpointUrl, $postData, $files); return $this->restClient->post($endpointUrl, $postData, $files);
} }
/**
* @param string $endpointUrl
* @param array $queryString
* @return \stdClass
*/
public function get($endpointUrl, $queryString = array()){ public function get($endpointUrl, $queryString = array()){
return $this->restClient->get($endpointUrl, $queryString); return $this->restClient->get($endpointUrl, $queryString);
} }
/**
* @param string $endpointUrl
* @return \stdClass
*/
public function delete($endpointUrl){ public function delete($endpointUrl){
return $this->restClient->delete($endpointUrl); return $this->restClient->delete($endpointUrl);
} }
/**
* @param string $endpointUrl
* @param array $putData
* @return \stdClass
*/
public function put($endpointUrl, $putData){ public function put($endpointUrl, $putData){
return $this->restClient->put($endpointUrl, $putData); return $this->restClient->put($endpointUrl, $putData);
} }
/**
* @param string $apiVersion
*
* @return Mailgun
*/
public function setApiVersion($apiVersion)
{
$this->restClient->setApiVersion($apiVersion);
return $this;
}
/**
* @param boolean $sslEnabled
*
* @return Mailgun
*/
public function setSslEnabled($sslEnabled)
{
$this->restClient->setSslEnabled($sslEnabled);
return $this;
}
/**
* @return MessageBuilder
*/
public function MessageBuilder(){ public function MessageBuilder(){
return new MessageBuilder(); return new MessageBuilder();
} }
/**
* @return OptInHandler
*/
public function OptInHandler(){ public function OptInHandler(){
return new OptInHandler(); return new OptInHandler();
} }
/**
* @param string $workingDomain
* @param bool $autoSend
* @return BatchMessage
*/
public function BatchMessage($workingDomain, $autoSend = true){ public function BatchMessage($workingDomain, $autoSend = true){
return new BatchMessage($this->restClient, $workingDomain, $autoSend); return new BatchMessage($this->restClient, $workingDomain, $autoSend);
} }

View File

@ -2,49 +2,23 @@
namespace Mailgun\Messages; namespace Mailgun\Messages;
use Mailgun\Constants\Api; use Mailgun\Messages\MessageBuilder;
use Mailgun\Constants\ExceptionMessages;
use Mailgun\Messages\Exceptions\TooManyParameters; use Mailgun\Messages\Exceptions\TooManyParameters;
use Mailgun\Messages\Exceptions\MissingRequiredMIMEParameters; use Mailgun\Messages\Exceptions\MissingRequiredMIMEParameters;
/** /*
* This class is used for batch sending. See the official documentation (link below) This class is used for batch sending. See the official documentation
* for usage instructions. for usage instructions.
* */
* @link https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Messages/README.md
*/
class BatchMessage extends MessageBuilder{ class BatchMessage extends MessageBuilder{
/**
* @var array
*/
private $batchRecipientAttributes; private $batchRecipientAttributes;
/**
* @var boolean
*/
private $autoSend; private $autoSend;
/**
* @var \Mailgun\Connection\RestClient
*/
private $restClient; private $restClient;
/**
* @var string
*/
private $workingDomain; private $workingDomain;
/**
* @var array
*/
private $messageIds = array(); private $messageIds = array();
/**
* @param \Mailgun\Connection\RestClient $restClient
* @param string $workingDomain
* @param boolean $autoSend
*/
public function __construct($restClient, $workingDomain, $autoSend){ public function __construct($restClient, $workingDomain, $autoSend){
$this->batchRecipientAttributes = array(); $this->batchRecipientAttributes = array();
$this->autoSend = $autoSend; $this->autoSend = $autoSend;
@ -53,18 +27,11 @@ class BatchMessage extends MessageBuilder{
$this->endpointUrl = $workingDomain . "/messages"; $this->endpointUrl = $workingDomain . "/messages";
} }
/**
* @param string $headerName
* @param string $address
* @param array $variables
* @throws MissingRequiredMIMEParameters
* @throws TooManyParameters
*/
protected function addRecipient($headerName, $address, $variables){ protected function addRecipient($headerName, $address, $variables){
if(array_key_exists($headerName, $this->counters['recipients'])){ if(array_key_exists($headerName, $this->counters['recipients'])){
if($this->counters['recipients'][$headerName] == Api::RECIPIENT_COUNT_LIMIT){ if($this->counters['recipients'][$headerName] == RECIPIENT_COUNT_LIMIT){
if($this->autoSend == false){ if($this->autoSend == false){
throw new TooManyParameters(ExceptionMessages::TOO_MANY_RECIPIENTS); throw new TooManyParameters(TOO_MANY_RECIPIENTS);
} }
$this->sendMessage(); $this->sendMessage();
} }
@ -91,27 +58,22 @@ class BatchMessage extends MessageBuilder{
$this->batchRecipientAttributes["$address"] = $variables; $this->batchRecipientAttributes["$address"] = $variables;
} }
/**
* @param array $message
* @param array $files
* @throws MissingRequiredMIMEParameters
*/
public function sendMessage($message = array(), $files = array()){ public function sendMessage($message = array(), $files = array()){
if(count($message) < 1){ if(count($message) < 1){
$message = $this->message; $message = $this->message;
$files = $this->files; $files = $this->files;
} }
if(!array_key_exists("from", $message)){ if(!array_key_exists("from", $message)){
throw new MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); throw new MissingRequiredMIMEParameters(EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS);
} }
elseif(!array_key_exists("to", $message)){ elseif(!array_key_exists("to", $message)){
throw new MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); throw new MissingRequiredMIMEParameters(EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS);
} }
elseif(!array_key_exists("subject", $message)){ elseif(!array_key_exists("subject", $message)){
throw new MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); throw new MissingRequiredMIMEParameters(EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS);
} }
elseif((!array_key_exists("text", $message) && !array_key_exists("html", $message))){ elseif((!array_key_exists("text", $message) && !array_key_exists("html", $message))){
throw new MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); throw new MissingRequiredMIMEParameters(EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS);
} }
else{ else{
$message["recipient-variables"] = json_encode($this->batchRecipientAttributes); $message["recipient-variables"] = json_encode($this->batchRecipientAttributes);
@ -125,16 +87,10 @@ class BatchMessage extends MessageBuilder{
} }
} }
/**
* @throws MissingRequiredMIMEParameters
*/
public function finalize(){ public function finalize(){
$this->sendMessage(); return $this->sendMessage();
} }
/**
* @return string[]
*/
public function getMessageIds(){ public function getMessageIds(){
return $this->messageIds; return $this->messageIds;
} }

View File

@ -2,39 +2,23 @@
namespace Mailgun\Messages; namespace Mailgun\Messages;
use Mailgun\Constants\Api;
use Mailgun\Constants\ExceptionMessages;
use Mailgun\Messages\Exceptions\InvalidParameter; use Mailgun\Messages\Exceptions\InvalidParameter;
use Mailgun\Messages\Exceptions\TooManyParameters; use Mailgun\Messages\Exceptions\TooManyParameters;
use Mailgun\Messages\Exceptions\InvalidParameterType;
/*
This class is used for composing a properly formed
message object. Dealing with arrays can be cumbersome,
this class makes the process easier. See the official
documentation for usage instructions.
*/
/**
* This class is used for composing a properly formed
* message object. Dealing with arrays can be cumbersome,
* this class makes the process easier. See the official
* documentation (link below) for usage instructions.
*
* @link https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Messages/README.md
*/
class MessageBuilder class MessageBuilder
{ {
/**
* @var array
*/
protected $message = array(); protected $message = array();
/**
* @var array
*/
protected $variables = array(); protected $variables = array();
/**
* @var array
*/
protected $files = array(); protected $files = array();
/**
* @var array
*/
protected $counters = array( protected $counters = array(
'recipients' => array( 'recipients' => array(
'to' => 0, 'to' => 0,
@ -49,12 +33,6 @@ class MessageBuilder
) )
); );
/**
* @param array $params
* @param string $key
* @param mixed $default
* @return mixed
*/
protected function safeGet($params, $key, $default) protected function safeGet($params, $key, $default)
{ {
if (array_key_exists($key, $params)) { if (array_key_exists($key, $params)) {
@ -64,10 +42,6 @@ class MessageBuilder
return $default; return $default;
} }
/**
* @param array $params
* @return mixed|string
*/
protected function getFullName($params) protected function getFullName($params)
{ {
if (array_key_exists("first", $params)) { if (array_key_exists("first", $params)) {
@ -80,11 +54,6 @@ class MessageBuilder
return $this->safeGet($params, "full_name", ""); return $this->safeGet($params, "full_name", "");
} }
/**
* @param string $address
* @param array $variables
* @return string
*/
protected function parseAddress($address, $variables) protected function parseAddress($address, $variables)
{ {
if (!is_array($variables)) { if (!is_array($variables)) {
@ -98,11 +67,6 @@ class MessageBuilder
return $address; return $address;
} }
/**
* @param string $headerName
* @param string $address
* @param array $variables
*/
protected function addRecipient($headerName, $address, $variables) protected function addRecipient($headerName, $address, $variables)
{ {
$compiledAddress = $this->parseAddress($address, $variables); $compiledAddress = $this->parseAddress($address, $variables);
@ -119,59 +83,36 @@ class MessageBuilder
} }
} }
/**
* @param string $address
* @param array|null $variables
* @return mixed
* @throws TooManyParameters
*/
public function addToRecipient($address, $variables = null) public function addToRecipient($address, $variables = null)
{ {
if ($this->counters['recipients']['to'] > Api::RECIPIENT_COUNT_LIMIT) { if ($this->counters['recipients']['to'] > RECIPIENT_COUNT_LIMIT) {
throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_RECIPIENT); throw new TooManyParameters(TOO_MANY_PARAMETERS_RECIPIENT);
} }
$this->addRecipient("to", $address, $variables); $this->addRecipient("to", $address, $variables);
return end($this->message['to']); return end($this->message['to']);
} }
/**
* @param string $address
* @param array|null $variables
* @return mixed
* @throws TooManyParameters
*/
public function addCcRecipient($address, $variables = null) public function addCcRecipient($address, $variables = null)
{ {
if ($this->counters['recipients']['cc'] > Api::RECIPIENT_COUNT_LIMIT) { if ($this->counters['recipients']['cc'] > RECIPIENT_COUNT_LIMIT) {
throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_RECIPIENT); throw new TooManyParameters(TOO_MANY_PARAMETERS_RECIPIENT);
} }
$this->addRecipient("cc", $address, $variables); $this->addRecipient("cc", $address, $variables);
return end($this->message['cc']); return end($this->message['cc']);
} }
/**
* @param string $address
* @param array|null $variables
* @return mixed
* @throws TooManyParameters
*/
public function addBccRecipient($address, $variables = null) public function addBccRecipient($address, $variables = null)
{ {
if ($this->counters['recipients']['bcc'] > Api::RECIPIENT_COUNT_LIMIT) { if ($this->counters['recipients']['bcc'] > RECIPIENT_COUNT_LIMIT) {
throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_RECIPIENT); throw new TooManyParameters(TOO_MANY_PARAMETERS_RECIPIENT);
} }
$this->addRecipient("bcc", $address, $variables); $this->addRecipient("bcc", $address, $variables);
return end($this->message['bcc']); return end($this->message['bcc']);
} }
/**
* @param string $address
* @param array|null $variables
* @return mixed
*/
public function setFromAddress($address, $variables = null) public function setFromAddress($address, $variables = null)
{ {
$this->addRecipient("from", $address, $variables); $this->addRecipient("from", $address, $variables);
@ -179,11 +120,6 @@ class MessageBuilder
return $this->message['from']; return $this->message['from'];
} }
/**
* @param string $address
* @param array|null $variables
* @return mixed
*/
public function setReplyToAddress($address, $variables = null) public function setReplyToAddress($address, $variables = null)
{ {
$this->addRecipient("h:reply-to", $address, $variables); $this->addRecipient("h:reply-to", $address, $variables);
@ -191,11 +127,7 @@ class MessageBuilder
return $this->message['h:reply-to']; return $this->message['h:reply-to'];
} }
/** public function setSubject($subject = null)
* @param string $subject
* @return mixed
*/
public function setSubject($subject = "")
{ {
if ($subject == null || $subject == "") { if ($subject == null || $subject == "") {
$subject = " "; $subject = " ";
@ -205,11 +137,6 @@ class MessageBuilder
return $this->message['subject']; return $this->message['subject'];
} }
/**
* @param string $headerName
* @param mixed $headerData
* @return mixed
*/
public function addCustomHeader($headerName, $headerData) public function addCustomHeader($headerName, $headerData)
{ {
if (!preg_match("/^h:/i", $headerName)) { if (!preg_match("/^h:/i", $headerName)) {
@ -220,10 +147,6 @@ class MessageBuilder
return $this->message[$headerName]; return $this->message[$headerName];
} }
/**
* @param string $textBody
* @return string
*/
public function setTextBody($textBody) public function setTextBody($textBody)
{ {
if ($textBody == null || $textBody == "") { if ($textBody == null || $textBody == "") {
@ -234,10 +157,6 @@ class MessageBuilder
return $this->message['text']; return $this->message['text'];
} }
/**
* @param string $htmlBody
* @return string
*/
public function setHtmlBody($htmlBody) public function setHtmlBody($htmlBody)
{ {
if ($htmlBody == null || $htmlBody == "") { if ($htmlBody == null || $htmlBody == "") {
@ -248,11 +167,6 @@ class MessageBuilder
return $this->message['html']; return $this->message['html'];
} }
/**
* @param string $attachmentPath
* @param string|null $attachmentName
* @return bool
*/
public function addAttachment($attachmentPath, $attachmentName = null) public function addAttachment($attachmentPath, $attachmentName = null)
{ {
if (isset($this->files["attachment"])) { if (isset($this->files["attachment"])) {
@ -273,11 +187,6 @@ class MessageBuilder
return true; return true;
} }
/**
* @param string $inlineImagePath
* @param string|null $inlineImageName
* @throws InvalidParameter
*/
public function addInlineImage($inlineImagePath, $inlineImageName = null) public function addInlineImage($inlineImagePath, $inlineImageName = null)
{ {
if (preg_match("/^@/", $inlineImagePath)) { if (preg_match("/^@/", $inlineImagePath)) {
@ -298,14 +207,10 @@ class MessageBuilder
return true; return true;
} else { } else {
throw new InvalidParameter(ExceptionMessages::INVALID_PARAMETER_INLINE); throw new InvalidParameter(INVALID_PARAMETER_INLINE);
} }
} }
/**
* @param boolean $testMode
* @return string
*/
public function setTestMode($testMode) public function setTestMode($testMode)
{ {
if (filter_var($testMode, FILTER_VALIDATE_BOOLEAN)) { if (filter_var($testMode, FILTER_VALIDATE_BOOLEAN)) {
@ -318,14 +223,9 @@ class MessageBuilder
return $this->message['o:testmode']; return $this->message['o:testmode'];
} }
/**
* @param string|int $campaignId
* @return string|int
* @throws TooManyParameters
*/
public function addCampaignId($campaignId) public function addCampaignId($campaignId)
{ {
if ($this->counters['attributes']['campaign_id'] < Api::CAMPAIGN_ID_LIMIT) { if ($this->counters['attributes']['campaign_id'] < CAMPAIGN_ID_LIMIT) {
if (isset($this->message['o:campaign'])) { if (isset($this->message['o:campaign'])) {
array_push($this->message['o:campaign'], $campaignId); array_push($this->message['o:campaign'], $campaignId);
} else { } else {
@ -335,17 +235,13 @@ class MessageBuilder
return $this->message['o:campaign']; return $this->message['o:campaign'];
} else { } else {
throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_CAMPAIGNS); throw new TooManyParameters(TOO_MANY_PARAMETERS_CAMPAIGNS);
} }
} }
/**
* @param string $tag
* @throws TooManyParameters
*/
public function addTag($tag) public function addTag($tag)
{ {
if ($this->counters['attributes']['tag'] < Api::TAG_LIMIT) { if ($this->counters['attributes']['tag'] < TAG_LIMIT) {
if (isset($this->message['o:tag'])) { if (isset($this->message['o:tag'])) {
array_push($this->message['o:tag'], $tag); array_push($this->message['o:tag'], $tag);
} else { } else {
@ -355,14 +251,10 @@ class MessageBuilder
return $this->message['o:tag']; return $this->message['o:tag'];
} else { } else {
throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_TAGS); throw new TooManyParameters(TOO_MANY_PARAMETERS_TAGS);
} }
} }
/**
* @param boolean $enabled
* @return mixed
*/
public function setDkim($enabled) public function setDkim($enabled)
{ {
if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) { if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) {
@ -375,10 +267,6 @@ class MessageBuilder
return $this->message["o:dkim"]; return $this->message["o:dkim"];
} }
/**
* @param boolean $enabled
* @return string
*/
public function setOpenTracking($enabled) public function setOpenTracking($enabled)
{ {
if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) { if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) {
@ -391,10 +279,6 @@ class MessageBuilder
return $this->message['o:tracking-opens']; return $this->message['o:tracking-opens'];
} }
/**
* @param boolean $enabled
* @return string
*/
public function setClickTracking($enabled) public function setClickTracking($enabled)
{ {
if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) { if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) {
@ -409,17 +293,12 @@ class MessageBuilder
return $this->message['o:tracking-clicks']; return $this->message['o:tracking-clicks'];
} }
/**
* @param string $timeDate
* @param string|null $timeZone
* @return string
*/
public function setDeliveryTime($timeDate, $timeZone = null) public function setDeliveryTime($timeDate, $timeZone = null)
{ {
if (isset($timeZone)) { if (isset($timeZone)) {
$timeZoneObj = new \DateTimeZone("$timeZone"); $timeZoneObj = new \DateTimeZone("$timeZone");
} else { } else {
$timeZoneObj = new \DateTimeZone(Api::DEFAULT_TIME_ZONE); $timeZoneObj = new \DateTimeZone(\DEFAULT_TIME_ZONE);
} }
$dateTimeObj = new \DateTime($timeDate, $timeZoneObj); $dateTimeObj = new \DateTime($timeDate, $timeZoneObj);
@ -429,20 +308,11 @@ class MessageBuilder
return $this->message['o:deliverytime']; return $this->message['o:deliverytime'];
} }
/**
* @param string $customName
* @param mixed $data
*/
public function addCustomData($customName, $data) public function addCustomData($customName, $data)
{ {
$this->message['v:' . $customName] = json_encode($data); $this->message['v:' . $customName] = json_encode($data);
} }
/**
* @param string $parameterName
* @param mixed $data
* @return mixed
*/
public function addCustomParameter($parameterName, $data) public function addCustomParameter($parameterName, $data)
{ {
if (isset($this->message[$parameterName])) { if (isset($this->message[$parameterName])) {
@ -456,25 +326,16 @@ class MessageBuilder
} }
} }
/**
* @param array $message
*/
public function setMessage($message) public function setMessage($message)
{ {
$this->message = $message; $this->message = $message;
} }
/**
* @return array
*/
public function getMessage() public function getMessage()
{ {
return $this->message; return $this->message;
} }
/**
* @return array
*/
public function getFiles() public function getFiles()
{ {
return $this->files; return $this->files;

View File

@ -0,0 +1,19 @@
<?PHP
namespace Mailgun\Tests\Connection;
use Mailgun\Tests\Mock\Mailgun;
class ConnectionTest extends \Mailgun\Tests\MailgunTestCase
{
private $client;
public function setUp()
{
}
public function testNewClientInstantiation()
{
$this->client = new Mailgun("My-Super-Awesome-API-Key", "samples.mailgun.org", false);
}
}

View File

@ -16,21 +16,21 @@ class MailgunTest extends \Mailgun\Tests\MailgunTestCase
public function testVerifyWebhookGood() { public function testVerifyWebhookGood() {
$client = new Mailgun('key-3ax6xnjp29jd6fds4gc373sgvjxteol0'); $client = new Mailgun('key-3ax6xnjp29jd6fds4gc373sgvjxteol0');
$postData = array( $postData = [
'timestamp' => '1403645220', 'timestamp' => '1403645220',
'token' => '5egbgr1vjgqxtrnp65xfznchgdccwh5d6i09vijqi3whgowmn6', 'token' => '5egbgr1vjgqxtrnp65xfznchgdccwh5d6i09vijqi3whgowmn6',
'signature' => '9cfc5c41582e51246e73c88d34db3af0a3a2692a76fbab81492842f000256d33', 'signature' => '9cfc5c41582e51246e73c88d34db3af0a3a2692a76fbab81492842f000256d33',
); ];
assert($client->verifyWebhookSignature($postData)); assert($client->verifyWebhookSignature($postData));
} }
public function testVerifyWebhookBad() { public function testVerifyWebhookBad() {
$client = new Mailgun('key-3ax6xnjp29jd6fds4gc373sgvjxteol0'); $client = new Mailgun('key-3ax6xnjp29jd6fds4gc373sgvjxteol0');
$postData = array( $postData = [
'timestamp' => '1403645220', 'timestamp' => '1403645220',
'token' => 'owyldpe6nxhmrn78epljl6bj0orrki1u3d2v5e6cnlmmuox8jr', 'token' => 'owyldpe6nxhmrn78epljl6bj0orrki1u3d2v5e6cnlmmuox8jr',
'signature' => '9cfc5c41582e51246e73c88d34db3af0a3a2692a76fbab81492842f000256d33', 'signature' => '9cfc5c41582e51246e73c88d34db3af0a3a2692a76fbab81492842f000256d33',
); ];
assert(!$client->verifyWebhookSignature($postData)); assert(!$client->verifyWebhookSignature($postData));
} }
} }

View File

@ -2,6 +2,8 @@
namespace Mailgun\Tests; namespace Mailgun\Tests;
abstract class MailgunTestCase extends \PHPUnit_Framework_TestCase use Guzzle\Tests\GuzzleTestCase;
abstract class MailgunTestCase extends GuzzleTestCase
{ {
} }

View File

@ -9,7 +9,7 @@ class MessageBuilderTest extends \Mailgun\Tests\MailgunTestCase
public function setUp() public function setUp()
{ {
$this->client = new Mailgun(); $this->client = new Mailgun("My-Super-Awesome-API-Key", "samples.mailgun.org", false);
} }
public function testBlankInstantiation() public function testBlankInstantiation()

View File

@ -1,11 +1,7 @@
<?php <?php
namespace Mailgun\Tests\Mock\Connection; namespace Mailgun\Tests\Mock\Connection;
use Mailgun\Connection\Exceptions\GenericHTTPError;
use Mailgun\Connection\Exceptions\InvalidCredentials;
use Mailgun\Connection\Exceptions\MissingEndpoint;
use Mailgun\Connection\RestClient; use Mailgun\Connection\RestClient;
use Mailgun\Messages\Exceptions\MissingRequiredMIMEParameters;
class TestBroker extends RestClient class TestBroker extends RestClient
{ {
@ -13,33 +9,33 @@ class TestBroker extends RestClient
protected $apiEndpoint; protected $apiEndpoint;
public function __construct($apiKey = null, $apiHost = "api.mailgun.net", $apiVersion = "v3") public function __construct($apiKey = null, $apiEndpoint = "api.mailgun.net", $apiVersion = "v2")
{ {
$this->apiKey = $apiKey; $this->apiKey = $apiKey;
$this->apiEndpoint = $apiHost; $this->apiEndpoint = $apiEndpoint;
} }
public function post($endpointUrl, $postData = array(), $files = array()) public function post($endpointUrl, $postData = array(), $files = array())
{ {
return $this->testResponseHandler($endpointUrl, $httpResponseCode = 200); return $this->responseHandler($endpointUrl, $httpResponseCode = 200);
} }
public function get($endpointUrl, $queryString = array()) public function get($endpointUrl, $queryString = array())
{ {
return $this->testResponseHandler($endpointUrl, $httpResponseCode = 200); return $this->responseHandler($endpointUrl, $httpResponseCode = 200);
} }
public function delete($endpointUrl) public function delete($endpointUrl)
{ {
return $this->testResponseHandler($endpointUrl, $httpResponseCode = 200); return $this->responseHandler($endpointUrl, $httpResponseCode = 200);
} }
public function put($endpointUrl, $queryString) public function put($endpointUrl, $queryString)
{ {
return $this->testResponseHandler($endpointUrl, $httpResponseCode = 200); return $this->responseHandler($endpointUrl, $httpResponseCode = 200);
} }
public function testResponseHandler($endpointUrl, $httpResponseCode = 200) public function responseHandler($endpointUrl, $httpResponseCode = 200)
{ {
if ($httpResponseCode === 200) { if ($httpResponseCode === 200) {
$result = new \stdClass(); $result = new \stdClass();
@ -48,13 +44,13 @@ class TestBroker extends RestClient
foreach ($jsonResponseData as $key => $value) { foreach ($jsonResponseData as $key => $value) {
$result->http_response_body->$key = $value; $result->http_response_body->$key = $value;
} }
} elseif ($httpResponseCode == 400) { } elseif ($httpStatusCode == 400) {
throw new MissingRequiredMIMEParameters(EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); throw new MissingRequiredMIMEParameters(EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS);
} elseif ($httpResponseCode == 401) { } elseif ($httpStatusCode == 401) {
throw new InvalidCredentials(EXCEPTION_INVALID_CREDENTIALS); throw new InvalidCredentials(EXCEPTION_INVALID_CREDENTIALS);
} elseif ($httpResponseCode == 401) { } elseif ($httpStatusCode == 401) {
throw new GenericHTTPError(EXCEPTION_INVALID_CREDENTIALS); throw new GenericHTTPError(EXCEPTION_INVALID_CREDENTIALS);
} elseif ($httpResponseCode == 404) { } elseif ($httpStatusCode == 404) {
throw new MissingEndpoint(EXCEPTION_MISSING_ENDPOINT); throw new MissingEndpoint(EXCEPTION_MISSING_ENDPOINT);
} else { } else {
throw new GenericHTTPError(EXCEPTION_GENERIC_HTTP_ERROR); throw new GenericHTTPError(EXCEPTION_GENERIC_HTTP_ERROR);

View File

@ -10,7 +10,7 @@ class Mailgun extends Base
protected $debug; protected $debug;
protected $restClient; protected $restClient;
public function __construct($apiKey = null, $apiEndpoint = "api.mailgun.net", $apiVersion = "v3") public function __construct($apiKey = null, $apiEndpoint = "api.mailgun.net", $apiVersion = "v2")
{ {
$this->restClient = new TestBroker($apiKey, $apiEndpoint, $apiVersion); $this->restClient = new TestBroker($apiKey, $apiEndpoint, $apiVersion);
} }