diff options
author | Avi Goldman <avrahamymgoldman@gmail.com> | 2016-06-21 09:54:42 -0400 |
---|---|---|
committer | Avi Goldman <avrahamymgoldman@gmail.com> | 2016-06-21 09:54:42 -0400 |
commit | 7adc129a5fe72f5550db34a0a7f89150b17ca83d (patch) | |
tree | b19dd932564f66bb8b0bf093f4412f09b04aca3d | |
parent | 1187a2ccc7209b2fc4deded9e61c5124698df795 (diff) | |
download | php-sparkpost-7adc129a5fe72f5550db34a0a7f89150b17ca83d.zip php-sparkpost-7adc129a5fe72f5550db34a0a7f89150b17ca83d.tar.gz php-sparkpost-7adc129a5fe72f5550db34a0a7f89150b17ca83d.tar.bz2 |
added transmission in sparkpost class. Refactored code in Transmission.php
-rw-r--r-- | lib/SparkPost/SparkPost.php | 2 | ||||
-rw-r--r-- | lib/SparkPost/Transmission.php | 210 |
2 files changed, 85 insertions, 127 deletions
diff --git a/lib/SparkPost/SparkPost.php b/lib/SparkPost/SparkPost.php index e76bcd0..5c18945 100644 --- a/lib/SparkPost/SparkPost.php +++ b/lib/SparkPost/SparkPost.php @@ -234,6 +234,6 @@ class SparkPost */ private function setupEndpoints() { - // $this->transmissions = new Transmission($this); + $this->transmissions = new Transmission($this); } } diff --git a/lib/SparkPost/Transmission.php b/lib/SparkPost/Transmission.php index 7bec0b4..8ff1eaf 100644 --- a/lib/SparkPost/Transmission.php +++ b/lib/SparkPost/Transmission.php @@ -4,161 +4,119 @@ namespace SparkPost; class Transmission extends Resource { - protected $customHeaders = array(); - public function __construct(SparkPost $sparkpost) { parent::__construct($sparkpost, 'transmissions'); } - public function fixShorthandRecipients($payload){ - $modifiedPayload = $payload; - $recipients = &$modifiedPayload['recipients']; - $from = &$modifiedPayload['content']['from']; - $from = $this->shorthandRecipientsParser($from); - for($i = 0; $i < count($recipients); $i++){ - $recipients[$i]['address'] = $this->shorthandRecipientsParser($recipients[$i]['address']); - } - return $modifiedPayload; + public function post($payload, $headers = []) + { + $payload = $this->formatBlindCarbonCopy($payload); //Fixes BCCs into payload + $payload = $this->formatCarbonCopy($payload); //Fixes CCs into payload + $payload = $this->formatShorthandRecipients($payload); //Fixes shorthand recipients format + echo json_encode($payload); + return parent::post($payload, $headers); } - - public function shorthandRecipientsParser($value){ - if(!is_array($value)){ //if the given value isn't an array - $name = ""; - $email = ""; - $newPerson = array(); - - if(preg_match('/"(.+)"/', $value, $matches)){ //if "NAME" is found - $name = $matches[0]; - if(preg_match('/<(.+)>/', $value, $matches)){ //if <EMAIL> is found - $email = $matches[1]; - if(!$this->isEmail($email)){ - throw new \Exception("Invalid email address. Use format - \"NAME_HERE\" <EMAIL_HERE>"); - } else { - $newPerson = [ - 'name' => trim($name,'""'), - 'email' => $email - ]; - return $newPerson; - } - } else { //Has name, needs email in <EMAIL> format - throw new \Exception("Invalid email address. Use format - \"NAME_HERE\" <EMAIL_HERE>"); - } - } else if ($this->isEmail($value)){ //if the original $value is just an email, like postmaster@sparkpost.com - $newPerson = [ - 'email' => $value - ]; - - return $newPerson; - } else { //$value isn't a valid email at all. E.g. postmastersparkpost.com - throw new \Exception("Invalid email address."); - } - } else { //it's already an object, nothing we can do here - return $value; + private function formatBlindCarbonCopy($payload) + { + + //If there's a list of BCC recipients, move then into the correct format + if(isset($payload['bcc'])) { + $payload = $this->addListToRecipients($payload, 'bcc'); } + + return $payload; } - - private function isEmail($email){ - if(filter_var($email, FILTER_VALIDATE_EMAIL)){ - return true; - } else { - return false; + + private function formatCarbonCopy($payload) + { + if(isset($payload['cc'])) { + $ccAddresses = []; + foreach ($payload['cc'] as $ccRecipient) { + array_push($ccAddresses, $this->toAddressString($ccRecipient['address'])); + } + + // set up the content headers as either what it was before or an empty array + $payload['content']['headers'] = isset($payload['content']['headers']) ? $payload['content']['headers'] : []; + // add cc header + $payload['content']['headers']['CC'] = implode(',', $ccAddresses); + + $payload = $this->addListToRecipients($payload, 'cc'); } + + return $payload; } - - public function fixBlindCarbonCopy($payload) + private function formatShorthandRecipients($payload) { - $modifiedPayload = $payload; - $bccList = &$modifiedPayload['bcc']; - $recipientsList = &$modifiedPayload['recipients']; + $payload['content']['from'] = $this->toAddressObject($payload['content']['from']); - //if a name exists, then use format "name" <email>. Otherwise, just use format <email> - if(isset($modifiedPayload['recipients'][0]['name'])) - { - $originalRecipient = '"' . $modifiedPayload['recipients'][0]['name'] - . '" <' . $modifiedPayload['recipients'][0]['address'] . '>'; - } else { - $originalRecipient = '<' . $modifiedPayload['recipients'][0]['address'] - . '>'; + for($i = 0; $i < count($payload['recipients']); $i++) { + $payload['recipients'][$i]['address'] = $this->toAddressObject($payload['recipients'][$i]['address']); } - //If there's a list of BCC recipients, loop through them. - if(isset($bccList)){ - foreach ($bccList as $bccRecipient) { - $newRecipient = [ - 'address' => $bccRecipient['address'], - 'header_to' => $originalRecipient, - ]; - array_push($recipientsList, $newRecipient); - } + return $payload; + } + + private function addListToRecipients($payload, $listName) + { + $originalAddress = $this->toAddressString($payload['recipients'][0]['address']); + foreach ($payload[$listName] as $recipient) { + $recipient['address'] = $this->toAddressObject($recipient['address']); + $recipient['address']['header_to'] = $originalAddress; + + array_push($payload['recipients'], $recipient); } - //Delete the original BCC object from the payload. - unset($modifiedPayload['bcc']); + //Delete the original object from the payload. + unset($payload[$listName]); - return $modifiedPayload; + return $payload; } - public function fixCarbonCopy($payload) + private function toAddressObject($address) { - $ccRecipients = array(); - $modifiedPayload = $payload; - $ccList = &$modifiedPayload['cc']; - $recipientsList = &$modifiedPayload['recipients']; - - //If a name exists, then use format "name" <email>. Otherwise, use format <email> - if(isset($modifiedPayload['recipients'][0]['name'])) { - $originalRecipient = '"' . $modifiedPayload['recipients'][0]['name'] - . '" <' . $modifiedPayload['recipients'][0]['address'] . '>'; - } else { - $originalRecipient = $modifiedPayload['recipients'][0]['address']; - } - - if(isset($ccList)){ - foreach ($ccList as $ccRecipient) { - $newRecipient = [ - 'address' => $ccRecipient['address'], - 'header_to' => $originalRecipient, - ]; - //if name exists, then use "Name" <Email> format. Otherwise, just email will suffice. - if(is_array($ccRecipient['address'])) { - $ccRecipientData = ' "' . $ccRecipient['address']['name'] - . '" ' . '<' . $ccRecipient['address']['email'] . '>'; - - } else { - $ccRecipientData = $ccRecipient['address']; - } - array_push($ccRecipients, $ccRecipientData); - array_push($recipientsList, $newRecipient); - } + $return = $address; + if (is_string($address)) { + $return = []; - if(!empty($ccRecipients)){ //If there are CC'd people - $this->customHeaders = array("CC" => implode(',', $ccRecipients)); + if ($this->isEmail($address)) { + $return['email'] = $address; } - - //create new object 'headers' under content - $content = &$modifiedPayload['content']; - $content['headers'] = $this->customHeaders; - + else if(preg_match('/"?(.[^"]+)"?\s*<(.+)>/', $address, $matches)) { + $name = trim($matches[1]); + $return['name'] = $matches[1]; + $return['email'] = $matches[2]; + } + else { + throw \Exception('Invalid address format: '.$address); + } + } - - //delete CC - unset($modifiedPayload['cc']); - - return $modifiedPayload; + + return $return; } - public function post($payload) + private function toAddressString($address) { - $modifiedPayload = $this->fixBlindCarbonCopy($payload); //Fixes BCCs into payload - $modifiedPayload = $this->fixCarbonCopy($modifiedPayload); //Fixes CCs into payload - $modifiedPayload = $this->fixShorthandRecipients($modifiedPayload); //Fixes shorthand recipients format - return parent::post($modifiedPayload, $this->customHeaders); + // convert object to string + if(!is_string($address)) { + //if a name exists, then use format "name" <email>. Otherwise, just use format <email> + $address = (isset($address['name']) ? '"' . $address['name'] + . '" ' : '') . '<' . $address['email'] . '>'; + } + + return $address; + } + + private function isEmail($email){ + if(filter_var($email, FILTER_VALIDATE_EMAIL)){ + return true; + } else { + return false; + } } } |