2009-01-18 12 views
22

Estoy tratando de usar el siguiente código para enviar mensajes a través de System.Net.Mail y soy veces obteniendo temas como '=? Utf- 8? B? W3AxM25dIEZpbGV ... '(recortado). Este es el código que se llama:System.Net.Mail y =? Utf-8? B? XXXXX .... Encabezados

MailMessage message = new MailMessage() 
{ 
    From = new MailAddress("[email protected]", "Service"), 
    BodyEncoding = Encoding.UTF8, 
    Body = body, 
    IsBodyHtml = true, 
    ReplyTo = new MailAddress("[email protected]"), 
    SubjectEncoding = Encoding.UTF8 
}; 

foreach (string emailAddress in addresses) 
{ 
    message.To.Add(new MailAddress(emailAddress.Trim(), "Person")); 
} 

message.Subject = subject; 

Me gustaría enfatizar que esto no ocurre todo el tiempo.

¿Qué estoy haciendo mal?

Respuesta

33

Cuando su sujeto contiene caracteres fuera del rango ASCII, entonces el software de correo debe codificarlos (el correo RFC2822 no permite caracteres que no sean ASCII en los encabezados). Hay dos maneras de hacer esto:

  • citado imprimible (sujeto comienza con "= UTF-8 Q?")
  • base 64 (sujeto comienza con "= UTF-8 B??")

Parece que el marco ha calculado que la codificación Base64 es más eficiente (= más corta) que la codificación imprimible entre comillas. Esto tiene sentido cuando su tema contiene muchos caracteres fuera del rango ASCII.

Para responder a su pregunta: No está haciendo nada incorrecto. Así es como se supone que se ve el correo de internet con caracteres que no son ASCII. Por supuesto, el software que lee dicho correo debe detectar y decodificar tales campos de asunto.

+3

Así es como se ve un mensaje en bruto, pero cuando lo recibes en un cliente de correo electrónico es incorrecto. Recientemente descubrí que hay un error en .NET que hace que los sujetos codificados con codificación UTF-8 tengan una forma incorrecta. Ya archivé este error en Microsoft. Durante la investigación, encontré que algunos clientes de correo electrónico muestran una cadena básica de Base64 si está mal formada. Lamentablemente, no hay solución. Dotnet no permite codificar el tema manualmente; si lo hace, lo recodificará introduciendo nuevos errores. – Harry

+1

@Harry: Creo que acabamos de tropezar con el mismo problema: ¿tiene un enlace a un error de conexión y/o una solución alternativa? –

+0

La única solución alternativa que encontré para esto es no utilizar la codificación UTF-8 y elegir un idioma específico, como ISO o CP. Lo que descubrí fue claramente un error en .NET en sí mismo debido a una codificación de sujeto no válida. Sin embargo, no he verificado esto con las nuevas versiones de .NET. AFAIR estaba presente en .NET 4.5.0, no estoy seguro si lo probé con 4.5.1 y 4.5.2. – Harry

2

La respuesta podría estar en el resto del tema recortado - la sección que proporcionó se decodifica como "[p13n] Archivo", pero si tiene caracteres no ASCII allí, entonces esperaría que codifique como tiene

1

Aunque no estoy seguro, tal vez este article sobre MIME en wikipedia puede ayudar a obtener más información de fondo.

14

me encontré con este post cuando estaba depurando un problema idéntico, y con base en mis investigaciones adicionales que puede proporcionar una explicación alternativa a Andreas:

El problema puede ser que el software de cliente de correo electrónico (Outlook 2003 , en mi caso) está decodificando incorrectamente la línea de asunto. En otras palabras, es un error en Outlook, no en .NET o su programa.

Si utiliza un valor tema como éste (la letra "c" repetida 256 veces), se muestra bien en Outlook:

subject = New String("c"c, 256) 

Del mismo modo, si se utiliza un tema como éste (la letra "c "repetida 178 veces, con un carácter Unicode de no separación de espacio en anexo), también muestra como se esperaba en Outlook:

subject = New String("c"c, 178) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160}) 

sin embargo, aparece el siguiente tema como "= UTF-8 B" basura -prepended?? en Outlook:

subject = New String("c"c, 179) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160}) 

La diferencia es que esta tercera línea de asunto es de 256 bytes cuando está codificada en UTF-8. Supongo que Outlook debe truncar la línea de asunto a 255 caracteres antes de mostrarla ... lo cual estaría bien, excepto que está haciendo esto al truncar la cadena codificada a 255 bytes, lo que corta el terminador de codificación ("? =") , haciéndolo indecodificable

Esto es un error en Outlook y no en su proveedor de correo o .NET; puede ver la línea de asunto codificada UTF-8 completa y no truncada en Outlook haciendo clic derecho en el mensaje en su lista de mensajes y seleccionando "Opciones ..." en el menú contextual, luego desplácese hacia abajo en el cuadro "Encabezados de Internet" hasta ves la línea que comienza con "Asunto:".

Al contrario de lo que sugiere Andreas, el problema se manifiesta no solo cuando hay muchos caracteres que no son ASCII, sino cuando hay uno o más caracteres no ASCII y la línea de asunto es larga. Una solución podría ser utilizar una línea de asunto más corta o quitar todos los caracteres que no sean ASCII en el tema.

(Este error me resultó particularmente difícil de rastrear porque, como antes, los datos del problema no incluían caracteres no ASCII obvios, solo unos pocos espacios sin interrupción. Estos se muestran igual que los espacios ASCII normales cuando imprimirlos para la consola por otra parte, si se cambia el valor de la variable de cadena en el depurador de Visual Studio, en silencio los reemplaza con espacios regulares)

+2

Brillante trabajo detectivo jcl - tuvimos exactamente el mismo problema y su publicación me ahorró muchas horas. Si alguien más tiene este problema, existe una solución que se puede aplicar a Exchange Server 2007, [aquí] (http://blogs.technet.com/stuartp/archive/2009/02/17/subjects-appearing-garbled- or-corrupted-when-they-are-encoded.aspx) –

Cuestiones relacionadas