Не могу понять, почему Zend_Mail :: addHeader () удаляет символы новой строки

(Поскольку это мой первый вопрос SO, позвольте мне просто сказать, что я надеюсь, что он не слишком специфичен для Zend. Я могу сказать, что это не должно быть проблемой. Хотя я мог бы опубликовать его на форуме, посвященном Zend, мне кажется, что я, по крайней мере, с такой же вероятностью получу здесь хороший ответ, тем более что ответ может касаться MIME проблемы, выходящие за рамки Zend Framework. Я в основном пытаюсь понять, следует ли считать проблему, с которой я сталкиваюсь, ошибкой ZF, или я что-то неправильно понимаю или неправильно ее использую.)

Я использовал Zend_Mail для сборки сообщение MIME, которое отправляется через SendGrid, службу рассылки электронной почты. Их платформа позволяет отправлять электронные письма через их SMTP-сервер, но предоставляет дополнительные функции, когда y Вы можете использовать специальный заголовок (X-SMTPAPI), значение которого представляет собой строку проприетарных параметров в кодировке JSON, которая может быть довольно длинной.

В конце концов, заголовок, который я передавал, стал слишком длинным (я думаю,> 1000 символов), и я получил ошибки. Я был сбит с толку, потому что знал, что он передается через встроенную функцию wordwrap () PHP, прежде чем я передал значение Zend_Mail :: addHeader (), поэтому я подумал, что длина строки никогда не должна быть проблемой.

Оказывается, addHeader () удаляет символы новой строки очень сознательно и без каких-либо пояснений в виде комментариев.

// In Zend_Mail::addHeader()
$value = $this->_filterOther($value);


// In Zend_Mail::_filterOther()
$rule = array("\r" => '',
              "\n" => '',
              "\t" => '',
);
return strtr($data, $rule);

Хорошо, сначала это казалось разумным - возможно, ZF хочет полный контроль над форматированием и переносом строк. Следующий метод, вызываемый в Zend_Mail :: addHeader (), -

$value = $this->_encodeHeader($value);

. Этот метод кодирует значение (либо в кавычках, либо в base64, в зависимости от ситуации) и разбивает его на строки соответствующей длины, но только , если оно содержит «непечатаемые символы», как определено Zend_Mime :: isPrintable ($ value).

Если посмотреть на этот метод, новые строки (\ n) действительно считаются непечатаемыми символами! Так что, если бы только они не были удалены из строки в предыдущем вызове метода, длинный заголовок был бы закодирован как QP и разбит на строки из 72 символов, и все было бы нормально. Фактически, я провел тест, в котором закомментировал вызов _filterOther (), и длинный заголовок кодируется и проходит без проблем. Но теперь я только что небрежно взломал ZF, не понимая цели удаленной строчки, так что это не может быть долгосрочным решением.

Моим среднесрочным решением было расширение Zend_Mail и создание нового метода addHeaderForceEncode (), который всегда будет кодировать значение заголовка и, следовательно, всегда разбивать его на короткие строки. Но я все еще не удовлетворен, потому что я не понимаю, почему этот вызов _filterOther () был необходим в первую очередь - возможно, мне вообще не следует работать над этим.

Может ли кто-нибудь объяснить мне, почему существует такое поведение удаления новых строк? Кажется, что это неизбежно приводит к ситуациям, когда заголовок может стать слишком длинным, если он не содержит никаких «непечатаемых символов», кроме символов новой строки.

Я провел кучу различных поисков по этой теме и просмотрел несколько отчетов об ошибках ZF, но не видел, чтобы кто-нибудь говорил об этом. Удивительно, но это действительно непонятная проблема. К вашему сведению, я работаю с ZF 1.11.11.


Обновление: Если кто-то хочет следить за проблемой ZF, которую я открыл по этому поводу, вот она: Zend_Mail :: addHeader () разворачивает длинные заголовки, а затем выдает исключение

8
задан LinusR 8 January 2012 в 05:35
поделиться