2013-06-13 8 views
2

Я пытаюсь изменить статус фильтра для подписки на подписку с помощью sendgrid. Я думаю, что я отправляю заголовки неправильно, но не полностью уверен. Работа внутри рамки symfony 1.4.Заголовки кодировки JSON, использующие Sendgrid

Сначала я создаю объект настройки заголовка

$hdr = new SmtpApiHeader(); 
$hdr->addFilterSetting('subscriptiontrack', 'enable', 0); 
$hdr->as_string(); 

, который устанавливает параметры фильтра и кодирует строку

Затем я отправить его класс по электронной почте

sendTestEmail::sendEmail($contents, $mailFrom, $testGroup, $subject, $hdr); 

SvaSmtpApiHeader.class.php

class SmtpApiHeader 
{ 
function addFilterSetting($filter, $setting, $value) 
    { 
     if (!isset($this->data['filters'])) { 
      $this->data['filters'] = array(); 
     } 

     if (!isset($this->data['filters'][$filter])) { 
      $this->data['filters'][$filter] = array(); 
     } 

     if (!isset($this->data['filters'][$filter]['settings'])) { 
      $this->data['filters'][$filter]['settings'] = array(); 
     } 
     $this->data['filters'][$filter]['settings'][$setting] = $value; 
    } 

    function asJSON() 
    { 
     $json = json_encode($this->data); 
     // Add spaces so that the field can be folded 
     $json = preg_replace('/(["\]}])([,:])(["\[{])/', '$1$2 $3', $json); 
     return $json; 
    } 

    function as_string() 
    { 
     $json = $this->asJSON(); 
     $str = "X-SMTPAPI: " . wordwrap($json, 76, "\n "); 
     return $str; 
    } 
} 

myEmail.class.php

<?php 
class sendTestEmail 
{ 

    public static function sendEmail($contents, $mailFrom, $mailTo, $subject, $sgHeaders = null, $attachments = null) 
    { 

     try { 
      /* 
      * Load connection for mailer 
      */ 
      $connection = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 465, 'ssl')->setUsername(sfconfig::get('app_sendgrid_username'))->setPassword(sfconfig::get('app_sendgrid_password')); 

      // setup connection/content 
      $mailer = Swift_Mailer::newInstance($connection); 
      $message = Swift_Message::newInstance()->setSubject($subject)->setTo($mailTo); 

      $message->setBody($contents, 'text/html'); 

      // if contains SMTPAPI header add it 
      if (null !== $sgHeaders) { 
       $message->getHeaders()->addTextHeader('X-SMTPAPI', $sgHeaders); 
      } 

      // update the from address line to include an actual name 
      if (is_array($mailFrom) and count($mailFrom) == 2) { 
       $mailFrom = array(
        $mailFrom['email'] => $mailFrom['name'] 
       ); 
      } 

      // add attachments to email 
      if ($attachments !== null and is_array($attachments)) { 
       foreach ($attachments as $attachment) { 
        $attach = Swift_Attachment::fromPath($attachment['file'], $attachment['mime'])->setFilename($attachment['filename']); 
        $message->attach($attach); 
       } 
      } 

      // Send 
      $message->setFrom($mailFrom); 
      $mailer->send($message); 
     } 
     catch (Exception $e) { 
      throw new sfException('Error sending email out - ' . $e->getMessage()); 
     } 
    } 
} 

Сообщение электронной почты послана правильно, но отказаться от подписки вариант все еще показывает на дне. Это проблема с объектом заголовка или с проблемой кодирования для заголовка? Является ли переменная по-прежнему объектом при добавлении в заголовки?

ответ

2

Вы неправильно понимаете, как работает кодировка JSON. Давайте посмотрим на ваш as_string метод:

function as_string() 
{ 
    $json = $this->asJSON(); 
    $str = "X-SMTPAPI: " . wordwrap($json, 76, "\n "); 
    return $str; 
} 

что выдаст что-то эффект:

X-SMTPAPI: { "filters": { "subscriptiontrack": { "settings": { "enable": 0 } } } } 

Следует отметить, что это не является допустимым JSON, потому что с префиксом «X -SMTPAPI ". Вместо этого вы должны звонить asJSON, но SwiftMailer этого не знает.

Попробуйте переключить строку заголовка на:

$message->getHeaders()->addTextHeader('X-SMTPAPI', $sgHeaders->asJSON()); 

Если это не работает, вы можете дать нам дамп:

$headers = $message->getHeaders(); 
echo $headers->toString(); 

А вы думали об использовании официальная библиотека PHP вместо этого? https://github.com/sendgrid/sendgrid-php

+0

Это получилось. Я смущен, однако, поскольку это противоречит документам Sendgrid, я думаю: http://sendgrid.com/docs/Code_Examples/SMTP_API_Header_Examples/php.html –

+0

На самом деле это не просто образец, который выгружает строчную версию того, что вы построили, чтобы вы могли прочитать его. – Swift

+0

получил. Я строчил его, делая его недействительным. –

Смежные вопросы