diff options
author | yehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664> | 2019-05-15 12:14:32 +0000 |
---|---|---|
committer | yehudah <yehudah@b8457f37-d9ea-0310-8a92-e5e31aec5664> | 2019-05-15 12:14:32 +0000 |
commit | 38153c0f3e739f3d89a1a7734fd7d199bf457fab (patch) | |
tree | 28e19f4e091d5182a2c63bc98377e5381b0043ac /Postman/Postman-Mail/PostmanSendGridMailEngine.php | |
parent | 942aa536210fe204a2d097eb8878c1d690e0547b (diff) | |
download | Post-SMTP-38153c0f3e739f3d89a1a7734fd7d199bf457fab.zip |
= 2.0 - 2019-05-15
* New: Mailer Type - Added an option to send without overwrite the 'wp_mail' function, better compability to WordPress delivery. hopefully will be the default in the future.
* Updated: Sendgrid API was upgraded and rewritten to the new version.
* Fixed: Message-Id header was missing on SMTP
* Fixed: Email logger optimization - better query for large amount of records.
* Fixed: The localization was fixed to match translate.wordpress.org translation system ( Thanks to Niels de Blaauw from Level-Level ).
* Fixed: Code and optimization ( Thanks to Niels de Blaauw from Level-Level ).
Diffstat (limited to 'Postman/Postman-Mail/PostmanSendGridMailEngine.php')
-rw-r--r-- | Postman/Postman-Mail/PostmanSendGridMailEngine.php | 123 |
1 files changed, 48 insertions, 75 deletions
diff --git a/Postman/Postman-Mail/PostmanSendGridMailEngine.php b/Postman/Postman-Mail/PostmanSendGridMailEngine.php index 32cfb9e..b3e13b9 100644 --- a/Postman/Postman-Mail/PostmanSendGridMailEngine.php +++ b/Postman/Postman-Mail/PostmanSendGridMailEngine.php @@ -22,8 +22,8 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) { /** * - * @param unknown $senderEmail - * @param unknown $accessToken + * @param mixed $senderEmail + * @param mixed $accessToken */ function __construct( $apiKey ) { assert( ! empty( $apiKey ) ); @@ -41,86 +41,62 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) { public function send( PostmanMessage $message ) { $options = PostmanOptions::getInstance(); - // add the From Header + $email = new \SendGrid\Mail\Mail(); + + // add the From Header $sender = $message->getFromAddress(); $senderEmail = ! empty( $sender->getEmail() ) ? $sender->getEmail() : $options->getMessageSenderEmail(); $senderName = ! empty( $sender->getName() ) ? $sender->getName() : $options->getMessageSenderName(); - $from = new SendGrid\Email( $senderName, $senderEmail ); + $email->setFrom($senderEmail, $senderName); - // now log it + // now log it $sender->log( $this->logger, 'From' ); - // add the to recipients - $counter = 0; - $emails = array(); - /** - * @todo: Find a better approch. - */ - $duplicates = array(); + // add the to recipients foreach ( ( array ) $message->getToRecipients() as $recipient ) { - $recipient->log( $this->logger, 'To' ); - - $email = $recipient->getEmail(); - if ( $counter == 0 ) { - $this->logger->debug( 'Adding to=' . $recipient->getEmail() ); - $to = new SendGrid\Email($recipient->getName(), $recipient->getEmail() ); - $duplicates[] = $email; - } else { - if ( ! in_array( $email, $duplicates ) ) { - $duplicates[] = $email; - $this->logger->debug( 'Adding personalization to=' . $recipient->getEmail() ); - $emails[] = new SendGrid\Email($recipient->getName(), $recipient->getEmail() ); - } - } - - $counter++; + $emails[] = new \SendGrid\Mail\To($recipient->getEmail(), $recipient->getName() ); } + $email->addTos( $emails ); + // add the subject if ( null !== $message->getSubject() ) { - $subject = $message->getSubject(); - } + $email->setSubject($message->getSubject()); + } // add the message content $textPart = $message->getBodyTextPart(); if ( ! empty( $textPart ) ) { $this->logger->debug( 'Adding body as text' ); - $content = new SendGrid\Content("text/plain", $textPart); - } + $email->addContent("text/plain", $textPart); + } $htmlPart = $message->getBodyHtmlPart(); if ( ! empty( $htmlPart ) ) { $this->logger->debug( 'Adding body as html' ); - $content = new SendGrid\Content("text/html", $htmlPart); - } - - $mail = new SendGrid\Mail($from, $subject, $to, $content); - - foreach ( $emails as $email) { - $mail->personalization[0]->addTo($email); + $email->addContent("text/html", $htmlPart); } // add the reply-to $replyTo = $message->getReplyTo(); // $replyTo is null or a PostmanEmailAddress object if ( isset( $replyTo ) ) { - $reply_to = new SendGrid\ReplyTo( $replyTo->getEmail(), $replyTo->getName() ); - $mail->setReplyTo($reply_to); + $email->setReplyTo( $replyTo->getEmail(), $replyTo->getName() ); } // add the Postman signature - append it to whatever the user may have set if ( ! $options->isStealthModeEnabled() ) { $pluginData = apply_filters( 'postman_get_plugin_metadata', null ); - $mail->personalization[0]->addHeader( 'X-Mailer', sprintf( 'Postman SMTP %s for WordPress (%s)', $pluginData ['version'], 'https://wordpress.org/plugins/post-smtp/' ) ); + $email->addHeader( 'X-Mailer', sprintf( 'Postman SMTP %s for WordPress (%s)', $pluginData ['version'], 'https://wordpress.org/plugins/post-smtp/' ) ); } // add the headers - see http://framework.zend.com/manual/1.12/en/zend.mail.additional-headers.html foreach ( ( array ) $message->getHeaders() as $header ) { $this->logger->debug( sprintf( 'Adding user header %s=%s', $header ['name'], $header ['content'] ) ); - $mail->personalization[0]->addHeader( $header ['name'], $header ['content'] ); + $email->addHeader( $header ['name'], $header ['content'] ); } // if the caller set a Content-Type header, use it @@ -130,28 +106,25 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) { } // add the cc recipients + $ccEmails = array(); foreach ( ( array ) $message->getCcRecipients() as $recipient ) { - if ( ! in_array( $recipient->getEmail(), $duplicates ) ) { - $recipient->log( $this->logger, 'Cc' ); - $email = new SendGrid\Email( $recipient->getName(), $recipient->getEmail() ); - $mail->personalization[0]->addCc( $email ); - } - + $recipient->log( $this->logger, 'Cc' ); + $ccEmails[] = new \SendGrid\Mail\Cc( $recipient->getEmail(), $recipient->getName() ); } + $email->addCcs($ccEmails); - // add the bcc recipients + // add the bcc recipients + $bccEmails = array(); foreach ( ( array ) $message->getBccRecipients() as $recipient ) { - if ( ! in_array( $recipient->getEmail(), $duplicates ) ) { - $recipient->log($this->logger, 'Bcc'); - $email = new SendGrid\Email($recipient->getName(), $recipient->getEmail()); - $mail->personalization[0]->addBcc($email); - } + $recipient->log($this->logger, 'Bcc'); + $bccEmails[] = new \SendGrid\Mail\Cc( $recipient->getEmail(), $recipient->getName() ); } + $email->addBccs($bccEmails); - // add the messageId + // add the messageId $messageId = $message->getMessageId(); if ( ! empty( $messageId ) ) { - $mail->personalization[0]->addHeader( 'message-id', $messageId ); + $email->addHeader( 'message-id', $messageId ); } // add attachments @@ -160,13 +133,13 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) { $attachments = $this->addAttachmentsToMail( $message ); foreach ( $attachments as $index => $attachment ) { - $attach = new SendGrid\Attachment(); - $attach->setContent($attachment['content']); - $attach->setType($attachment['type']); - $attach->setFilename($attachment['file_name']); - $attach->setDisposition("attachment"); - $attach->setContentId($attachment['id']); - $mail->addAttachment($attach); + + $email->addAttachment( + $attachment['content'], + $attachment['type'], + $attachment['file_name'], + "attachment" + ); } try { @@ -174,14 +147,14 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) { if ( $this->logger->isDebug() ) { $this->logger->debug( 'Creating SendGrid service with apiKey=' . $this->apiKey ); } - $sendgrid = new SendGrid( $this->apiKey ); + $sendgrid = new \SendGrid( $this->apiKey ); // send the message if ( $this->logger->isDebug() ) { $this->logger->debug( 'Sending mail' ); } - $response = $sendgrid->client->mail()->send()->post($mail); + $response = $sendgrid->send($email); if ( $this->logger->isInfo() ) { $this->logger->info( sprintf( 'Message %d accepted for delivery', PostmanState::getInstance()->getSuccessfulDeliveries() + 1 ) ); } @@ -196,7 +169,7 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) { $e = ! $email_sent ? $this->errorCodesMap($response_code) : $response_body->errors[0]->message; $this->transcript = $e; $this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS; - $this->transcript .= print_r( $mail, true ); + $this->transcript .= print_r( $email, true ); $this->logger->debug( 'Transcript=' . $this->transcript ); @@ -204,11 +177,11 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) { } $this->transcript = print_r( $response->body(), true ); $this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS; - $this->transcript .= print_r( $mail, true ); + $this->transcript .= print_r( $email, true ); } catch ( SendGrid\Exception $e ) { $this->transcript = $e->getMessage(); $this->transcript .= PostmanModuleTransport::RAW_MESSAGE_FOLLOWS; - $this->transcript .= print_r( $mail, true ); + $this->transcript .= print_r( $email, true ); $this->logger->debug( 'Transcript=' . $this->transcript ); throw $e; @@ -219,22 +192,22 @@ if ( ! class_exists( 'PostmanSendGridMailEngine' ) ) { private function errorCodesMap($error_code) { switch ($error_code) { case 413: - $message = sprintf( __( 'ERROR: The JSON payload you have included in your request is too large. Status code is %1$s', Postman::TEXT_DOMAIN ), $error_code ); + $message = sprintf( __( 'ERROR: The JSON payload you have included in your request is too large. Status code is %1$s', 'post-smtp' ), $error_code ); break; case 429: - $message = sprintf( __( 'ERROR: The number of requests you have made exceeds SendGrid rate limitations. Status code is %1$s', Postman::TEXT_DOMAIN ), $error_code ); + $message = sprintf( __( 'ERROR: The number of requests you have made exceeds SendGrid rate limitations. Status code is %1$s', 'post-smtp' ), $error_code ); break; case 500: - $message = sprintf( __( 'ERROR: An error occurred on a SendGrid server. Status code is %1$s', Postman::TEXT_DOMAIN ), $error_code ); + $message = sprintf( __( 'ERROR: An error occurred on a SendGrid server. Status code is %1$s', 'post-smtp' ), $error_code ); break; case 513: - $message = sprintf( __( 'ERROR: The SendGrid v3 Web API is not available. Status code is %1$s', Postman::TEXT_DOMAIN ), $error_code ); + $message = sprintf( __( 'ERROR: The SendGrid v3 Web API is not available. Status code is %1$s', 'post-smtp' ), $error_code ); break; case 502: - $message = sprintf( __( 'ERROR: No recipient supplied. Status code is %1$s', Postman::TEXT_DOMAIN ), $error_code ); + $message = sprintf( __( 'ERROR: No recipient supplied. Status code is %1$s', 'post-smtp' ), $error_code ); break; default: - $message = sprintf( __( 'ERROR: Status code is %1$s', Postman::TEXT_DOMAIN ), $error_code ); + $message = sprintf( __( 'ERROR: Status code is %1$s', 'post-smtp' ), $error_code ); } return $message; |