diff options
author | yehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664> | 2019-11-25 08:22:35 +0000 |
---|---|---|
committer | yehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664> | 2019-11-25 08:22:35 +0000 |
commit | c61784411988d36d9bbd93cd3a97e773990af342 (patch) | |
tree | 924e6e9dea2ba7b1eedb14d0c4b03a38aefdf179 /Postman/Postman-Mail/PostmanGmailApiModuleZendMailTransport.php | |
parent | 907ce8c044159ca8da6ccce3ec5362ac61e7c142 (diff) | |
download | Post-SMTP-c61784411988d36d9bbd93cd3a97e773990af342.zip |
Adding a folder
Diffstat (limited to 'Postman/Postman-Mail/PostmanGmailApiModuleZendMailTransport.php')
-rw-r--r-- | Postman/Postman-Mail/PostmanGmailApiModuleZendMailTransport.php | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/Postman/Postman-Mail/PostmanGmailApiModuleZendMailTransport.php b/Postman/Postman-Mail/PostmanGmailApiModuleZendMailTransport.php new file mode 100644 index 0000000..b190772 --- /dev/null +++ b/Postman/Postman-Mail/PostmanGmailApiModuleZendMailTransport.php @@ -0,0 +1,278 @@ +<?php +if ( ! defined( 'ABSPATH' ) ) { + exit; // Exit if accessed directly +} + +/** + * Zend Framework + * + * LICENSE + * + * This source file is subject to the new BSD license that is bundled + * with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://framework.zend.com/license/new-bsd + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@zend.com so we can send you a copy immediately. + * + * @category Zend + * @package Postman_Zend_Mail + * @subpackage Transport + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id$ + */ + +/** + * + * @see Postman_Zend_Mime + */ +// require_once 'Zend/Mime.php'; + +/** + * + * @see Postman_Zend_Mail_Protocol_Smtp + */ +// require_once 'Zend/Mail/Protocol/Smtp.php'; + +/** + * + * @see Postman_Zend_Mail_Transport_Abstract + */ +// require_once 'Zend/Mail/Transport/Abstract.php'; + +/** + * SMTP connection object + * + * Loads an instance of Postman_Zend_Mail_Protocol_Smtp and forwards smtp transactions + * + * @category Zend + * @package Postman_Zend_Mail + * @subpackage Transport + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +if (! class_exists ( 'PostmanGmailApiModuleZendMailTransport' )) { + class PostmanGmailApiModuleZendMailTransport extends Postman_Zend_Mail_Transport_Abstract { + const SERVICE_OPTION = 'service'; + const MESSAGE_SENDER_EMAIL_OPTION = 'sender_email'; + private $logger; + private $message; + private $transcript; + + /** + * EOL character string used by transport + * + * @var string + * @access public + */ + public $EOL = "\n"; + + /** + * Remote smtp hostname or i.p. + * + * @var string + */ + protected $_host; + + /** + * Port number + * + * @var integer|null + */ + protected $_port; + + /** + * Local client hostname or i.p. + * + * @var string + */ + protected $_name = 'localhost'; + + /** + * Authentication type OPTIONAL + * + * @var string + */ + protected $_auth; + + /** + * Config options for authentication + * + * @var array + */ + protected $_config; + + /** + * Instance of Postman_Zend_Mail_Protocol_Smtp + * + * @var Postman_Zend_Mail_Protocol_Smtp + */ + protected $_connection; + + /** + * Constructor. + * + * @param string $host + * OPTIONAL (Default: 127.0.0.1) + * @param array $config + * OPTIONAL (Default: null) + * @return void + * + * @todo Someone please make this compatible + * with the SendMail transport class. + */ + public function __construct($host = '127.0.0.1', Array $config = array()) { + if (isset ( $config ['name'] )) { + $this->_name = $config ['name']; + } + if (isset ( $config ['port'] )) { + $this->_port = $config ['port']; + } + if (isset ( $config ['auth'] )) { + $this->_auth = $config ['auth']; + } + + $this->_host = $host; + $this->_config = $config; + $this->logger = new PostmanLogger ( get_class ( $this ) ); + } + + /** + * Class destructor to ensure all open connections are closed + * + * @return void + */ + public function __destruct() { + if ($this->_connection instanceof Postman_Zend_Mail_Protocol_Smtp) { + try { + $this->_connection->quit (); + } catch ( Postman_Zend_Mail_Protocol_Exception $e ) { + // ignore + } + $this->_connection->disconnect (); + } + } + + /** + * Sets the connection protocol instance + * + * @param Postman_Zend_Mail_Protocol_Abstract $client + * + * @return void + */ + public function setConnection(Postman_Zend_Mail_Protocol_Abstract $connection) { + $this->_connection = $connection; + } + + /** + * Gets the connection protocol instance + * + * @return Postman_Zend_Mail_Protocol_Abstract|null + */ + public function getConnection() { + return $this->_connection; + } + + /** + * Send an email via the Gmail API + * + * Uses URI https://www.googleapis.com + * + * + * @return void + * @todo Rename this to sendMail, it's a public method... + */ + public function _sendMail() { + + // Prepare the message in message/rfc822 + $message = $this->header . Postman_Zend_Mime::LINEEND . $this->body; + $this->message = $message; + + // The message needs to be encoded in Base64URL + $encodedMessage = rtrim ( strtr ( base64_encode ( $message ), '+/', '-_' ), '=' ); + $googleApiMessage = new Google_Service_Gmail_Message (); + $googleService = $this->_config [self::SERVICE_OPTION]; + $googleClient = $googleService->getClient(); + + $file_size = strlen($message); + + $result = array (); + try { + $googleClient->setDefer(true); + $result = $googleService->users_messages->send ( 'me', $googleApiMessage, array('uploadType' => 'resumable') ); + + $chunkSizeBytes = 1 * 1024 * 1024; + + // create mediafile upload + $media = new Google_Http_MediaFileUpload( + $googleClient, + $result, + 'message/rfc822', + $message, + true, + $chunkSizeBytes + ); + $media->setFileSize($file_size); + + $status = false; + while (! $status) { + $status = $media->nextChunk(); + } + $result = false; + + // Reset to the client to execute requests immediately in the future. + $googleClient->setDefer(false); + + $googleMessageId = $status->getId(); + + if ($this->logger->isInfo ()) { + $this->logger->info ( sprintf ( 'Message %d accepted for delivery', PostmanState::getInstance ()->getSuccessfulDeliveries () + 1 ) ); + } + $this->transcript = print_r ( $result, true ); + $this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS; + $this->transcript .= $message; + } catch ( Exception $e ) { + $this->transcript = $e->getMessage (); + $this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS; + $this->transcript .= $message; + throw $e; + } + } + + public function getMessage() { + return $this->message; + } + public function getTranscript() { + return $this->transcript; + } + + /** + * Format and fix headers + * + * Some SMTP servers do not strip BCC headers. Most clients do it themselves as do we. + * + * @access protected + * @param array $headers + * @return void + * @throws Postman_Zend_Transport_Exception + */ + protected function _prepareHeaders($headers) { + if (! $this->_mail) { + /** + * + * @see Postman_Zend_Mail_Transport_Exception + */ + // require_once 'Zend/Mail/Transport/Exception.php'; + throw new Postman_Zend_Mail_Transport_Exception ( '_prepareHeaders requires a registered Postman_Zend_Mail object' ); + } + + // google will unset the Bcc header for us. + // unset ( $headers ['Bcc'] ); + + // Prepare headers + parent::_prepareHeaders ( $headers ); + } + } +}
\ No newline at end of file |