Я пытаюсь изменить статус фильтра для '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()); } } }
Письмо отправляется правильно, но опция отмены подписки по-прежнему отображается внизу. Это проблема с объектом заголовка или с проблемой кодирования для заголовка? Является ли переменная по-прежнему объектом при добавлении в заголовки?
Вы неправильно понимаете, как работает 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