summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/SparkPost/SparkPost.php2
-rw-r--r--lib/SparkPost/Transmission.php210
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;
+ }
}
}