(Dado que esta es mi primera pregunta SO, permítanme decir que espero que no sea tan específica de Zend. Por lo que puedo decir, esto no debería ser un problema. Aunque podría haberlo publicado en un foro específico de Zend, siento que al menos es probable que obtenga una buena respuesta aquí, especialmente dado que la respuesta podría incluir problemas relacionados con MIME que trascienden Zend Framework. m, básicamente, tratando de entender si el problema que estoy enfrentando debe considerarse un error ZF, o si estoy malentendido algo o mal uso de ella.)No entiendo por qué Zend_Mail :: addHeader() elimina las nuevas líneas
he estado usando Zend_Mail para construir un mensaje MIME que se enviado a través de SendGrid, un servicio de distribución de correo electrónico. Su plataforma le permite enviar correos electrónicos a través de su servidor SMTP, pero brinda funciones adicionales cuando usa un encabezado especial (X-SMTPAPI) cuyo valor es una cadena codificada JSON de parámetros de propiedad, que puede ser bastante larga.
Finalmente, el encabezado que estaba pasando se hizo demasiado largo (creo que> 1000 caracteres) y obtuve errores. Estaba confundido porque sabía que se estaba pasando a través de la función wordwrap() nativa de PHP antes de pasar el valor a Zend_Mail :: addHeader(), así que pensé que la longitud de la línea nunca debería ser un problema.
Resulta que addHeader() elimina nuevas líneas muy deliberadamente, y sin ninguna explicación particular a modo de comentarios.
// In Zend_Mail::addHeader()
$value = $this->_filterOther($value);
// In Zend_Mail::_filterOther()
$rule = array("\r" => '',
"\n" => '',
"\t" => '',
);
return strtr($data, $rule);
Ok, esto parecía razonable al principio - tal vez ZF quiere un control total del formateo y del ajuste de línea. El siguiente método llamado en Zend_Mail :: addHeader() es
$value = $this->_encodeHeader($value);
Este método codifica el valor (ya sea citado imprimible o base64 según corresponda) y trozos en líneas de longitud apropiada, pero solamente si contiene "caracteres no imprimibles", según lo determinado por Zend_Mime :: isPrintable ($ value).
Al examinar ese método, las líneas nuevas (\ n) se consideran, de hecho, caracteres no imprimibles. Así que si no hubieran sido eliminados de la cadena en la llamada al método anterior, el encabezado largo se codificaría como QP y se fragmentaría en líneas de 72 caracteres, y todo funcionaría bien. De hecho, hice una prueba donde comenté la llamada a _filterOther(), y el encabezado largo se codifica y se procesa sin problemas. Pero ahora acabo de hacer un truco descuidado de ZF sin entender realmente el propósito detrás de la línea que eliminé, por lo que esta no puede ser una solución a largo plazo.
Mi solución a medio plazo ha sido extender Zend_Mail y crear un nuevo método, addHeaderForceEncode(), que siempre codificará el valor del encabezado y, por lo tanto, siempre lo dividirá en líneas cortas. Pero todavía no estoy satisfecho porque no entiendo por qué esa llamada de _filterOther() fue necesaria en primer lugar, tal vez no debería estar trabajando en absoluto.
¿Alguien me puede explicar por qué existe este comportamiento de eliminar las nuevas líneas? Parece conducir inevitablemente a situaciones en las que un encabezado puede ser demasiado largo si no contiene ningún "carácter no imprimible" que no sean líneas nuevas.
He realizado varias búsquedas diferentes sobre este tema y he examinado algunos informes de fallas ZF, pero no he visto a nadie hablar de esto. Sorprendentemente, parece ser un problema realmente oscuro. FYI Estoy trabajando con ZF 1.11.11.
Actualización: En caso de que alguien quiere seguir el tema ZF abrí sobre esto, aquí está: Zend_Mail::addHeader() UNfolds long headers, then throws exception
StackOverflow puede responder todo;) +1 Para su primera pregunta aquí. – Flavius
Gracias por hacerme sentir bienvenido. – LinusR