/** * @param Message $message * @param DateTime|null $sendAt * @throws Exception\RuntimeException * @return array */ private function parseMessage(Message $message, DateTime $sendAt = null) { $hasTemplate = $message instanceof MandrillMessage && null !== $message->getTemplate(); $from = $message->getFrom(); if ($hasTemplate && count($from) > 1 || !$hasTemplate && count($from) !== 1) { throw new Exception\RuntimeException('Mandrill API requires exactly one from sender (or none if send with a template)'); } $from = $from->rewind(); $parameters['message'] = array('subject' => $message->getSubject(), 'text' => $this->extractText($message), 'html' => $this->extractHtml($message), 'from_email' => $from ? $from->getEmail() : '', 'from_name' => $from ? $from->getName() : ''); foreach ($message->getTo() as $to) { $parameters['message']['to'][] = array('email' => $to->getEmail(), 'name' => $to->getName(), 'type' => 'to'); } foreach ($message->getCc() as $cc) { $parameters['message']['to'][] = array('email' => $cc->getEmail(), 'name' => $cc->getName(), 'type' => 'cc'); } foreach ($message->getBcc() as $bcc) { $parameters['message']['to'][] = array('email' => $bcc->getEmail(), 'name' => $bcc->getName(), 'type' => 'bcc'); } $replyTo = $message->getReplyTo(); if (count($replyTo) > 1) { throw new Exception\RuntimeException('Mandrill has only support for one Reply-To address'); } elseif (count($replyTo)) { $parameters['message']['headers']['Reply-To'] = $replyTo->rewind()->toString(); } if ($message instanceof MandrillMessage) { if ($hasTemplate) { $parameters['template_name'] = $message->getTemplate(); foreach ($message->getTemplateContent() as $key => $value) { $parameters['template_content'][] = array('name' => $key, 'content' => $value); } // Currently, Mandrill API requires a content for template_content, even if it is an // empty array if (!isset($parameters['template_content'])) { $parameters['template_content'] = array(); } } foreach ($message->getGlobalVariables() as $key => $value) { $parameters['message']['global_merge_vars'][] = array('name' => $key, 'content' => $value); } foreach ($message->getVariables() as $recipient => $variables) { $recipientVariables = array(); foreach ($variables as $key => $value) { $recipientVariables[] = array('name' => $key, 'content' => $value); } $parameters['message']['merge_vars'][] = array('rcpt' => $recipient, 'vars' => $recipientVariables); } $parameters['message']['metadata'] = $message->getGlobalMetadata(); foreach ($message->getMetadata() as $recipient => $variables) { $parameters['message']['recipient_metadata'][] = array('rcpt' => $recipient, 'values' => $variables); } foreach ($message->getOptions() as $key => $value) { $parameters['message'][$key] = $value; } foreach ($message->getTags() as $tag) { $parameters['message']['tags'][] = $tag; } foreach ($message->getImages() as $image) { $parameters['message']['images'][] = array('type' => $image->type, 'name' => $image->filename, 'content' => base64_encode($image->getRawContent())); } } $attachments = $this->extractAttachments($message); foreach ($attachments as $attachment) { $parameters['message']['attachments'][] = array('type' => $attachment->type, 'name' => $attachment->filename, 'content' => base64_encode($attachment->getRawContent())); } if (null !== $sendAt) { // Mandrill needs to have date in UTC, using this format $sendAt->setTimezone(new DateTimeZone('UTC')); $parameters['send_at'] = $sendAt->format('Y-m-d H:i:s'); } return $parameters; }