Заголовки кодировки JSON с использованием Sendgrid

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

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

$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()); } } } 

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

Solutions Collecting From Web of "Заголовки кодировки JSON с использованием Sendgrid"

Вы неправильно понимаете, как работает 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