2011-01-18 879 views
6

estoy frente a un problema decodificar un mail con el asunto:javax.mail - problema de decodificación sujeto

Asunto: = ISO-8859-1 Q Re: Re: Re: Desvío ??? : (GI = = ISO-8859-1 Q Support-Id:???? 11.729)? =

JavaMail decodifica como:??

= ISO-8859-1 Q ? Re: Re: Re: Fwd: (¿GI? = Support-Id: 11729)

¿es esto un tema válido en absoluto? o debería javamail ser capaz de leer esto?

respecto

Respuesta

6

Está mal formado. You're not permitted to have whitespace characters in the middle of an RFC 2047 encoded-word, y por lo tanto, JavaMail deja de intentar decodificar el Sujeto cuando golpea un espacio antes de que llegue al terminal ?=. La mayoría de los analizadores sintácticos serán flexibles sobre este tipo de cosas, dado que muchos mensajes están mal formados de esta manera, pero JavaMail es un poco demasiado estricto en este aspecto. No es mal, pero definitivamente no es "ser liberal en lo que acepta". Esto es lo que el RFC tiene que decir:

IMPORTANTE: 'de palabra codificada están diseñados para ser reconocido como' átomo de por un RFC 822 analizador. Como consecuencia, los caracteres de espacio en blanco no codificado (como ESPACIO y HTAB) están PROHIBIDOS en 'palabra-codificada'. Por ejemplo, la secuencia de caracteres

=?iso-8859-1?q?this is some text?= 

se analiza como cuatro 'de átomo, más que como un único 'átomo'(por un RFC 822 analizador) o 'palabra codificada'(por un analizador que comprende 'palabras codificadas'). La forma correcta de codificar la cadena "this is some text" es codificar los caracteres SPACE también, p.

=?iso-8859-1?q?this=20is=20some=20text?= 

podría reemplazar todos los espacios de allí con el carácter de subrayado, pero que puede causar problemas porque tendrías que escribir su propio programa de análisis con el fin de saber cuándo hay que hacerlo.

También podría intentar establecer la propiedad del sistema mail.mime.decodetext.strict en false, pero una mirada superficial al código de JavaMail parece que no ayudará. (Aún así vale la pena probar, sin embargo.)

+0

@Cancer Lee: escribe "Probé la sugerencia, funciona". Así que dale una oportunidad a 'mail.mime.decodetext.strict'. – dkarp

2

¿Has llamado a javax.mail.internet.MimeUtility decodeText sobre el tema?

+1

'MimeMessage.getSubject()' hace eso automáticamente. – dkarp

+0

dkarp, tienes razón, pero no tenemos información sobre qué método utilizó Gerhard. – andcoz

+0

Verifique su ejemplo. La palabra codificada bien formada se decodifica y la malformada no. O se llama 'MimeUtility.decodeText()' o se llama 'MimeMessage.getSubject() ', pero en cualquier caso otra llamada a' decodeText' no va a ayudar. – dkarp

0

edición: sorrry esta respuesta es una basura completa, hay dos clases de nuestros proyectos, imlpemeting también MimeUtility y más, haciendo cosas mucho más horrible. ¡Lo siento!

+1

MimeUtiliy en qué paquete? No hay tal método en javax.mail –