2011-03-16 20 views
6

Estoy analizando correos electrónicos con Zend_Mail, y extrañamente parte del contenido se trunca sin una razón obvia y deforma las partes del correo electrónico.cadena codificada en base64 se trunca a través de la llamada fgets al analizar IMAP

Por ejemplo

Content-Disposition: attachment; filename="file.sdv" 

DQogICAgICBTT05FO0xBTkRJTkdTREE7U0FMR1NEQVRPIDtOQVNKIDtSRURTS0FQICAgICAgICAg 
ICAgIDsgRklTS0VTTEFHO1BSRVNFUlYgICA7ICBUSUxTVEFORDsgU1TYUlJFTFNFOyAgS1ZBTElU 
RVQ7T01TVFlQRSAgO01JTlNURVBSSVM7ICAgICBWRVJESTsgICBLVkFOVFVNOyAgUlVORFZFS1Qg 
IA0KLS0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS07LS0tLS0tLS0tLS0tLS0t 
LS0tLS07LS0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS0tLS0tLTstLS0tLS0t 
LS0tOy0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS0tLS0tLTstLS0tLS0tLS0t 
ICANCiAgICAgICAgIDA7MjAxMC4wOS4wODsyMDEwLjA5LjA4O05vcnNrO0dhcm4gICAgICAgICAg 
ICAgICAgOyAgICAgIDEwMjE7RkVSU0sgICAgIDsgICAgICAgMjEwOyAgIDQwMjA5OTk7ICAgICAg 
ICAyMDtFZ2Vub3ZlcnQ7ICAgICAgICAgIDsgICAzMDcyLDE2OyAgICAgICAyMTE7ICAgICAyNTMs 
MiAgDQogICAgICAgICAwOzIwMTAuMDkuMDg7MjAxMC4wOS4wODtOb3JzaztHYXJuICAgICAgICAg 

se trunca a

Content-Disposition: attachment; filename="file.sdv" 

DQogICAgICBTT05FO0xBTkRJTkdTREE7U0FMR1NEQVRPIDtOQVNKIDtSRURTS0FQICAgICAgICAg 
ICAgIDsgRklTS0VTTEFHO1BSRVNFUlYgICA7ICBUSUxTVEFORDsgU1TYUlJFTFNFOyAgS1ZBTElU 
RVQ7T01TVFlQRSAgO01JTlNURVBSSVM7ICAgICBWRVJESTsgICBLVkFOVFVNOyAgUlVORFZFS1Qg 
IA0KLS0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS07LS0tLS0tLS0tLS0tLS0t 
LS0tLS07LS0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS0tLS0tLTstLS0tLS0t 
LS 

un var_dump en cada línea muestra esto.

string(78) "DQogICAgICBTT05FO0xBTkRJTkdTREE7U0FMR1NEQVRPIDtOQVNKIDtSRURTS0FQICAgICAgICAg 
" 
string(78) "ICAgIDsgRklTS0VTTEFHO1BSRVNFUlYgICA7ICBUSUxTVEFORDsgU1TYUlJFTFNFOyAgS1ZBTElU 
" 
string(78) "RVQ7T01TVFlQRSAgO01JTlNURVBSSVM7ICAgICBWRVJESTsgICBLVkFOVFVNOyAgUlVORFZFS1Qg 
" 
string(78) "IA0KLS0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS07LS0tLS0tLS0tLS0tLS0t 
" 
string(78) "LS0tLS07LS0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS0tLS0tLTstLS0tLS0t 
" 
string(5) "LS) 
" 
string(17) "TAG5 OK Success 
"  

o en otro correo electrónico a

DQogICAgICBTT05FO0xBTkRJTkdTREE7U0FMR1NEQVRPIDtOQVNKIDtSRURTS0FQICAgICAgICAg 
ICAgIDsgRklTS0VTTEFHO1BSRVNFUlYgICA7ICBUSUxTVEFORDsgU1TYUlJFTFNFOyAgS1ZBTElU 
RVQ7T01TVFlQRSAgO01JTlNURVBSSVM7ICAgICBWRVJESTsgICBLVkFOVFVNOyAgUlVORFZFS1Qg 
IA0KLS0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS07LS0tLS0tLS0tLS0tLS0t 
LS0tLS07LS0tLS0tLS0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS0tLS0tLTstLS0tLS0t 
LS0tOy0tLS0tLS0tLTstLS0tLS0tLS0tO 

No puedo entender por qué está parando allí. Las transiciones deberían haberse detenido solo al final de la línea. Esta es la línea que obtiene la cadena del servidor IMAP.

$line = @fgets($this->_socket); 

El texto codificado contiene una cadena como, pero de nuevo esto se trunca en varias partes en diferentes correos electrónicos.

----------;----------;----------;-----;--------------------;----------;----------;-- 

He intentado agregar un tamaño a fgets() pero a ningún resultado. También habilité/deshabilité la opción "auto_detect_line_endings" php_ini, nuevamente sin resultado.

También abrí un bug report con ZF aunque el error no parece estar en la biblioteca.

¿Ve algo extraño con esta cadena codificada?

ACTUALIZACIÓN

nueva investigación demuestra que los correos electrónicos se trunca después de 584 caracteres. Todavía no sé por qué. También envió una pregunta a google. Ver here.

A los encabezados de correo electrónico: Mala

Delivered-To: [email protected] 
Received: by 10.216.3.208 with SMTP id 58cs248812weh; 
    Fri, 20 Nov 2009 05:14:14 -0800 (PST) 
Received: by 10.204.153.217 with SMTP id l25mr1285471bkw.108.1258722853863; 
    Fri, 20 Nov 2009 05:14:13 -0800 (PST) 
Return-Path: <> 
Received: from MTX4.mbn1.net (mtx4.mbn1.net [213.188.129.252]) 
    by mx.google.com with SMTP id 2si1800716bwz.60.2009.11.20.05.14.12; 
    Fri, 20 Nov 2009 05:14:13 -0800 (PST) 
Received-SPF: pass (google.com: best guess record for domain of MTX4.mbn1.net designates   213.188.129.252 as permitted sender) client-ip=213.188.129.252; 
Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of MTX4.mbn1.net designates 213.188.129.252 as permitted sender) smtp.mail= 
Resent-From: <[email protected]> 
Content-Type: multipart/mixed; boundary="===============1703099044==" 
MIME-Version: 1.0 
From: <[email protected]> 
To: <[email protected]> 
CC: 
Subject: some subject 
Message-ID: <[email protected]> 
X-OriginalArrivalTime: 20 Nov 2009 13:14:08.0121 (UTC) FILETIME=[5792C690:01CA69E3] 
Date: Fri, 20 Nov 2009 14:14:08 +0100 
X-STA-Metric: 0 (engine=030) 
X-STA-NotSpam: tlf: vedlagt skip:__ 40 fil cc:2**0 
X-STA-Spam: header:MIME-Version: charset:us-ascii header:Subject:1 to:2**0 header:From:1 
X-BTI-AntiSpam: score:0,sta:0/030,dnsbl:passed,sw:off,bsn:38/passed,spf:off,bsctr:passed/1,dk:off,pbmf:none,ipr:0/3,trusted:no,ts:no,bs:no,ubl:passed 
X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply 
Resent-Message-Id: <[email protected]> 
Resent-Date: Fri, 20 Nov 2009 14:14:11 +0100 (CET) 

--===============1703099044== 
Content-Type: application/octet-stream 
MIME-Version: 1.0 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; filename="file.sdv" 

DQpHUlVQUEVOQVZOICAgICAgICAgIDtLSthQRTtQUk9EQU5MO1BBS0tFTlI7TU9UVEFLTkFWTiAg 
ICAgICAgICAgICAgICAgICAgO1NPTjtMQU5ESU5HU0RBO1NBTEdTREFUTyA7TkFTSiA7UkVEU0tB 
UCAgIDtGSVNLRVNMQUcgO1BSRVNFUlYgICA7VElMU1RBTkQ7U1TYUlJFTFM7S1ZBTElURVQ7TUlO 
U1RFUFJJUzsgICAgICAgIFZFUkRJOyAgICAgS1ZBTlRVTTsgICAgUlVORFZFS1QgICAgDQotLS0t 
LS0tLS0tLS0tLS0tLS0tLTstLS0tLTstLS0tLS0tOy0tLS0tLS07LS0tLS0tLS0tLS0tLS0tLS0t 
LS0tLS0tLS0tLS0tOy0tLTstLS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS07LS0tLS0tLS0tLTst 
LS0tLS0tLS0tOy0tLS0tLS0tLS07LS0tLS0tLS07LS0tLS0tLS07LS0tLS0tLS07LS0tLS0tLS0t 
LTstLS0tLS0tLS0tLS0tOy0tLS0tLS0tLS0tLTstLS0tLS0tLS0tLS0gICAgDQpMb3JlbnR6ZW4g 
.... 

Para aquellos interesados ​​en una respuesta y no en el (ex) de recompensas, más pistas.

Gmail is returning a short value in response to RFC822.SIZE, which can lead to truncated messages. (They are off by one byte for each header line, apparently not counting two characters for CR/LF.)

+0

¿Por qué quieres leerlo en línea de todos modos? – mario

+0

@mario No lo leo, Zend Framework lo hace en Zend_Mail_Protocol_Imap. No están utilizando las funciones imap y tratan el imap como una secuencia, probablemente para evitar una dependencia de la biblioteca. –

+0

Puede eliminar el operador de supresión de errores '@' para realizar pruebas. Tal vez aparezca un aviso de error más concluyente. – mario

Respuesta

5

Creo que está buscando en el lugar equivocado.

El servidor imap le da el mensaje de correo truncado, y luego devuelve su línea de estado TAG5 OK Success.

No veo cómo su manejo del zócalo (/ php) haría desaparecer unos pocos kb de flujo, para arreglar mágicamente el flujo justo antes de esta línea de estado.

Entonces, o el mensaje se trunca solo (¿ha verificado el contenido del mensaje de otra forma?) O el servidor imap simplemente se ha roto.

Las primeras cosas que haría, son:

  • encuentran un ambiente suficientemente silenciosa para poner su proyecto, donde se puede proceso strace -f -s 10240 -p <pid> de Apache para verificar la interacción zócalo (suponiendo un entorno Linux/Apache)
  • y/o: utilizar tcpdump, ethereal o equivalente para comprobar lo que viene en la línea

Mi conjetura es que se pueden ver exactamente las mismas secuencias truncadas que entra en el cable. Lo que significa que puedes cambiar tu enfoque al servidor imap.

Asegúrate de que estás buscando en el lugar correcto, puede ahorrar mucho tiempo.

+0

¿No le pregunté lo mismo? ¿Por qué obtuviste la recompensa? – Bytemain

+0

la recompensa se otorgó por defecto para la respuesta más votado –

0

Ha intentado adoptar otras fgets y ver si le da el resto de los datos? Es posible que esté recuperando un correo electrónico de varias partes que requeriría varias solicitudes.

Pero, independientemente, está utilizando funciones diseñadas para acceso a archivos en una red. Por lo general, esto funciona bien, pero dependiendo de la red, pueden surgir problemas. Por ejemplo, puede usar file_get_contents para recuperar una página web. Pero si el problema genera una redirección, falla. Pero usar curl será mucho más exitoso.

Si realmente desea leer el zócalo de la red, usted debe tratar socket_read. Eso está diseñado con la red en mente, como curl.

+0

uno de los elementos se ejecuta en cada línea en la función _nextLine. http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Mail/Protocol/Imap.php Como he dicho, esto no es un error de marco, la mayoría de las veces los correos electrónicos están pasando. –

0

No sabe Zend y olvidó por completo de PHP, pero juega con MIME y HTTP antes (C++).

Sugiero que empiece a buscar la forma de agregar un Content-Length entrada de encabezado. Da una pista al "decodificador/cargador de mensajes" para esperar un cierto tamaño en el contenido (carga útil del mensaje). (No estoy seguro de si IMAP lo hace)

En el código anterior trataría de convencer a los expertos para que lean una cantidad específica de datos esperados de la red. Podría ser que los datos estén almacenados en un búfer o que aún no se envíen a través de la red (comunicación asíncrona) y que solo lea un búfer interno deteniéndose así antes de que se haya leído todo el mensaje.

  • Para ver si este es el caso, envíe un pequeño mensaje que caiga dentro de su "punto de ruptura 584".
  • Haga una red rastreando el ver si realmente fluyen todos los datos. (Probablemente necesite hacer alguna configuración local)

El código al que se refiere es here?

+0

¿No hay límite en el tamaño de la memoria que puede usar una sesión de php? Supongo que se habría impreso un error ... ¿no? –

+0

sí, este es el código. ver la función _nextLine(). los errores con el parámetro de longitud no hicieron diferencia, fue lo primero que se intentó probar. es bastante difícil hacer una configuración local que simule correctamente gmail. Además, sucede al azar. Comprobaré el lunes el encabezado de la longitud del contenido y te lo haré saber. No revisé este encabezado en particular, porque los encabezados eran idénticos para un correo electrónico bueno y malo, en términos de qué encabezados estaban presentes. –

+0

Hmmm ... si solo estamos hablando de IMAP aquí, el encabezado podría no ser de ayuda. No intenté analizar el código aún para ver si esta implementación realmente depende del encabezado. Una sugerencia es tratar de obtener un servidor IMAP local y luego hacer algunas comparaciones. Mi idea para verificar el encabezado es formar un ciclo que lea hasta que se lea el tamaño esperado o llegue a un tiempo de espera ... para ayudar a "borrar el búfer de red". –

0

Lo más probable es que uno de los hardware de su servidor esté en peligro y, por lo tanto, desee cambiarlo por completo o simplemente cambiar los módulos de memoria RAM o los discos duros. Tengo cierta experiencia con la codificación basada en web y correo y puedo confirmar que la cadena codificada en base64 es muy segura. Al menos usa un algoritmo de mapeo de texturas.

+1

mi hardware de servidor? es decir, servidores de Gmail? –

+0

Me has perdido pero uso Gmail e IMAP todo el tiempo y no tengo ningún problema. – Bytemain

+0

Solo una pregunta: ¿se permite la extensión file.sdv con googlemail? De ser así, ¿puedes estar seguro de que los correos electrónicos no son spam? – Bytemain

2

1: intente eliminar el @ para más verbosidad

2: tratar de usar http://www.php.net/manual/en/function.fread.php en lugar de fgets

Esto podría tener algo que ver con el servidor IMAP, porque veo TAG5 OK Success como respuesta, incluso si no se supone que esté allí.

+0

intenté ambos y lo mismo. fgets es binario seguro también. Supongo lo mismo sobre el servidor, pero ¿qué puedo hacer para evitarlo? No puedo depurar Gmail ... esta es la pregunta de 300 puntos. –

Cuestiones relacionadas