From deae7e0b59aaa627d5be7b4d61a967b0d7ea20f3 Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Tue, 19 Jul 2016 17:52:15 +0200 Subject: [PATCH] added mailgun module --- sites/all/libraries/mailgun/.gitignore | 10 + sites/all/libraries/mailgun/.travis.yml | 16 + sites/all/libraries/mailgun/CHANGELOG.md | 47 ++ sites/all/libraries/mailgun/README.md | 211 ++++++++ .../libraries/mailgun/SharedHostInstall.md | 39 ++ sites/all/libraries/mailgun/composer.json | 28 + sites/all/libraries/mailgun/phpunit.xml.dist | 19 + .../Exceptions/GenericHTTPError.php | 25 + .../Exceptions/InvalidCredentials.php | 4 + .../Connection/Exceptions/MissingEndpoint.php | 4 + .../Exceptions/MissingRequiredParameters.php | 4 + .../Exceptions/NoDomainsConfigured.php | 4 + .../src/Mailgun/Connection/RestClient.php | 326 ++++++++++++ .../mailgun/src/Mailgun/Constants/Api.php | 16 + .../Mailgun/Constants/ExceptionMessages.php | 21 + .../src/Mailgun/Lists/OptInHandler.php | 53 ++ .../mailgun/src/Mailgun/Lists/README.md | 116 +++++ .../libraries/mailgun/src/Mailgun/Mailgun.php | 185 +++++++ .../src/Mailgun/Messages/BatchMessage.php | 141 +++++ .../Messages/Exceptions/InvalidParameter.php | 4 + .../Exceptions/InvalidParameterType.php | 4 + .../MissingRequiredMIMEParameters.php | 4 + .../Messages/Exceptions/TooManyParameters.php | 4 + .../src/Mailgun/Messages/MessageBuilder.php | 482 ++++++++++++++++++ .../mailgun/src/Mailgun/Messages/README.md | 138 +++++ .../all/libraries/mailgun/tests/Bootstrap.php | 5 + .../Mailgun/Tests/Lists/OptInHandlerTest.php | 48 ++ .../tests/Mailgun/Tests/MailgunTest.php | 36 ++ .../tests/Mailgun/Tests/MailgunTestCase.php | 7 + .../Tests/Messages/BatchMessageTest.php | 172 +++++++ .../Tests/Messages/MessageBuilderTest.php | 356 +++++++++++++ .../Tests/Messages/StandardMessageTest.php | 48 ++ .../Tests/Mock/Connection/TestBroker.php | 71 +++ .../tests/Mailgun/Tests/Mock/Mailgun.php | 17 + .../Tests/TestAssets/mailgun_icon1.png | Bin 0 -> 86845 bytes .../Tests/TestAssets/mailgun_icon2.png | Bin 0 -> 86845 bytes .../modules/contrib/mail/mailgun/LICENSE.txt | 339 ++++++++++++ .../contrib/mail/mailgun/mailgun.admin.inc | 221 ++++++++ .../modules/contrib/mail/mailgun/mailgun.info | 16 + .../contrib/mail/mailgun/mailgun.install | 34 ++ .../contrib/mail/mailgun/mailgun.mail.inc | 123 +++++ .../contrib/mail/mailgun/mailgun.module | 261 ++++++++++ 42 files changed, 3659 insertions(+) create mode 100644 sites/all/libraries/mailgun/.gitignore create mode 100644 sites/all/libraries/mailgun/.travis.yml create mode 100644 sites/all/libraries/mailgun/CHANGELOG.md create mode 100644 sites/all/libraries/mailgun/README.md create mode 100644 sites/all/libraries/mailgun/SharedHostInstall.md create mode 100644 sites/all/libraries/mailgun/composer.json create mode 100644 sites/all/libraries/mailgun/phpunit.xml.dist create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/GenericHTTPError.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/InvalidCredentials.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/MissingEndpoint.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/MissingRequiredParameters.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/NoDomainsConfigured.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Connection/RestClient.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Constants/Api.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Constants/ExceptionMessages.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Lists/OptInHandler.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Lists/README.md create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Mailgun.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Messages/BatchMessage.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Messages/Exceptions/InvalidParameter.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Messages/Exceptions/InvalidParameterType.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Messages/Exceptions/MissingRequiredMIMEParameters.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Messages/Exceptions/TooManyParameters.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Messages/MessageBuilder.php create mode 100644 sites/all/libraries/mailgun/src/Mailgun/Messages/README.md create mode 100644 sites/all/libraries/mailgun/tests/Bootstrap.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/Lists/OptInHandlerTest.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/MailgunTest.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/MailgunTestCase.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/BatchMessageTest.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/MessageBuilderTest.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/StandardMessageTest.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/Mock/Connection/TestBroker.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/Mock/Mailgun.php create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/TestAssets/mailgun_icon1.png create mode 100644 sites/all/libraries/mailgun/tests/Mailgun/Tests/TestAssets/mailgun_icon2.png create mode 100644 sites/all/modules/contrib/mail/mailgun/LICENSE.txt create mode 100644 sites/all/modules/contrib/mail/mailgun/mailgun.admin.inc create mode 100644 sites/all/modules/contrib/mail/mailgun/mailgun.info create mode 100644 sites/all/modules/contrib/mail/mailgun/mailgun.install create mode 100644 sites/all/modules/contrib/mail/mailgun/mailgun.mail.inc create mode 100644 sites/all/modules/contrib/mail/mailgun/mailgun.module diff --git a/sites/all/libraries/mailgun/.gitignore b/sites/all/libraries/mailgun/.gitignore new file mode 100644 index 00000000..dc48fa8e --- /dev/null +++ b/sites/all/libraries/mailgun/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +vendor +composer.phar +smoketest.php +rackspace_logo.jpg +mailgun_icon.png +build +composer.lock +nbproject/* +.idea diff --git a/sites/all/libraries/mailgun/.travis.yml b/sites/all/libraries/mailgun/.travis.yml new file mode 100644 index 00000000..fadbf8cb --- /dev/null +++ b/sites/all/libraries/mailgun/.travis.yml @@ -0,0 +1,16 @@ +language: php + +php: + - 5.5 + - 5.6 + - 7.0 + - hhvm + +before_install: + - travis_retry composer self-update + +install: + - travis_retry composer install + +script: + - phpunit \ No newline at end of file diff --git a/sites/all/libraries/mailgun/CHANGELOG.md b/sites/all/libraries/mailgun/CHANGELOG.md new file mode 100644 index 00000000..550fd769 --- /dev/null +++ b/sites/all/libraries/mailgun/CHANGELOG.md @@ -0,0 +1,47 @@ +## 1.7 (2014-1-30) + +Bugfixes: + - patched bug for attachments related to duplicate aggregator bug in Guzzle (#32 @travelton) + +## 1.6 (2014-1-13) + +Enhancement: + - adjust file attachment/inline name (#21 @travelton) + +Bugfixes: + - fixed issue with unordered route actions (#23 @travelton) + +## 1.5 (2013-12-13) + +Enhancement: + - added ability to define non-https endpoint for debugging purposes (#23 @travelton) + +## 1.4 (2013-10-16) + +Bugfixes: + - template IDs were missing from recipient-variables (#15 @travelton) + - batch jobs trigger on to, cc, and bcc (#18 @travelton) + - batch jobs include recipient-variables for to, cc, and bcc (#18 @travelton) + - added method to return message-ids, for easier access (#19 @travelton) + +## 1.3 (2013-09-12) + +Bugfixes: + + - relaxed Guzzle requirement (#7 @travelton) + - fixed reply-to bug (#9 @travelton) + +## 1.2 (2013-09-05) + +Bugfixes: + + - fixed exception handling constants (@travelton) + - fixed MessageBuilder $baseAddress return (#1 @yoye) + - adjusted scope of recipient-variables (#3 @yoye) + - fixed misspellings of Exceptions (#2 @dboggus) + - undefined DEFAULT_TIME_ZONE (#4 @yoye) + - added message IDs to return for BatchMessage (@travelton) + +## 1.1 (2013-08-21) + +Initial Release! diff --git a/sites/all/libraries/mailgun/README.md b/sites/all/libraries/mailgun/README.md new file mode 100644 index 00000000..52955dc1 --- /dev/null +++ b/sites/all/libraries/mailgun/README.md @@ -0,0 +1,211 @@ +Mailgun-PHP +=========== + +This is the Mailgun PHP SDK. This SDK contains methods for easily interacting +with the Mailgun API. +Below are examples to get you started. For additional examples, please see our +official documentation +at http://documentation.mailgun.com + +[![Latest Stable Version](https://poser.pugx.org/mailgun/mailgun-php/v/stable.png)](https://packagist.org/packages/mailgun/mailgun-php) +[![Build Status](https://travis-ci.org/mailgun/mailgun-php.png)](https://travis-ci.org/mailgun/mailgun-php) + +Installation +------------ +To install the SDK, you will need to be using [Composer](http://getcomposer.org/) +in your project. +If you aren't using Composer yet, it's really simple! Here's how to install +composer and the Mailgun SDK. + +```PHP +# Install Composer +curl -sS https://getcomposer.org/installer | php + +# Add Mailgun as a dependency +php composer.phar require mailgun/mailgun-php:~2.0 +``` + +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).** + +**Rather just download the files? [Library Download](https://9f67cbbd1116d8afb399-7760483f5d1e5f28c2d253278a2a5045.ssl.cf2.rackcdn.com/mailgun-php-1.7.2.zip).** + +Next, require Composer's autoloader, in your application, to automatically +load the Mailgun SDK in your project: +```PHP +require 'vendor/autoload.php'; +use Mailgun\Mailgun; +``` + +Usage +----- +Here's how to send a message using the SDK: + +```php +# First, instantiate the SDK with your API credentials and define your domain. +$mg = new Mailgun("key-example"); +$domain = "example.com"; + +# Now, compose and send your message. +$mg->sendMessage($domain, array('from' => 'bob@example.com', + 'to' => 'sally@example.com', + 'subject' => 'The PHP SDK is awesome!', + 'text' => 'It is so simple to send a message.')); +``` + +Or obtain the last 25 log items: +```php +# First, instantiate the SDK with your API credentials and define your domain. +$mg = new Mailgun("key-example"); +$domain = "example.com"; + +# Now, issue a GET against the Logs endpoint. +$mg->get("$domain/log", array('limit' => 25, + 'skip' => 0)); +``` + +Response +-------- + +The results, provided by the endpoint, are returned as an object, which you +can traverse like an array. + +Example: + +```php +$mg = new Mailgun("key-example"); +$domain = "example.com"; + +$result = $mg->get("$domain/log", array('limit' => 25, + 'skip' => 0)); + +$httpResponseCode = $result->http_response_code; +$httpResponseBody = $result->http_response_body; + +# Iterate through the results and echo the message IDs. +$logItems = $result->http_response_body->items; +foreach($logItems as $logItem){ + echo $logItem->message_id . "\n"; +} +``` + +Example Contents: +**$httpResponseCode** will contain an integer. You can find how we use HTTP response +codes in our documentation: +http://documentation.mailgun.com/api-intro.html?highlight=401#errors + +**$httpResponseBody** will contain an object of the API response. In the above +example, a var_dump($result) would contain the following: + +``` +object(stdClass)#26 (2) { +["http_response_body"]=> + object(stdClass)#26 (2) { + ["total_count"]=> + int(12) + ["items"]=> + array(1) { + [0]=> + object(stdClass)#31 (5) { + ["hap"]=> + string(9) "delivered" + ["created_at"]=> + string(29) "Tue, 20 Aug 2013 20:24:34 GMT" + ["message"]=> + string(66) "Delivered: me@samples.mailgun.org → travis@mailgunhq.com 'Hello'" + ["type"]=> + string(4) "info" + ["message_id"]=> + string(46) "20130820202406.24739.21973@samples.mailgun.org" + } + } + } +} +``` + +Debugging +--------- + +Debugging the PHP SDK can be really helpful when things aren't working quite right. +To debug the SDK, here are some suggestions: + +Set the endpoint to Mailgun's Postbin. A Postbin is a web service that allows you to +post data, which is then displayed through a browser. This allows you to quickly determine +what is actually being transmitted to Mailgun's API. + +**Step 1 - Create a new Postbin.** +Go to http://bin.mailgun.net. The Postbin will generate a special URL. Save that URL. + +**Step 2 - Instantiate the Mailgun client using Postbin.** + +*Tip: The bin id will be the URL part after bin.mailgun.net. It will be random generated letters and numbers. For example, the bin id in this URL, http://bin.mailgun.net/aecf68de, is "aecf68de".* + +```php +# First, instantiate the SDK with your API credentials and define your domain. +$mg = new Mailgun('key-example', null, 'bin.mailgun.net'); +$mg->setApiVersion('aecf68de'); +$mg->setSslEnabled('false'); +$domain = 'example.com'; + +# Now, compose and send your message. +$mg->sendMessage($domain, array('from' => 'bob@example.com', + 'to' => 'sally@example.com', + 'subject' => 'The PHP SDK is awesome!', + 'text' => 'It is so simple to send a message.')); +``` +Additional Info +--------------- + +For usage examples on each API endpoint, head over to our official documentation +pages. + +This SDK includes a [Message Builder](src/Mailgun/Messages/README.md), +[Batch Message](src/Mailgun/Messages/README.md) and [Opt-In Handler](src/Mailgun/Lists/README.md) component. + +Message Builder allows you to quickly create the array of parameters, required +to send a message, by calling a methods for each parameter. +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 +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 +-------------------- + +Be sure to visit the Mailgun official +[documentation website](http://documentation.mailgun.com/) for additional +information about our API. + +If you find a bug, please submit the issue in Github directly. +[Mailgun-PHP Issues](https://github.com/mailgun/Mailgun-PHP/issues) + +As always, if you need additional assistance, drop us a note through your Control Panel at +[https://mailgun.com/cp/support](https://mailgun.com/cp/support). + diff --git a/sites/all/libraries/mailgun/SharedHostInstall.md b/sites/all/libraries/mailgun/SharedHostInstall.md new file mode 100644 index 00000000..bc94c0f1 --- /dev/null +++ b/sites/all/libraries/mailgun/SharedHostInstall.md @@ -0,0 +1,39 @@ +Shared Host Installation +======================== + +If you do not have SSH access to your server, fear not! You can still run +composer and download the SDK. Here's how... + +Installation +------------ + +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).* + +1. curl -sS https://getcomposer.org/installer | php +2. php composer.phar require mailgun/mailgun-php:~1.7.2 +3. The files will be downloaded to your local computer. +4. Upload the files to your webserver. + + +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). +2. Open a Command Prompt and type "php composer require mailgun/mailgun-php:~1.7.2". +3. The files will be downloaded to your local computer. +4. Upload the files to your webserver. + + +Support and Feedback +-------------------- + +Be sure to visit the Mailgun official +[documentation website](http://documentation.mailgun.com/) for additional +information about our API. + +If you find a bug, please submit the issue in Github directly. +[Mailgun-PHP Issues](https://github.com/mailgun/Mailgun-PHP/issues) + +As always, if you need additional assistance, drop us a note at +[support@mailgun.com](mailto:support@mailgun.com). diff --git a/sites/all/libraries/mailgun/composer.json b/sites/all/libraries/mailgun/composer.json new file mode 100644 index 00000000..a7035051 --- /dev/null +++ b/sites/all/libraries/mailgun/composer.json @@ -0,0 +1,28 @@ +{ + "name": "mailgun/mailgun-php", + "description": "The Mailgun SDK provides methods for all API functions.", + "require": { + "php": "^5.5|^7.0", + "guzzlehttp/psr7": "~1.2", + "php-http/httplug": "^1.0", + "php-http/discovery": "^0.8" + }, + "require-dev": { + "phpunit/phpunit": "~4.6", + "php-http/guzzle6-adapter": "^1.0" + }, + "autoload": { + "psr-0": { + "Mailgun\\Tests": "tests/", + "Mailgun": "src/" + } + }, + "license": "MIT", + "authors": [ + { + "name": "Travis Swientek", + "email": "travis@mailgunhq.com" + } + ], + "minimum-stability": "stable" +} diff --git a/sites/all/libraries/mailgun/phpunit.xml.dist b/sites/all/libraries/mailgun/phpunit.xml.dist new file mode 100644 index 00000000..33cea162 --- /dev/null +++ b/sites/all/libraries/mailgun/phpunit.xml.dist @@ -0,0 +1,19 @@ + + + + + + tests/Mailgun/Tests + + + + + diff --git a/sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/GenericHTTPError.php b/sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/GenericHTTPError.php new file mode 100644 index 00000000..b3706494 --- /dev/null +++ b/sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/GenericHTTPError.php @@ -0,0 +1,25 @@ +httpResponseCode = $response_code; + $this->httpResponseBody = $response_body; + } + + public function getHttpResponseCode() { + return $this->httpResponseCode; + } + + public function getHttpResponseBody() { + return $this->httpResponseBody; + } +} + +?> diff --git a/sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/InvalidCredentials.php b/sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/InvalidCredentials.php new file mode 100644 index 00000000..bfcc743b --- /dev/null +++ b/sites/all/libraries/mailgun/src/Mailgun/Connection/Exceptions/InvalidCredentials.php @@ -0,0 +1,4 @@ +apiKey = $apiKey; + $this->apiHost = $apiHost; + $this->httpClient = $httpClient; + } + + /** + * @param string $method + * @param string $uri + * @param array $body + * @param array $files + * @param array $headers + * + * @return \stdClass + * + * @throws GenericHTTPError + * @throws InvalidCredentials + * @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)) { + $body = new MultipartStream($files); + $headers['Content-Type'] = 'multipart/form-data; boundary='.$body->getBoundary(); + } + + $request = new Request($method, $this->getApiUrl($uri), $headers, $body); + $response = $this->getHttpClient()->sendRequest($request); + + return $this->responseHandler($response); + } + + /** + * @param string $endpointUrl + * @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']; + foreach ($fields as $fieldName) { + 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 = []; + foreach ($postData as $key => $value) { + if (is_array($value)) { + foreach ($value as $subValue) { + $postDataMultipart[] = [ + 'name' => $key, + 'contents' => $subValue, + ]; + } + } else { + $postDataMultipart[] = [ + 'name' => $key, + 'contents' => $value, + ]; + } + } + + return $this->send('POST', $endpointUrl, [], array_merge($postDataMultipart, $postFiles)); + } + + /** + * @param string $endpointUrl + * @param array $queryString + * + * @return \stdClass + * + * @throws GenericHTTPError + * @throws InvalidCredentials + * @throws MissingEndpoint + * @throws MissingRequiredParameters + */ + public function get($endpointUrl, $queryString = array()) + { + return $this->send('GET', $endpointUrl.'?'.http_build_query($queryString)); + } + + /** + * @param string $endpointUrl + * + * @return \stdClass + * + * @throws GenericHTTPError + * @throws InvalidCredentials + * @throws MissingEndpoint + * @throws MissingRequiredParameters + */ + public function delete($endpointUrl) + { + return $this->send('DELETE', $endpointUrl); + } + + /** + * @param string $endpointUrl + * @param array $putData + * + * @return \stdClass + * + * @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; + } +} diff --git a/sites/all/libraries/mailgun/src/Mailgun/Constants/Api.php b/sites/all/libraries/mailgun/src/Mailgun/Constants/Api.php new file mode 100644 index 00000000..7a2908ef --- /dev/null +++ b/sites/all/libraries/mailgun/src/Mailgun/Constants/Api.php @@ -0,0 +1,16 @@ + $recipientAddress, 'l' => $mailingList); + $encodedInnerPayload = base64_encode(json_encode($innerPayload)); + + $innerHash = hash_hmac("sha1", $encodedInnerPayload, $secretAppId); + $outerPayload = array('h' => $innerHash, 'p' => $encodedInnerPayload); + + return urlencode(base64_encode(json_encode($outerPayload))); + } + + /** + * @param string $secretAppId + * @param string $uniqueHash + * @return array|bool + */ + public function validateHash($secretAppId, $uniqueHash){ + $decodedOuterPayload = json_decode(base64_decode(urldecode($uniqueHash)), true); + + $decodedHash = $decodedOuterPayload['h']; + $innerPayload = $decodedOuterPayload['p']; + + $decodedInnerPayload = json_decode(base64_decode($innerPayload), true); + $computedInnerHash = hash_hmac("sha1", $innerPayload, $secretAppId); + + if($computedInnerHash == $decodedHash){ + return array('recipientAddress' => $decodedInnerPayload['r'], 'mailingList' => $decodedInnerPayload['l']); + } + + return false; + } +} diff --git a/sites/all/libraries/mailgun/src/Mailgun/Lists/README.md b/sites/all/libraries/mailgun/src/Mailgun/Lists/README.md new file mode 100644 index 00000000..940e4be7 --- /dev/null +++ b/sites/all/libraries/mailgun/src/Mailgun/Lists/README.md @@ -0,0 +1,116 @@ +Mailgun - Lists +==================== + +This is the Mailgun PHP *Lists* utilities. + +The below assumes you've already installed the Mailgun PHP SDK in to your project. +If not, go back to the master README for instructions. + +There is currently one utility provided. + +OptInHandler: Provides methods for authenticating an OptInRequest. + +The typical flow for using this utility would be as follows: +**Recipient Requests Subscribe** -> [Validate Recipient Address] -> [Generate Opt In Link] -> [Email Recipient Opt In Link] +**Recipient Clicks Opt In Link** -> [Validate Opt In Link] -> [Subscribe User] -> [Send final confirmation] + +The above flow is modeled below. + +Usage - Opt-In Handler (Recipient Requests Subscribe) +----------------------------------------------------- +Here's how to use Opt-In Handler to validate Opt-In requests. + +```php +# First, instantiate the SDK with your API credentials, domain, and required parameters for example. +$mg = new Mailgun('key-example'); +$mgValidate = new Mailgun('pub-key-example'); + +$domain = 'example.com'; +$mailingList = 'youlist@example.com'; +$secretPassphrase = 'a_secret_passphrase'; +$recipientAddress = 'recipient@example.com'; + +# Let's validate the customer's email address, using Mailgun's validation endpoint. +$result = $mgValidate->get('address/validate', array('address' => $recipientAddress)); + +if($result->http_response_body->is_valid == true){ + # Next, instantiate an OptInHandler object from the SDK. + $optInHandler = $mg->OptInHandler(); + + # Next, generate a hash. + $generatedHash = $optInHandler->generateHash($mailingList, $secretPassphrase, $recipientAddress); + + # Now, let's send a confirmation to the recipient with our link. + $mg->sendMessage($domain, array('from' => 'bob@example.com', + 'to' => $recipientAddress, + 'subject' => 'Please Confirm!', + 'html' => "Hello,

You have requested to be subscribed + to the mailing list $mailingList. Please + confirm your subscription.

Thank you!")); + + # Finally, let's add the subscriber to a Mailing List, as unsubscribed, so we can track non-conversions. + $mg->post("lists/$mailingList/members", array('address' => $recipientAddress, + 'subscribed' => 'no', + 'upsert' => 'yes')); +} +``` + +Usage - Opt-In Handler (Recipient Clicks Opt In Link) +----------------------------------------------------- +Here's how to use Opt-In Handler to validate an Opt-In Hash. + +```php +# First, instantiate the SDK with your API credentials and domain. +$mg = new Mailgun('key-example'); +$domain = 'example.com'; + +# Next, instantiate an OptInHandler object from the SDK. +$optInHandler = $mg->OptInHandler(); + +# Next, grab the hash. +$inboundHash = $_GET['hash']; +$secretPassphrase = 'a_secret_passphrase'; + +# Now, validate the captured hash. +$hashValidation = $optInHandler->validateHash($secretPassphrase, $inboundHash); + +# Lastly, check to see if we have results, parse, subscribe, and send confirmation. +if($hashValidation){ + $validatedList = $hashValidation['mailingList']; + $validatedRecipient = $hashValidation['recipientAddress']; + + $mg->put("lists/$validatedList/members/$validatedRecipient", + array('address' => $validatedRecipient, + 'subscribed' => 'yes')); + + $mg->sendMessage($domain, array('from' => 'bob@example.com', + 'to' => $validatedRecipient, + 'subject' => 'Confirmation Received!', + 'html' => "Hello,

We've successfully subscribed + you to the list, $validatedList!

Thank you! + ")); +} +``` + +A few notes: +1. 'a_secret_passphrase' can be anything. It's used as the *key* in hashing, +since your email address will vary. +2. validateHash() will return an array containing the recipient address and list +address. +3. You should *always* send an email confirmation before and after the +subscription request. +4. WARNING: On $_GET['hash'], you need to sanitize this value to prevent +malicious attempts to inject code. + +Available Functions +----------------------------------------------------- + +`string generateHash(string $mailingList, string $secretAppId, string $recipientAddress)` + +`array validateHash(string $secretAppId, string $uniqueHash)` + +More Documentation +------------------ +See the official [Mailgun Docs](http://documentation.mailgun.com/api-sending.html) +for more information. diff --git a/sites/all/libraries/mailgun/src/Mailgun/Mailgun.php b/sites/all/libraries/mailgun/src/Mailgun/Mailgun.php new file mode 100644 index 00000000..67778016 --- /dev/null +++ b/sites/all/libraries/mailgun/src/Mailgun/Mailgun.php @@ -0,0 +1,185 @@ +apiKey = $apiKey; + $this->restClient = new RestClient($apiKey, $apiEndpoint, $httpClient); + } + + /** + * 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()){ + if(is_array($postFiles)){ + return $this->post("$workingDomain/messages", $postData, $postFiles); + } + else if(is_string($postFiles)){ + + $tempFile = tempnam(sys_get_temp_dir(), "MG_TMP_MIME"); + $fileHandle = fopen($tempFile, "w"); + fwrite($fileHandle, $postFiles); + + $result = $this->post("$workingDomain/messages.mime", $postData, array("message" => $tempFile)); + fclose($fileHandle); + unlink($tempFile); + return $result; + } + 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. + * + * @param array|null $postData + * @return bool + */ + public function verifyWebhookSignature($postData = NULL) { + if(is_null($postData)) { + $postData = $_POST; + } + $hmac = hash_hmac('sha256', "{$postData["timestamp"]}{$postData["token"]}", $this->apiKey); + $sig = $postData['signature']; + if(function_exists('hash_equals')) { + // hash_equals is constant time, but will not be introduced until PHP 5.6 + return hash_equals($hmac, $sig); + } + else { + return ($hmac == $sig); + } + } + + /** + * @param string $endpointUrl + * @param array $postData + * @param array $files + * @return \stdClass + */ + public function post($endpointUrl, $postData = array(), $files = array()){ + return $this->restClient->post($endpointUrl, $postData, $files); + } + + /** + * @param string $endpointUrl + * @param array $queryString + * @return \stdClass + */ + public function get($endpointUrl, $queryString = array()){ + return $this->restClient->get($endpointUrl, $queryString); + } + + /** + * @param string $endpointUrl + * @return \stdClass + */ + public function delete($endpointUrl){ + return $this->restClient->delete($endpointUrl); + } + + /** + * @param string $endpointUrl + * @param array $putData + * @return \stdClass + */ + public function 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(){ + return new MessageBuilder(); + } + + /** + * @return OptInHandler + */ + public function OptInHandler(){ + return new OptInHandler(); + } + + /** + * @param string $workingDomain + * @param bool $autoSend + * @return BatchMessage + */ + public function BatchMessage($workingDomain, $autoSend = true){ + return new BatchMessage($this->restClient, $workingDomain, $autoSend); + } +} diff --git a/sites/all/libraries/mailgun/src/Mailgun/Messages/BatchMessage.php b/sites/all/libraries/mailgun/src/Mailgun/Messages/BatchMessage.php new file mode 100644 index 00000000..003178e0 --- /dev/null +++ b/sites/all/libraries/mailgun/src/Mailgun/Messages/BatchMessage.php @@ -0,0 +1,141 @@ +batchRecipientAttributes = array(); + $this->autoSend = $autoSend; + $this->restClient = $restClient; + $this->workingDomain = $workingDomain; + $this->endpointUrl = $workingDomain . "/messages"; + } + + /** + * @param string $headerName + * @param string $address + * @param array $variables + * @throws MissingRequiredMIMEParameters + * @throws TooManyParameters + */ + protected function addRecipient($headerName, $address, $variables){ + if(array_key_exists($headerName, $this->counters['recipients'])){ + if($this->counters['recipients'][$headerName] == Api::RECIPIENT_COUNT_LIMIT){ + if($this->autoSend == false){ + throw new TooManyParameters(ExceptionMessages::TOO_MANY_RECIPIENTS); + } + $this->sendMessage(); + } + } + + $compiledAddress = $this->parseAddress($address, $variables); + + if(isset($this->message[$headerName])){ + array_push($this->message[$headerName], $compiledAddress); + } + elseif($headerName == "h:reply-to"){ + $this->message[$headerName] = $compiledAddress; + } + else{ + $this->message[$headerName] = array($compiledAddress); + } + + if(array_key_exists($headerName, $this->counters['recipients'])){ + $this->counters['recipients'][$headerName] += 1; + if(!array_key_exists("id", $variables)){ + $variables['id'] = $this->counters['recipients'][$headerName]; + } + } + $this->batchRecipientAttributes["$address"] = $variables; + } + + /** + * @param array $message + * @param array $files + * @throws MissingRequiredMIMEParameters + */ + public function sendMessage($message = array(), $files = array()){ + if(count($message) < 1){ + $message = $this->message; + $files = $this->files; + } + if(!array_key_exists("from", $message)){ + throw new MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); + } + elseif(!array_key_exists("to", $message)){ + throw new MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); + } + elseif(!array_key_exists("subject", $message)){ + throw new MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); + } + elseif((!array_key_exists("text", $message) && !array_key_exists("html", $message))){ + throw new MissingRequiredMIMEParameters(ExceptionMessages::EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); + } + else{ + $message["recipient-variables"] = json_encode($this->batchRecipientAttributes); + $response = $this->restClient->post($this->endpointUrl, $message, $files); + $this->batchRecipientAttributes = array(); + $this->counters['recipients']['to'] = 0; + $this->counters['recipients']['cc'] = 0; + $this->counters['recipients']['bcc'] = 0; + unset($this->message["to"]); + array_push($this->messageIds, $response->http_response_body->id); + } + } + + /** + * @throws MissingRequiredMIMEParameters + */ + public function finalize(){ + $this->sendMessage(); + } + + /** + * @return string[] + */ + public function getMessageIds(){ + return $this->messageIds; + } +} diff --git a/sites/all/libraries/mailgun/src/Mailgun/Messages/Exceptions/InvalidParameter.php b/sites/all/libraries/mailgun/src/Mailgun/Messages/Exceptions/InvalidParameter.php new file mode 100644 index 00000000..9ea1dfc2 --- /dev/null +++ b/sites/all/libraries/mailgun/src/Mailgun/Messages/Exceptions/InvalidParameter.php @@ -0,0 +1,4 @@ + array( + 'to' => 0, + 'cc' => 0, + 'bcc' => 0 + ), + 'attributes' => array( + 'attachment' => 0, + 'campaign_id' => 0, + 'custom_option' => 0, + 'tag' => 0 + ) + ); + + /** + * @param array $params + * @param string $key + * @param mixed $default + * @return mixed + */ + protected function safeGet($params, $key, $default) + { + if (array_key_exists($key, $params)) { + return $params[$key]; + } + + return $default; + } + + /** + * @param array $params + * @return mixed|string + */ + protected function getFullName($params) + { + if (array_key_exists("first", $params)) { + $first = $this->safeGet($params, "first", ""); + $last = $this->safeGet($params, "last", ""); + + return trim("$first $last"); + } + + return $this->safeGet($params, "full_name", ""); + } + + /** + * @param string $address + * @param array $variables + * @return string + */ + protected function parseAddress($address, $variables) + { + if (!is_array($variables)) { + return $address; + } + $fullName = $this->getFullName($variables); + if ($fullName != null) { + return "'$fullName' <$address>"; + } + + return $address; + } + + /** + * @param string $headerName + * @param string $address + * @param array $variables + */ + protected function addRecipient($headerName, $address, $variables) + { + $compiledAddress = $this->parseAddress($address, $variables); + + if (isset($this->message[$headerName])) { + array_push($this->message[$headerName], $compiledAddress); + } elseif ($headerName == "h:reply-to") { + $this->message[$headerName] = $compiledAddress; + } else { + $this->message[$headerName] = array($compiledAddress); + } + if (array_key_exists($headerName, $this->counters['recipients'])) { + $this->counters['recipients'][$headerName] += 1; + } + } + + /** + * @param string $address + * @param array|null $variables + * @return mixed + * @throws TooManyParameters + */ + public function addToRecipient($address, $variables = null) + { + if ($this->counters['recipients']['to'] > Api::RECIPIENT_COUNT_LIMIT) { + throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_RECIPIENT); + } + $this->addRecipient("to", $address, $variables); + + return end($this->message['to']); + } + + /** + * @param string $address + * @param array|null $variables + * @return mixed + * @throws TooManyParameters + */ + public function addCcRecipient($address, $variables = null) + { + if ($this->counters['recipients']['cc'] > Api::RECIPIENT_COUNT_LIMIT) { + throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_RECIPIENT); + } + $this->addRecipient("cc", $address, $variables); + + return end($this->message['cc']); + } + + /** + * @param string $address + * @param array|null $variables + * @return mixed + * @throws TooManyParameters + */ + public function addBccRecipient($address, $variables = null) + { + if ($this->counters['recipients']['bcc'] > Api::RECIPIENT_COUNT_LIMIT) { + throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_RECIPIENT); + } + $this->addRecipient("bcc", $address, $variables); + + return end($this->message['bcc']); + } + + /** + * @param string $address + * @param array|null $variables + * @return mixed + */ + public function setFromAddress($address, $variables = null) + { + $this->addRecipient("from", $address, $variables); + + return $this->message['from']; + } + + /** + * @param string $address + * @param array|null $variables + * @return mixed + */ + public function setReplyToAddress($address, $variables = null) + { + $this->addRecipient("h:reply-to", $address, $variables); + + return $this->message['h:reply-to']; + } + + /** + * @param string $subject + * @return mixed + */ + public function setSubject($subject = "") + { + if ($subject == null || $subject == "") { + $subject = " "; + } + $this->message['subject'] = $subject; + + return $this->message['subject']; + } + + /** + * @param string $headerName + * @param mixed $headerData + * @return mixed + */ + public function addCustomHeader($headerName, $headerData) + { + if (!preg_match("/^h:/i", $headerName)) { + $headerName = "h:" . $headerName; + } + $this->message[$headerName] = array($headerData); + + return $this->message[$headerName]; + } + + /** + * @param string $textBody + * @return string + */ + public function setTextBody($textBody) + { + if ($textBody == null || $textBody == "") { + $textBody = " "; + } + $this->message['text'] = $textBody; + + return $this->message['text']; + } + + /** + * @param string $htmlBody + * @return string + */ + public function setHtmlBody($htmlBody) + { + if ($htmlBody == null || $htmlBody == "") { + $htmlBody = " "; + } + $this->message['html'] = $htmlBody; + + return $this->message['html']; + } + + /** + * @param string $attachmentPath + * @param string|null $attachmentName + * @return bool + */ + public function addAttachment($attachmentPath, $attachmentName = null) + { + if (isset($this->files["attachment"])) { + $attachment = array( + 'filePath' => $attachmentPath, + 'remoteName' => $attachmentName + ); + array_push($this->files["attachment"], $attachment); + } else { + $this->files["attachment"] = array( + array( + 'filePath' => $attachmentPath, + 'remoteName' => $attachmentName + ) + ); + } + + return true; + } + + /** + * @param string $inlineImagePath + * @param string|null $inlineImageName + * @throws InvalidParameter + */ + public function addInlineImage($inlineImagePath, $inlineImageName = null) + { + if (preg_match("/^@/", $inlineImagePath)) { + if (isset($this->files['inline'])) { + $inlineAttachment = array( + 'filePath' => $inlineImagePath, + 'remoteName' => $inlineImageName + ); + array_push($this->files['inline'], $inlineAttachment); + } else { + $this->files['inline'] = array( + array( + 'filePath' => $inlineImagePath, + 'remoteName' => $inlineImageName + ) + ); + } + + return true; + } else { + throw new InvalidParameter(ExceptionMessages::INVALID_PARAMETER_INLINE); + } + } + + /** + * @param boolean $testMode + * @return string + */ + public function setTestMode($testMode) + { + if (filter_var($testMode, FILTER_VALIDATE_BOOLEAN)) { + $testMode = "yes"; + } else { + $testMode = "no"; + } + $this->message['o:testmode'] = $testMode; + + return $this->message['o:testmode']; + } + + /** + * @param string|int $campaignId + * @return string|int + * @throws TooManyParameters + */ + public function addCampaignId($campaignId) + { + if ($this->counters['attributes']['campaign_id'] < Api::CAMPAIGN_ID_LIMIT) { + if (isset($this->message['o:campaign'])) { + array_push($this->message['o:campaign'], $campaignId); + } else { + $this->message['o:campaign'] = array($campaignId); + } + $this->counters['attributes']['campaign_id'] += 1; + + return $this->message['o:campaign']; + } else { + throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_CAMPAIGNS); + } + } + + /** + * @param string $tag + * @throws TooManyParameters + */ + public function addTag($tag) + { + if ($this->counters['attributes']['tag'] < Api::TAG_LIMIT) { + if (isset($this->message['o:tag'])) { + array_push($this->message['o:tag'], $tag); + } else { + $this->message['o:tag'] = array($tag); + } + $this->counters['attributes']['tag'] += 1; + + return $this->message['o:tag']; + } else { + throw new TooManyParameters(ExceptionMessages::TOO_MANY_PARAMETERS_TAGS); + } + } + + /** + * @param boolean $enabled + * @return mixed + */ + public function setDkim($enabled) + { + if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) { + $enabled = "yes"; + } else { + $enabled = "no"; + } + $this->message["o:dkim"] = $enabled; + + return $this->message["o:dkim"]; + } + + /** + * @param boolean $enabled + * @return string + */ + public function setOpenTracking($enabled) + { + if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) { + $enabled = "yes"; + } else { + $enabled = "no"; + } + $this->message['o:tracking-opens'] = $enabled; + + return $this->message['o:tracking-opens']; + } + + /** + * @param boolean $enabled + * @return string + */ + public function setClickTracking($enabled) + { + if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) { + $enabled = "yes"; + } elseif ($enabled == "html") { + $enabled = "html"; + } else { + $enabled = "no"; + } + $this->message['o:tracking-clicks'] = $enabled; + + return $this->message['o:tracking-clicks']; + } + + /** + * @param string $timeDate + * @param string|null $timeZone + * @return string + */ + public function setDeliveryTime($timeDate, $timeZone = null) + { + if (isset($timeZone)) { + $timeZoneObj = new \DateTimeZone("$timeZone"); + } else { + $timeZoneObj = new \DateTimeZone(Api::DEFAULT_TIME_ZONE); + } + + $dateTimeObj = new \DateTime($timeDate, $timeZoneObj); + $formattedTimeDate = $dateTimeObj->format(\DateTime::RFC2822); + $this->message['o:deliverytime'] = $formattedTimeDate; + + return $this->message['o:deliverytime']; + } + + /** + * @param string $customName + * @param mixed $data + */ + public function addCustomData($customName, $data) + { + $this->message['v:' . $customName] = json_encode($data); + } + + /** + * @param string $parameterName + * @param mixed $data + * @return mixed + */ + public function addCustomParameter($parameterName, $data) + { + if (isset($this->message[$parameterName])) { + array_push($this->message[$parameterName], $data); + + return $this->message[$parameterName]; + } else { + $this->message[$parameterName] = array($data); + + return $this->message[$parameterName]; + } + } + + /** + * @param array $message + */ + public function setMessage($message) + { + $this->message = $message; + } + + /** + * @return array + */ + public function getMessage() + { + return $this->message; + } + + /** + * @return array + */ + public function getFiles() + { + return $this->files; + } +} diff --git a/sites/all/libraries/mailgun/src/Mailgun/Messages/README.md b/sites/all/libraries/mailgun/src/Mailgun/Messages/README.md new file mode 100644 index 00000000..88a48cba --- /dev/null +++ b/sites/all/libraries/mailgun/src/Mailgun/Messages/README.md @@ -0,0 +1,138 @@ +Mailgun - Messages +==================== + +This is the Mailgun PHP *Message* utilities. + +The below assumes you've already installed the Mailgun PHP SDK in to your +project. If not, go back to the master README for instructions. + +There are two utilities included, Message Builder and Batch Message. + +Message Builder: Allows you to build a message object by calling methods for +each MIME attribute. +Batch Message: Inherits Message Builder and allows you to iterate through +recipients from a list. Messages will fire after the 1,000th recipient has been +added. + +Usage - Message Builder +----------------------- +Here's how to use Message Builder to build your Message. + +```php +# First, instantiate the SDK with your API credentials and define your domain. +$mg = new Mailgun("key-example"); +$domain = "example.com"; + +# Next, instantiate a Message Builder object from the SDK. +$messageBldr = $mg->MessageBuilder(); + +# Define the from address. +$messageBldr->setFromAddress("me@example.com", array("first"=>"PHP", "last" => "SDK")); +# Define a to recipient. +$messageBldr->addToRecipient("john.doe@example.com", array("first" => "John", "last" => "Doe")); +# Define a cc recipient. +$messageBldr->addCcRecipient("sally.doe@example.com", array("first" => "Sally", "last" => "Doe")); +# Define the subject. +$messageBldr->setSubject("A message from the PHP SDK using Message Builder!"); +# Define the body of the message. +$messageBldr->setTextBody("This is the text body of the message!"); + +# Other Optional Parameters. +$messageBldr->addCampaignId("My-Awesome-Campaign"); +$messageBldr->addCustomHeader("Customer-Id", "12345"); +$messageBldr->addAttachment("@/tron.jpg"); +$messageBldr->setDeliveryTime("tomorrow 8:00AM", "PST"); +$messageBldr->setClickTracking(true); + +# Finally, send the message. +$mg->post("{$domain}/messages", $messageBldr->getMessage(), $messageBldr->getFiles()); +``` + +Available Functions +----------------------------------------------------- + +`string addToRecipient(string $address, array $attributes)` + +`string addCcRecipient(string $address, array $attributes)` + +`string addBccRecipient(string $address, array $attributes)` + +`string setFromAddress(string $address, array $attributes)` + +`string setSubject(string $subject)` + +`string setTextBody(string $textBody)` + +`string setHtmlBody(string $htmlBody)` + +`bool addAttachment(string $attachmentPath)` + +`bool addInlineImage(string $inlineImagePath)` + +`string setTestMode(bool $testMode)` + +`string addCampaignId(string $campaignId)` + +`string setDkim(bool $enabled)` + +`string setOpenTracking($enabled)` + +`string setClickTracking($enabled)` + +`string setDeliveryTime(string $timeDate, string $timeZone)` + +`string addCustomData(string $optionName, string $data)` + +`string addCustomParameter(string $parameterName, string $data)` + +`array getMessage()` + +`array getFiles()` + + +Usage - Batch Message +--------------------- +Here's how to use Batch Message to easily handle batch sending jobs. + +```php +# First, instantiate the SDK with your API credentials and define your domain. +$mg = new Mailgun("key-example"); +$domain = "example.com"; + +# Next, instantiate a Message Builder object from the SDK, pass in your sending +domain. +$batchMsg = $mg->BatchMessage($domain); + +# Define the from address. +$batchMsg->setFromAddress("me@example.com", array("first"=>"PHP", "last" => "SDK")); +# Define the subject. +$batchMsg->setSubject("A Batch Message from the PHP SDK!"); +# Define the body of the message. +$batchMsg->setTextBody("This is the text body of the message!"); + +# Next, let's add a few recipients to the batch job. +$batchMsg->addToRecipient("john.doe@example.com", array("first" => "John", "last" => "Doe")); +$batchMsg->addToRecipient("sally.doe@example.com", array("first" => "Sally", "last" => "Doe")); +$batchMsg->addToRecipient("mike.jones@example.com", array("first" => "Mike", "last" => "Jones")); +... +// After 1,000 recipeints, Batch Message will automatically post your message to +the messages endpoint. + +// Call finalize() to send any remaining recipients still in the buffer. +$batchMsg->finalize(); + +``` + +Available Functions (Inherits all Batch Message and Messages Functions) +----------------------------------------------------------------------- + +`addToRecipient(string $address, string $attributes)` + +`sendMessage(array $message, array $files)` + +`array finalize()` + +More Documentation +------------------ +See the official [Mailgun Docs](http://documentation.mailgun.com/api-sending.html) +for more information. diff --git a/sites/all/libraries/mailgun/tests/Bootstrap.php b/sites/all/libraries/mailgun/tests/Bootstrap.php new file mode 100644 index 00000000..da835f11 --- /dev/null +++ b/sites/all/libraries/mailgun/tests/Bootstrap.php @@ -0,0 +1,5 @@ +client = new Mailgun("My-Super-Awesome-API-Key"); + $this->optInHandler = $this->client->OptInHandler(); + } + + public function testReturnOfGenerateHash() + { + $generatedHash = $this->optInHandler->generateHash( + 'mytestlist@example.com', + 'mysupersecretappid', + 'testrecipient@example.com' + ); + $knownHash = "eyJoIjoiMTllODc2YWNkMWRmNzk4NTc0ZTU0YzhjMzIzOTNiYTNjNzdhNGMxOCIsInAiOiJleUp5SWpvaWRHVnpkSEpsWTJsd2FXVnVkRUJsZUdGdGNHeGxMbU52YlNJc0ltd2lPaUp0ZVhSbGMzUnNhWE4wUUdWNFlXMXdiR1V1WTI5dEluMD0ifQ%3D%3D"; + $this->assertEquals($generatedHash, $knownHash); + } + + public function testGoodHash() + { + $validation = $this->optInHandler->validateHash( + 'mysupersecretappid', + 'eyJoIjoiMTllODc2YWNkMWRmNzk4NTc0ZTU0YzhjMzIzOTNiYTNjNzdhNGMxOCIsInAiOiJleUp5SWpvaWRHVnpkSEpsWTJsd2FXVnVkRUJsZUdGdGNHeGxMbU52YlNJc0ltd2lPaUp0ZVhSbGMzUnNhWE4wUUdWNFlXMXdiR1V1WTI5dEluMD0ifQ%3D%3D' + ); + $this->assertArrayHasKey('recipientAddress', $validation); + $this->assertArrayHasKey('mailingList', $validation); + } + + public function testBadHash() + { + $validation = $this->optInHandler->validateHash( + 'mybadsecretappid', + 'eyJoIjoiMTllODc2YWNkMWRmNzk4NTc0ZTU0YzhjMzIzOTNiYTNjNzdhNGMxOCIsInAiOiJleUp5SWpvaWRHVnpkSEpsWTJsd2FXVnVkRUJsZUdGdGNHeGxMbU52YlNJc0ltd2lPaUp0ZVhSbGMzUnNhWE4wUUdWNFlXMXdiR1V1WTI5dEluMD0ifQ%3D%3D' + ); + $this->assertFalse($validation); + } +} diff --git a/sites/all/libraries/mailgun/tests/Mailgun/Tests/MailgunTest.php b/sites/all/libraries/mailgun/tests/Mailgun/Tests/MailgunTest.php new file mode 100644 index 00000000..c73c1aab --- /dev/null +++ b/sites/all/libraries/mailgun/tests/Mailgun/Tests/MailgunTest.php @@ -0,0 +1,36 @@ +setExpectedException("\\Mailgun\\Messages\\Exceptions\\MissingRequiredMIMEParameters"); + + $client = new Mailgun(); + $client->sendMessage("test.mailgun.com", "etss", 1); + } + + public function testVerifyWebhookGood() { + $client = new Mailgun('key-3ax6xnjp29jd6fds4gc373sgvjxteol0'); + $postData = array( + 'timestamp' => '1403645220', + 'token' => '5egbgr1vjgqxtrnp65xfznchgdccwh5d6i09vijqi3whgowmn6', + 'signature' => '9cfc5c41582e51246e73c88d34db3af0a3a2692a76fbab81492842f000256d33', + ); + assert($client->verifyWebhookSignature($postData)); + } + + public function testVerifyWebhookBad() { + $client = new Mailgun('key-3ax6xnjp29jd6fds4gc373sgvjxteol0'); + $postData = array( + 'timestamp' => '1403645220', + 'token' => 'owyldpe6nxhmrn78epljl6bj0orrki1u3d2v5e6cnlmmuox8jr', + 'signature' => '9cfc5c41582e51246e73c88d34db3af0a3a2692a76fbab81492842f000256d33', + ); + assert(!$client->verifyWebhookSignature($postData)); + } +} diff --git a/sites/all/libraries/mailgun/tests/Mailgun/Tests/MailgunTestCase.php b/sites/all/libraries/mailgun/tests/Mailgun/Tests/MailgunTestCase.php new file mode 100644 index 00000000..3d8f2e65 --- /dev/null +++ b/sites/all/libraries/mailgun/tests/Mailgun/Tests/MailgunTestCase.php @@ -0,0 +1,7 @@ +client = new Mailgun("My-Super-Awesome-API-Key"); + } + + public function testBlankInstantiation() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $this->assertTrue(is_array($message->getMessage())); + } + + public function testAddRecipient() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $message->addToRecipient("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("to" => array("'Test User' ")), $messageObj); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('counters'); + $property->setAccessible(true); + $array = $property->getValue($message); + $this->assertEquals(1, $array['recipients']['to']); + } + + public function testRecipientVariablesOnTo() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $message->addToRecipient("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("to" => array("'Test User' ")), $messageObj); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('batchRecipientAttributes'); + $property->setAccessible(true); + $propertyValue = $property->getValue($message); + $this->assertEquals("Test", $propertyValue['test@samples.mailgun.org']['first']); + $this->assertEquals("User", $propertyValue['test@samples.mailgun.org']['last']); + } + + public function testRecipientVariablesOnCc() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $message->addCcRecipient("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("cc" => array("'Test User' ")), $messageObj); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('batchRecipientAttributes'); + $property->setAccessible(true); + $propertyValue = $property->getValue($message); + $this->assertEquals("Test", $propertyValue['test@samples.mailgun.org']['first']); + $this->assertEquals("User", $propertyValue['test@samples.mailgun.org']['last']); + } + + public function testRecipientVariablesOnBcc() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $message->addBccRecipient("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("bcc" => array("'Test User' ")), $messageObj); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('batchRecipientAttributes'); + $property->setAccessible(true); + $propertyValue = $property->getValue($message); + $this->assertEquals("Test", $propertyValue['test@samples.mailgun.org']['first']); + $this->assertEquals("User", $propertyValue['test@samples.mailgun.org']['last']); + } + + public function testAddMultipleBatchRecipients() + { + $message = $this->client->BatchMessage($this->sampleDomain); + for ($i = 0; $i < 100; $i++) { + $message->addToRecipient("$i@samples.mailgun.org", array("first" => "Test", "last" => "User $i")); + } + $messageObj = $message->getMessage(); + $this->assertEquals(100, count($messageObj["to"])); + } + + public function testMaximumBatchSize() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $message->setFromAddress("samples@mailgun.org", array("first" => "Test", "last" => "User")); + $message->setSubject("This is the subject of the message!"); + $message->setTextBody("This is the text body of the message!"); + for ($i = 0; $i < 1001; $i++) { + $message->addToRecipient("$i@samples.mailgun.org", array("first" => "Test", "last" => "User $i")); + } + $messageObj = $message->getMessage(); + $this->assertEquals(1, count($messageObj["to"])); + } + + public function testAttributeResetOnEndBatchMessage() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $message->addToRecipient("test-user@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $message->setFromAddress("samples@mailgun.org", array("first" => "Test", "last" => "User")); + $message->setSubject("This is the subject of the message!"); + $message->setTextBody("This is the text body of the message!"); + $message->finalize(); + $messageObj = $message->getMessage(); + $this->assertTrue(true, empty($messageObj)); + } + + public function testDefaultIDInVariables() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $message->addToRecipient("test-user@samples.mailgun.org", array("first" => "Test", "last" => "User")); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('batchRecipientAttributes'); + $property->setAccessible(true); + $propertyValue = $property->getValue($message); + $this->assertEquals(1, $propertyValue['test-user@samples.mailgun.org']['id']); + } + + public function testgetMessageIds() + { + $message = $this->client->BatchMessage($this->sampleDomain); + $message->addToRecipient("test-user@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $message->setFromAddress("samples@mailgun.org", array("first" => "Test", "last" => "User")); + $message->setSubject("This is the subject of the message!"); + $message->setTextBody("This is the text body of the message!"); + $message->finalize(); + + $this->assertEquals(array("1234"), $message->getMessageIds()); + } + + public function testInvalidMissingRequiredMIMEParametersExceptionGetsFlungNoFrom() + { + $this->setExpectedException("\\Mailgun\\Messages\\Exceptions\\MissingRequiredMIMEParameters"); + + $message = $this->client->BatchMessage($this->sampleDomain); + $message->sendMessage(array(1, 2, 3)); + } + + public function testInvalidMissingRequiredMIMEParametersExceptionGetsFlungNoTo() + { + $this->setExpectedException("\\Mailgun\\Messages\\Exceptions\\MissingRequiredMIMEParameters"); + + $message = $this->client->BatchMessage($this->sampleDomain); + $message->sendMessage(array("from" => 1, 2, 3)); + } + + public function testInvalidMissingRequiredMIMEParametersExceptionGetsFlungNoSubject() + { + $this->setExpectedException("\\Mailgun\\Messages\\Exceptions\\MissingRequiredMIMEParameters"); + + $message = $this->client->BatchMessage($this->sampleDomain); + $message->sendMessage(array("from" => 1, "to" => 2, 3)); + } + + public function testInvalidMissingRequiredMIMEParametersExceptionGetsFlungNoTextOrHtml() + { + $this->setExpectedException("\\Mailgun\\Messages\\Exceptions\\MissingRequiredMIMEParameters"); + + $message = $this->client->BatchMessage($this->sampleDomain); + $message->sendMessage(array("from" => 1, "to" => 2, "subject" => 3)); + } +} diff --git a/sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/MessageBuilderTest.php b/sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/MessageBuilderTest.php new file mode 100644 index 00000000..8daf2e33 --- /dev/null +++ b/sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/MessageBuilderTest.php @@ -0,0 +1,356 @@ +client = new Mailgun(); + } + + public function testBlankInstantiation() + { + $message = $this->client->MessageBuilder(); + $this->assertTrue(is_array($message->getMessage())); + } + + public function testCountersSetToZero() + { + $message = $this->client->MessageBuilder(); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('counters'); + $property->setAccessible(true); + $propertyValue = $property->getValue($message); + $this->assertEquals(0, $propertyValue['recipients']['to']); + $this->assertEquals(0, $propertyValue['recipients']['cc']); + $this->assertEquals(0, $propertyValue['recipients']['bcc']); + $this->assertEquals(0, $propertyValue['attributes']['attachment']); + $this->assertEquals(0, $propertyValue['attributes']['campaign_id']); + $this->assertEquals(0, $propertyValue['attributes']['custom_option']); + $this->assertEquals(0, $propertyValue['attributes']['tag']); + } + + public function testAddToRecipient() + { + $message = $this->client->MessageBuilder(); + $message->addToRecipient("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("to" => array("'Test User' ")), $messageObj); + } + + public function testAddCcRecipient() + { + $message = $this->client->MessageBuilder(); + $message->addCcRecipient("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("cc" => array("'Test User' ")), $messageObj); + } + + public function testAddBccRecipient() + { + $message = $this->client->MessageBuilder(); + $message->addBccRecipient("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("bcc" => array("'Test User' ")), $messageObj); + } + + public function testToRecipientCount() + { + $message = $this->client->MessageBuilder(); + $message->addToRecipient("test-user@samples.mailgun.org", array("first" => "Test", "last" => "User")); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('counters'); + $property->setAccessible(true); + $array = $property->getValue($message); + $this->assertEquals(1, $array['recipients']['to']); + } + + public function testCcRecipientCount() + { + $message = $this->client->MessageBuilder(); + $message->addCcRecipient("test-user@samples.mailgun.org", array("first" => "Test", "last" => "User")); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('counters'); + $property->setAccessible(true); + $array = $property->getValue($message); + $this->assertEquals(1, $array['recipients']['cc']); + } + + public function testBccRecipientCount() + { + $message = $this->client->MessageBuilder(); + $message->addBccRecipient("test-user@samples.mailgun.org", array("first" => "Test", "last" => "User")); + + $reflectionClass = new \ReflectionClass(get_class($message)); + $property = $reflectionClass->getProperty('counters'); + $property->setAccessible(true); + $array = $property->getValue($message); + $this->assertEquals(1, $array['recipients']['bcc']); + } + + public function testSetFromAddress() + { + $message = $this->client->MessageBuilder(); + $message->setFromAddress("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("from" => array("'Test User' ")), $messageObj); + } + + public function testSetReplyTo() + { + $message = $this->client->MessageBuilder(); + $message->setReplyToAddress("test@samples.mailgun.org", array("first" => "Test", "last" => "User")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("h:reply-to" => "'Test User' "), $messageObj); + } + + public function testSetSubject() + { + $message = $this->client->MessageBuilder(); + $message->setSubject("Test Subject"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("subject" => "Test Subject"), $messageObj); + } + + public function testAddCustomHeader() + { + $message = $this->client->MessageBuilder(); + $message->addCustomHeader("My-Header", "123"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("h:My-Header" => array("123")), $messageObj); + } + + public function testSetTextBody() + { + $message = $this->client->MessageBuilder(); + $message->setTextBody("This is the text body!"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("text" => "This is the text body!"), $messageObj); + } + + public function testSetHtmlBody() + { + $message = $this->client->MessageBuilder(); + $message->setHtmlBody("This is an awesome email"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("html" => "This is an awesome email"), $messageObj); + } + + public function testAddAttachments() + { + $message = $this->client->MessageBuilder(); + $message->addAttachment("@../TestAssets/mailgun_icon.png"); + $message->addAttachment("@../TestAssets/rackspace_logo.png"); + $messageObj = $message->getFiles(); + $this->assertEquals( + array( + array( + 'filePath' => "@../TestAssets/mailgun_icon.png", + 'remoteName' => null + ), + array( + 'filePath' => "@../TestAssets/rackspace_logo.png", + 'remoteName' => null + ) + ), + $messageObj["attachment"] + ); + } + + public function testAddInlineImages() + { + $message = $this->client->MessageBuilder(); + $message->addInlineImage("@../TestAssets/mailgun_icon.png"); + $message->addInlineImage("@../TestAssets/rackspace_logo.png"); + $messageObj = $message->getFiles(); + $this->assertEquals( + array( + array( + 'filePath' => "@../TestAssets/mailgun_icon.png", + 'remoteName' => null + ), + array( + 'filePath' => "@../TestAssets/rackspace_logo.png", + 'remoteName' => null + ) + ), + $messageObj['inline'] + ); + } + + public function testAddAttachmentsPostName() + { + $message = $this->client->MessageBuilder(); + $message->addAttachment('@../TestAssets/mailgun_icon.png', 'mg_icon.png'); + $message->addAttachment('@../TestAssets/rackspace_logo.png', 'rs_logo.png'); + $messageObj = $message->getFiles(); + $this->assertEquals( + array( + array( + 'filePath' => '@../TestAssets/mailgun_icon.png', + 'remoteName' => 'mg_icon.png' + ), + array( + 'filePath' => '@../TestAssets/rackspace_logo.png', + 'remoteName' => 'rs_logo.png' + ) + ), + $messageObj["attachment"] + ); + } + + public function testAddInlineImagePostName() + { + $message = $this->client->MessageBuilder(); + $message->addInlineImage('@../TestAssets/mailgun_icon.png', 'mg_icon.png'); + $message->addInlineImage('@../TestAssets/rackspace_logo.png', 'rs_logo.png'); + $messageObj = $message->getFiles(); + $this->assertEquals( + array( + array( + 'filePath' => '@../TestAssets/mailgun_icon.png', + 'remoteName' => 'mg_icon.png' + ), + array( + 'filePath' => '@../TestAssets/rackspace_logo.png', + 'remoteName' => 'rs_logo.png' + ) + ), + $messageObj['inline'] + ); + } + + public function testsetTestMode() + { + $message = $this->client->MessageBuilder(); + $message->setTestMode(true); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:testmode" => "yes"), $messageObj); + $message->setTestMode(false); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:testmode" => "no"), $messageObj); + $message->setTestMode("yes"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:testmode" => "yes"), $messageObj); + $message->setTestMode("no"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:testmode" => "no"), $messageObj); + } + + public function addCampaignId() + { + $message = $this->client->MessageBuilder(); + $message->addCampaignId("ABC123"); + $message->addCampaignId("XYZ987"); + $message->addCampaignId("TUV456"); + $message->addCampaignId("NONO123"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:campaign" => array("ABC123", "XYZ987", "TUV456")), $messageObj); + } + + public function testSetDkim() + { + $message = $this->client->MessageBuilder(); + $message->setDkim(true); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:dkim" => "yes"), $messageObj); + $message->setDkim(false); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:dkim" => "no"), $messageObj); + $message->setDkim("yes"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:dkim" => "yes"), $messageObj); + $message->setDkim("no"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:dkim" => "no"), $messageObj); + } + + public function testSetClickTracking() + { + $message = $this->client->MessageBuilder(); + $message->setClickTracking(true); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:tracking-clicks" => "yes"), $messageObj); + $message->setClickTracking(false); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:tracking-clicks" => "no"), $messageObj); + $message->setClickTracking("yes"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:tracking-clicks" => "yes"), $messageObj); + $message->setClickTracking("no"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:tracking-clicks" => "no"), $messageObj); + } + + public function testSetOpenTracking() + { + $message = $this->client->MessageBuilder(); + $message->setOpenTracking(true); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:tracking-opens" => "yes"), $messageObj); + $message->setOpenTracking(false); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:tracking-opens" => "no"), $messageObj); + $message->setOpenTracking("yes"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:tracking-opens" => "yes"), $messageObj); + $message->setOpenTracking("no"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:tracking-opens" => "no"), $messageObj); + } + + public function testSetDeliveryTime() + { + $message = $this->client->MessageBuilder(); + $message->setDeliveryTime("January 15, 2014 8:00AM", "CST"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:deliverytime" => "Wed, 15 Jan 2014 08:00:00 -0600"), $messageObj); + $message->setDeliveryTime("January 15, 2014 8:00AM", "UTC"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:deliverytime" => "Wed, 15 Jan 2014 08:00:00 +0000"), $messageObj); + $message->setDeliveryTime("January 15, 2014 8:00AM"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:deliverytime" => "Wed, 15 Jan 2014 08:00:00 +0000"), $messageObj); + $message->setDeliveryTime("1/15/2014 13:50:01", "CDT"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("o:deliverytime" => "Wed, 15 Jan 2014 13:50:01 -0600"), $messageObj); + // https://github.com/mailgun/mailgun-php/pull/42 + // https://github.com/mailgun/mailgun-php/issues/43 + //$message->setDeliveryTime("first saturday of July 2013 8:00AM", "CDT"); + //$messageObj = $message->getMessage(); + //$this->assertEquals(array("o:deliverytime" => "Sat, 06 Jul 2013 08:00:00 -0500"), $messageObj); + } + + public function testAddCustomData() + { + $message = $this->client->MessageBuilder(); + $message->addCustomData("My-Super-Awesome-Data", array("What" => "Mailgun Rocks!")); + $messageObj = $message->getMessage(); + $this->assertEquals(array("v:My-Super-Awesome-Data" => "{\"What\":\"Mailgun Rocks!\"}"), $messageObj); + } + + public function testAddCustomParameter() + { + $message = $this->client->MessageBuilder(); + $message->addCustomParameter("my-option", "yes"); + $message->addCustomParameter("o:my-other-option", "no"); + $messageObj = $message->getMessage(); + $this->assertEquals(array("my-option" => array("yes"), "o:my-other-option" => array("no")), $messageObj); + } + + public function testSetMessage() + { + $message = array(1, 2, 3, 4, 5); + $messageBuilder = $this->client->MessageBuilder(); + $messageBuilder->setMessage($message); + + $this->assertEquals($message, $messageBuilder->getMessage()); + } +} diff --git a/sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/StandardMessageTest.php b/sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/StandardMessageTest.php new file mode 100644 index 00000000..b1f885d1 --- /dev/null +++ b/sites/all/libraries/mailgun/tests/Mailgun/Tests/Messages/StandardMessageTest.php @@ -0,0 +1,48 @@ +client = new Mailgun("My-Super-Awesome-API-Key"); + } + + public function testSendMIMEMessage() + { + $customMime = "Received: by luna.mailgun.net with SMTP mgrt 8728174999085; Mon, 10 Jun 2013 09:50:58 +0000 + Mime-Version: 1.0 + Content-Type: text/plain; charset=\"ascii\" + Subject: This is the Subject! + From: Mailgun Testing + To: test@test.mailgun.com + Message-Id: <20130610095049.30790.4334@test.mailgun.com> + Content-Transfer-Encoding: 7bit + X-Mailgun-Sid: WyIxYTdhMyIsICJmaXplcmtoYW5AcXVhZG1zLmluIiwgImExOWQiXQ== + Date: Mon, 10 Jun 2013 09:50:58 +0000 + Sender: test@test.mailgun.com + + Mailgun is testing!"; + $envelopeFields = array('to' => 'test@test.mailgun.org'); + $result = $this->client->sendMessage("test.mailgun.org", $envelopeFields, $customMime); + $this->assertEquals("test.mailgun.org/messages.mime", $result->http_endpoint_url); + } + + public function testSendMessage() + { + $message = array('to' => 'test@test.mailgun.org', + 'from' => 'sender@test.mailgun.org', + 'subject' => 'This is my test subject', + 'text' => 'Testing!' + ); + $result = $this->client->sendMessage("test.mailgun.org", $message); + $this->assertEquals("test.mailgun.org/messages", $result->http_endpoint_url); + + } +} diff --git a/sites/all/libraries/mailgun/tests/Mailgun/Tests/Mock/Connection/TestBroker.php b/sites/all/libraries/mailgun/tests/Mailgun/Tests/Mock/Connection/TestBroker.php new file mode 100644 index 00000000..6652aa59 --- /dev/null +++ b/sites/all/libraries/mailgun/tests/Mailgun/Tests/Mock/Connection/TestBroker.php @@ -0,0 +1,71 @@ +apiKey = $apiKey; + $this->apiEndpoint = $apiHost; + } + + public function post($endpointUrl, $postData = array(), $files = array()) + { + return $this->testResponseHandler($endpointUrl, $httpResponseCode = 200); + } + + public function get($endpointUrl, $queryString = array()) + { + return $this->testResponseHandler($endpointUrl, $httpResponseCode = 200); + } + + public function delete($endpointUrl) + { + return $this->testResponseHandler($endpointUrl, $httpResponseCode = 200); + } + + public function put($endpointUrl, $queryString) + { + return $this->testResponseHandler($endpointUrl, $httpResponseCode = 200); + } + + public function testResponseHandler($endpointUrl, $httpResponseCode = 200) + { + if ($httpResponseCode === 200) { + $result = new \stdClass(); + $result->http_response_body = new \stdClass(); + $jsonResponseData = json_decode('{"message": "Some JSON Response Data", "id": "1234"}'); + foreach ($jsonResponseData as $key => $value) { + $result->http_response_body->$key = $value; + } + } elseif ($httpResponseCode == 400) { + throw new MissingRequiredMIMEParameters(EXCEPTION_MISSING_REQUIRED_MIME_PARAMETERS); + } elseif ($httpResponseCode == 401) { + throw new InvalidCredentials(EXCEPTION_INVALID_CREDENTIALS); + } elseif ($httpResponseCode == 401) { + throw new GenericHTTPError(EXCEPTION_INVALID_CREDENTIALS); + } elseif ($httpResponseCode == 404) { + throw new MissingEndpoint(EXCEPTION_MISSING_ENDPOINT); + } else { + throw new GenericHTTPError(EXCEPTION_GENERIC_HTTP_ERROR); + + return false; + } + $result->http_response_code = $httpResponseCode; + $result->http_endpoint_url = $endpointUrl; + + return $result; + } + + +} diff --git a/sites/all/libraries/mailgun/tests/Mailgun/Tests/Mock/Mailgun.php b/sites/all/libraries/mailgun/tests/Mailgun/Tests/Mock/Mailgun.php new file mode 100644 index 00000000..ad57bcce --- /dev/null +++ b/sites/all/libraries/mailgun/tests/Mailgun/Tests/Mock/Mailgun.php @@ -0,0 +1,17 @@ +restClient = new TestBroker($apiKey, $apiEndpoint, $apiVersion); + } +} diff --git a/sites/all/libraries/mailgun/tests/Mailgun/Tests/TestAssets/mailgun_icon1.png b/sites/all/libraries/mailgun/tests/Mailgun/Tests/TestAssets/mailgun_icon1.png new file mode 100644 index 0000000000000000000000000000000000000000..604f6730d58a6bcc2eba5f967bc62a44a4d682eb GIT binary patch literal 86845 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 literal 0 HcmV?d00001 diff --git a/sites/all/libraries/mailgun/tests/Mailgun/Tests/TestAssets/mailgun_icon2.png b/sites/all/libraries/mailgun/tests/Mailgun/Tests/TestAssets/mailgun_icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..604f6730d58a6bcc2eba5f967bc62a44a4d682eb GIT binary patch literal 86845 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 literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/mail/mailgun/LICENSE.txt b/sites/all/modules/contrib/mail/mailgun/LICENSE.txt new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/sites/all/modules/contrib/mail/mailgun/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/sites/all/modules/contrib/mail/mailgun/mailgun.admin.inc b/sites/all/modules/contrib/mail/mailgun/mailgun.admin.inc new file mode 100644 index 00000000..b5f99f1f --- /dev/null +++ b/sites/all/modules/contrib/mail/mailgun/mailgun.admin.inc @@ -0,0 +1,221 @@ +documentation for more information.', array('@url' => url('https://www.drupal.org/node/2547591'))), 'error'); + } + + $key = variable_get('mailgun_api_key', ''); + + $form['mailgun_api_key'] = array( + '#title' => t('Mailgun API key'), + '#type' => 'textfield', + '#description' => t('Get your Secret API key from the Mailgun dashboard.', array('@url' => url('https://mailgun.com/app/dashboard'))), + '#default_value' => $key, + '#required' => TRUE, + ); + + $client = FALSE; + if (!empty($key)) { + try { + $client = mailgun_get_client($key); + } catch (Exception $e) { + watchdog('mailgun', 'An exception occurred. @code: @message', array('@code' => $e->getCode(), '@message' => $e->getMessage()), WATCHDOG_WARNING, 'admin/config/system/mailgun'); + drupal_set_message(t('Mailgun: %message', array('%message' => $e->getMessage())), 'error'); + } + } + + // Display settings only when a valid API key is present and client is active + if ($client) { + $domain_options = array( + '_sender' => t('Get domain from sender address'), + ); + $domains = array(); + $result = $client->get('domains'); + if ($result && $result->http_response_code == 200) { + foreach ($result->http_response_body->items as $domain) { + $domains[$domain->name] = $domain; + $domain_options[$domain->name] = $domain->name; + } + } + + $form['mailgun_domain'] = array( + '#title' => t('Domain'), + '#type' => 'select', + '#options' => $domain_options, + '#description' => t('Mails will be sent using this domain'), + '#default_value' => variable_get('mailgun_domain', '_sender'), + ); + + $form['mailgun_test'] = array( + '#title' => t('Test mode'), + '#type' => 'checkbox', + '#default_value' => variable_get('mailgun_test', FALSE), + '#description' => t('Enables sending in test mode'), + ); + + $form['mailgun_queue'] = array( + '#title' => t('Queue mails'), + '#type' => 'checkbox', + '#description' => t('Mails will be queued and sent during cron runs. Useful for sending a large number of emails.'), + '#default_value' => variable_get('mailgun_queue', FALSE), + ); + + $form['mailgun_log'] = array( + '#title' => t('Log mails'), + '#type' => 'checkbox', + '#description' => t('Log mails sent through Mailgun. Should not be enabled on production sites. Messages fail to send will be logged regardless of this setting.'), + '#default_value' => variable_get('mailgun_log', FALSE), + ); + + $formats = array('_none' => t('- None -')); + foreach (filter_formats() as $format) { + if ($format->format == 'php_code') { + continue; + } + $formats[$format->format] = t($format->name); + } + $form['mailgun_format'] = array( + '#title' => t('Text format'), + '#type' => 'select', + '#description' => t('Specify an additional text format to filter the message through before sending the email.'), + '#options' => $formats, + '#default_value' => variable_get('mailgun_format', '_none'), + ); + + $form['defaults'] = array( + '#type' => 'fieldset', + '#title' => t('Default settings'), + '#description' => t('These default settings apply to messages sent using Mailgun and may be overriden on a per-message basis.'), + '#collapsible' => FALSE, + '#collapsed' => FALSE, + ); + + $form['defaults']['mailgun_tracking'] = array( + '#title' => t('Enable tracking'), + '#type' => 'select', + '#options' => array('default' => t('Use default setting'), 'enabled' => t('Enabled'), 'disabled' => t('Disabled')), + '#description' => t('Whether to enable event tracking by default or not. See Tracking Messages for details.', array('@url' => url('https://documentation.mailgun.com/user_manual.html#tracking-messages'))), + '#default_value' => variable_get('mailgun_tracking', 'default'), + ); + + $form['defaults']['mailgun_tracking_clicks'] = array( + '#title' => t('Enable click tracking'), + '#type' => 'select', + '#options' => array('default' => t('Use default setting'), 'enabled' => t('Enabled'), 'disabled' => t('Disabled')), + '#description' => t('Whether to enable click tracking by default or not.'), + '#default_value' => variable_get('mailgun_tracking_clicks', 'default'), + ); + + $form['defaults']['mailgun_tracking_opens'] = array( + '#title' => t('Enable open tracking'), + '#type' => 'select', + '#options' => array('default' => t('Use default setting'), 'enabled' => t('Enabled'), 'disabled' => t('Disabled')), + '#description' => t('Whether to enable open tracking by default or not.'), + '#default_value' => variable_get('mailgun_tracking_opens', 'default'), + ); + } + + $form = system_settings_form($form); + $form['#validate'][] = 'mailgun_admin_settings_validate'; + + return $form; +} + +/** + * Form validation handler for mailgun_admin_settings(). + * + * Perform additional validation to ensure the API key entered is valid. + */ +function mailgun_admin_settings_validate($form, &$form_state) { + if ($form['mailgun_api_key']['#default_value'] != $form_state['values']['mailgun_api_key']) { + // The API key has changed. Perform validation. + $form_state['values']['mailgun_api_key'] = trim($form_state['values']['mailgun_api_key']); + $client = mailgun_get_client($form_state['values']['mailgun_api_key']); + try { + $result = $client->get('domains'); + drupal_set_message(t('Your API key has been successfully validated.')); + } catch (Exception $e) { + form_set_error('mailgun_api_key', t('An exception occurred. @code: @message', array('@code' => $e->getCode(), '@message' => $e->getMessage()))); + } + } +} + +/** + * Form builder. Display a form for sending a test e-mail. + */ +function mailgun_test_form($form, &$form_state) { + drupal_set_title(t('Send test mail')); + + $form['to'] = array( + '#type' => 'textfield', + '#title' => t('To'), + '#default_value' => variable_get('site_mail', ''), + '#description' => t('Type in an address to have the test email sent there.'), + '#required' => TRUE, + ); + + $message = "Howdy!\n\nIf this e-mail is displayed correctly and delivered sound and safe, congrats! You have successfully configured Mailgun."; + $message .= ' Visit the project page to contribute or read documentation to learn more.'; + $message = t($message, array('@project' => url('https://www.drupal.org/project/mailgun'), '@documentation' => url('https://www.drupal.org/node/2547591'))); + $form['message'] = array( + '#type' => 'textarea', + '#title' => t('Message'), + '#default_value' => $message, + '#required' => TRUE, + ); + + $form['attachment'] = array( + '#title' => t('Include attachment'), + '#type' => 'checkbox', + '#description' => t('If checked, the Drupal icon will be included as an attachment with the test e-mail.'), + '#default_value' => TRUE, + ); + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Send'), + ); + $form['cancel'] = array( + '#type' => 'link', + '#href' => 'admin/config/system/mailgun', + '#title' => t('Cancel'), + ); + + return $form; +} + +/** + * Form submission handler for mailgun_test_form(). + * Send the test e-mail. + */ +function mailgun_test_form_submit($form, &$form_state) { + $to = $form_state['values']['to']; + $params = array( + 'message' => $form_state['values']['message'], + 'attachment' => $form_state['values']['attachment'], + ); + $site_name = variable_get('site_name', ''); + $default_from = variable_get('site_mail', ini_get('sendmail_from')); + $from = (!empty($site_name)) ? $site_name . ' <' . $default_from . '>' : $default_from; + $result = drupal_mail('mailgun', 'test', $to, $GLOBALS['language'], $params, $from); + drupal_set_message(t('Test email sent from %from to %to. If you have the "Log mails" setting enabled, check the database log for details.', array('%from' => $result['from'], '%to' => $result['to'], '@url' => url('admin/reports/dblog'))), 'status'); +} diff --git a/sites/all/modules/contrib/mail/mailgun/mailgun.info b/sites/all/modules/contrib/mail/mailgun/mailgun.info new file mode 100644 index 00000000..f9822c4a --- /dev/null +++ b/sites/all/modules/contrib/mail/mailgun/mailgun.info @@ -0,0 +1,16 @@ +name = Mailgun +description = "Provides integration with Mailgun's email sending API." +core = 7.x +package = Mailgun + +dependencies[] = libraries +dependencies[] = mailsystem + +files[] = mailgun.mail.inc + +; Information added by Drupal.org packaging script on 2016-06-26 +version = "7.x-1.6+0-dev" +core = "7.x" +project = "mailgun" +datestamp = "1466914444" + diff --git a/sites/all/modules/contrib/mail/mailgun/mailgun.install b/sites/all/modules/contrib/mail/mailgun/mailgun.install new file mode 100644 index 00000000..52c72700 --- /dev/null +++ b/sites/all/modules/contrib/mail/mailgun/mailgun.install @@ -0,0 +1,34 @@ + 'MailgunMailSystem')); +} + +/** + * Implements hook_disable(). + */ +function mailgun_disable() { + // Tell Mail System to remove Mailgun and restore to defaults. + mailsystem_clear(array('mailgun_test' => 'MailgunMailSystem')); + watchdog('mailgun', 'Mailgun has been disabled.'); +} diff --git a/sites/all/modules/contrib/mail/mailgun/mailgun.mail.inc b/sites/all/modules/contrib/mail/mailgun/mailgun.mail.inc new file mode 100644 index 00000000..6dbd22f0 --- /dev/null +++ b/sites/all/modules/contrib/mail/mailgun/mailgun.mail.inc @@ -0,0 +1,123 @@ + $message['from'], + 'to' => $message['to'], + 'subject' => $message['subject'], + 'text' => check_plain($message['body']), + 'html' => $message['body'], + ); + + // Add CC, BCC and Reply-To fields if not empty. + $headers = array_change_key_case($message['headers']); + + if (!empty($headers['cc'])) { + $mailgun_message['cc'] = $headers['cc']; + } + if (!empty($headers['bcc'])) { + $mailgun_message['bcc'] = $headers['bcc']; + } + if (!empty($headers['reply-to'])) { + $mailgun_message['h:Reply-To'] = $headers['reply-to']; + } + + $params = array(); + + // Populate default settings. + if ($variable = variable_get('mailgun_tracking', 'default') != 'default') { + $params['o:tracking'] = $variable; + } + if ($variable = variable_get('mailgun_tracking_clicks', 'default') != 'default') { + $params['o:tracking-clicks'] = $variable; + } + if ($variable = variable_get('mailgun_tracking_opens', 'default') != 'default') { + $params['o:tracking-opens'] = $variable; + } + + // For a full list of allowed parameters, see: https://documentation.mailgun.com/api-sending.html#sending. + $allowed_params = array('o:tag', 'o:campaign', 'o:deliverytime', 'o:dkim', 'o:testmode', 'o:tracking', 'o:tracking-clicks', 'o:tracking-opens'); + foreach ($message['params'] as $key => $value) { + // Check if it's one of the known parameters. + $allowed = (in_array($key, $allowed_params)) ? TRUE : FALSE; + // If more options become available but are not yet supported by the module, uncomment the following line. + //$allowed = (substr($key, 0, 2) == 'o:') ? TRUE : FALSE; + if ($allowed) { + $params[$key] = $value; + } + // Check for custom MIME headers or custom JSON data. + if (substr($key, 0, 2) == 'h:' || substr($key, 0, 2) == 'v:') { + $params[$key] = $value; + } + } + + // Make sure the files provided in the attachments array exist. + if (!empty($message['params']['attachments'])) { + $params['attachments'] = array(); + foreach ($message['params']['attachments'] as $attachment) { + if (file_exists($attachment)) { + $params['attachments'][] = $attachment; + } + } + } + + $mailgun_message['params'] = $params; + + // Queue the message if the setting is enabled. + if (variable_get('mailgun_queue', FALSE)) { + $queue = DrupalQueue::get('mailgun_queue', TRUE); + $queue->createItem($mailgun_message); + return TRUE; + } + + return mailgun_send($mailgun_message); + } + +} diff --git a/sites/all/modules/contrib/mail/mailgun/mailgun.module b/sites/all/modules/contrib/mail/mailgun/mailgun.module new file mode 100644 index 00000000..a5bb037b --- /dev/null +++ b/sites/all/modules/contrib/mail/mailgun/mailgun.module @@ -0,0 +1,261 @@ + 'Mailgun', + 'description' => 'Configure Mailgun settings.', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('mailgun_admin_settings'), + 'access arguments' => array('administer mailgun'), + 'file' => 'mailgun.admin.inc', + ); + $items['admin/config/system/mailgun/settings'] = array( + 'title' => 'Settings', + 'type' => MENU_DEFAULT_LOCAL_TASK, + 'weight' => 0, + ); + $items['admin/config/system/mailgun/test'] = array( + 'title' => 'Send test email', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('mailgun_test_form'), + 'access arguments' => array('administer mailgun'), + 'description' => 'Send a test e-mail using the Mailgun API.', + 'file' => 'mailgun.admin.inc', + 'type' => MENU_LOCAL_TASK, + 'weight' => 1, + ); + + return $items; +} + +/** + * Implements hook_permission(). + */ +function mailgun_permission() { + return array( + 'administer mailgun' => array( + 'title' => t('Administer Mailgun'), + 'description' => t('Perform administration tasks for the Mailgun e-mail sending service.'), + "restrict access" => TRUE, + ), + ); +} + +/** + * Implements hook_help(). + */ +function mailgun_help($path, $arg) { + switch ($path) { + case 'admin/config/system/mailgun': + return '

' . t('See documentation for instructions on installing and configuring Mailgun.', array('@url' => url('https://www.drupal.org/node/2547591'))) . '

'; + break; + case 'admin/config/system/mailgun/test': + return '

' . t('Use this form to send a test e-mail to ensure you have correctly configured Mailgun.') . '

'; + break; + } +} + +/** + * Implements hook_cron_queue_info(). + */ +function mailgun_cron_queue_info() { + $queues = array(); + $queues['mailgun_queue'] = array( + 'worker callback' => 'mailgun_send', + 'time' => 60, + ); + return $queues; +} + +/** + * Implements hook_mail(). + */ +function mailgun_mail($key, &$message, $params) { + switch ($key) { + case 'test': + $message['subject'] = t('Mailgun test email'); + $message['body'] = $params['message']; + if ($params['attachment']) { + $message['params']['attachments'] = array(drupal_realpath('misc/druplicon.png')); + } + break; + } +} + +/** + * Implements hook_libraries_info(). + */ +function mailgun_libraries_info() { + $libraries['mailgun'] = array( + 'name' => 'Mailgun PHP library', + 'vendor url' => 'https://documentation.mailgun.com/wrappers.html#php', + 'download url' => 'https://github.com/mailgun/mailgun-php/archive/v1.7.2.zip', + 'path' => 'vendor', + 'version arguments' => array( + 'file' => 'src/Mailgun/Constants/Constants.php', + // const SDK_VERSION = "1.7"; + 'pattern' => '/const SDK_VERSION = \"((\d+)\.(\d+))\";/', + ), + 'files' => array( + 'php' => array('autoload.php'), + ), + ); + + return $libraries; +} + +/** + * Get the Mailgun client to access Mailgun's endpoints. + * + * @param string $key + * The Mailgun API key. Leave empty to use the API key saved in database. + */ +function mailgun_get_client($key = '') { + // Check if the Mailgun PHP library is installed. + $library = libraries_load('mailgun'); + if (!$library['installed']) { + watchdog('mailgun', 'Mailgun client initialization failed: Unable to load the Mailgun PHP library.', NULL, WATCHDOG_ERROR); + return FALSE; + } + + $key = (empty($key)) ? variable_get('mailgun_api_key', '') : $key; + if (empty($key)) { + watchdog('mailgun', 'Mailgun client initialization failed: Missing API key.', NULL, WATCHDOG_ERROR); + return FALSE; + } + + $client = new \Mailgun\Mailgun($key); + return $client; +} + +/** + * Send an e-mail using the Mailgun API. + * + * @param array $mailgun_message + * A Mailgun message array. Contains the following keys: + * - from: The e-mail addressthe message will be sent from. + * - to: The e-mail addressthe message will be sent to. + * - subject: The subject of the message. + * - text: The plain-text version of the message. Processed using check_plain(). + * - html: The original message content. May contain HTML tags. + * - cc: One or more carbon copy recipients. If multiple, separate with commas. + * - bcc: One or more blind carbon copy recipients. If multiple, separate with commas. + * - o:tag: An array containing the tags to add to the message. See: https://documentation.mailgun.com/user_manual.html#tagging. + * - o:campaign: The campaign ID this message belongs to. See: https://documentation.mailgun.com/user_manual.html#um-campaign-analytics. + * - o:deliverytime: Desired time of delivery. Messages can be scheduled for a maximum of 3 days in the future. See: https://documentation.mailgun.com/api-intro.html#date-format. + * - o:dkim: Boolean indicating whether or not to enable DKIM signatures on per-message basis. + * - o:testmode: Boolean indicating whether or not to enable test mode. See: https://documentation.mailgun.com/user_manual.html#manual-testmode. + * - o:tracking: Boolean indicating whether or not to toggle tracking on a per-message basis. See: https://documentation.mailgun.com/user_manual.html#tracking-messages. + * - o:tracking-clicks: Boolean or string "htmlonly" indicating whether or not to toggle clicks tracking on a per-message basis. Has higher priority than domain-level setting. + * - o:tracking-opens: Boolean indicating whether or not to toggle clicks tracking on a per-message basis. Has higher priority than domain-level setting. + * - h:X-My-Header: h: prefix followed by an arbitrary value allows to append a custom MIME header to the message (X-My-Header in this case). For example, h:Reply-To to specify Reply-To address. + * - v:my-var: v: prefix followed by an arbitrary name allows to attach a custom JSON data to the message. See: https://documentation.mailgun.com/user_manual.html#manual-customdata. + * + * @return bool + * TRUE if the mail was successfully accepted, FALSE otherwise. + */ +function mailgun_send($mailgun_message) { + $client = mailgun_get_client(); + if (!$client) { + return FALSE; + } + + // Test mode + if (variable_get('mailgun_test', FALSE)) { + $mailgun_message['o:testmode'] = 'yes'; + } + + // Merge the $mailgun_message array with options. + $mailgun_message += $mailgun_message['params']; + unset($mailgun_message['params']); + + if (variable_get('mailgun_domain', '_sender') == '_sender') { + // Extract the domain from the sender's email address. Use regular expression to check since it could be either a plain email address or in the form "Name ". + $tokens = (preg_match('/^\s*(.+?)\s*<\s*([^>]+)\s*>$/', $mailgun_message['from'], $matches) === 1) ? explode('@', $matches[2]) : explode('@', $mailgun_message['from']); + $mail_domain = array_pop($tokens); + + // Retrieve a list of available domains first. + $domains = array(); + try { + $result = $client->get('domains'); + if ($result->http_response_code == 200) { + foreach ($result->http_response_body->items as $item) { + $domains[$item->name] = $item->name; + } + } + else { + watchdog('mailgun', 'Mailgun server returned a %code error. Could not retrieve domain list.', array('%code' => $result->http_response_code), WATCHDOG_ERROR); + } + } catch (Exception $e) { + watchdog('mailgun', 'An exception occurred while retrieving domains. @code: @message', array('@code' => $e->getCode(), '@message' => $e->getMessage()), WATCHDOG_ERROR); + } + + if (empty($domains)) { + // No domain available. Although this shouldn't happen, doesn't hurt to check. + return FALSE; + } + + // Now, we need to get the working domain. This is generally the domain the From address is on or the root domain of it. + $working_domain = ''; + if ($key = array_search($mail_domain, $domains) !== FALSE) { + // Great. Found it. + $working_domain = $mail_domain; + } + else { + // Oops. No match. Perhaps it's a subdomain instead. + foreach ($domains as $domain) { + if (strpos($domain, $mail_domain) !== FALSE) { + // Got it. + $working_domain = $domain; + break; + } + } + } + + // There is a chance that the user is attempting to send from an email address that's on a domain not yet added to the Mailgun account. + // In that case, abort sending and report error. + if (empty($working_domain)) { + watchdog('mailgun', 'Unable to locate a working domain for From address %mail. Aborting sending.', array('%mail' => $mailgun_message['from']), WATCHDOG_ERROR); + return FALSE; + } + } + else { + $working_domain = variable_get('mailgun_domain', ''); + } + + // Attachments + $post_data = array(); + if (!empty($mailgun_message['attachments'])) { + // Send message with attachments. + $post_data['attachment'] = $mailgun_message['attachments']; + unset($mailgun_message['attachments']); + } + + try { + $result = $client->sendMessage($working_domain, $mailgun_message, $post_data); + + // For a list of HTTP response codes, see: https://documentation.mailgun.com/api-intro.html#errors. + if ($result->http_response_code == 200) { + if (variable_get('mailgun_log', FALSE)) { + watchdog('mailgun', 'Successfully sent message from %from to %to. %code: %message.', array('%from' => $mailgun_message['from'], '%to' => $mailgun_message['to'], '%code' => $result->http_response_code, '%message' => $result->http_response_body->message)); + } + return TRUE; + } + else { + watchdog('mailgun', 'Failed to send message from %from to %to. %code: %message.', array('%from' => $mailgun_message['from'], '%to' => $mailgun_message['to'], '%code' => $result->http_response_code, '%message' => $result->http_response_body->message), WATCHDOG_ERROR); + return FALSE; + } + } catch (Exception $e) { + watchdog('mailgun', 'Exception occurred while trying to send test email from %from to %to. @code: @message.', array('%from' => $mailgun_message['from'], '%to' => $mailgun_message['to'], '@code' => $e->getCode(), '@message' => $e->getMessage())); + } +}