Outlook limpia automáticamente mis saltos de línea y arruina el formato de mi correo electrónico


119

Estoy enviando un correo electrónico usando el marco dotnet. Aquí está la plantilla que estoy usando para crear el mensaje:

Date of Hire: %HireDate%
Annual Salary: %AnnualIncome%
Reason for Request: %ReasonForRequest%

Name of Voluntary Employee: %FirstName% %LastName%
Total Coverage Applied For:  %EECoverageAmount%
Guaranteed Coverage Portion: %GICoveragePortion%
Amount Subject to Medical Evident: %GIOverage%

Cuando se reciben los mensajes en Outlook, Outlook me dice "Se eliminaron los saltos de línea adicionales en este mensaje". Y el mensaje se muestra así:

Date of Hire: 9/28/2001
Annual Salary: $100,000
Reason for Request: New Hire

Name of Voluntary Employee: Ronald Weasley Total Coverage Applied For:  $500,000 Guaranteed Coverage Portion: $300,000.00 Amount Subject to Medical Evident: $200,000

Observe cómo Outlook elimina incorrectamente los saltos de línea necesarios después del nombre, EECoverageAmount, etc.

Es importante que los destinatarios del correo electrónico obtengan un correo electrónico con el formato correcto, y debo asumir que algunos de ellos usan Outlook 2003. Tampoco puedo asumir que sabrán lo suficiente como para apagar la función de autolimpieza para que el mensaje se formatee correctamente.

He visto estos mensajes en otros clientes de correo y se muestran correctamente.

Más información:

  • Estoy usando UTF-8 BodyEncoding (msg.BodyEncoding = System.Text.Encoding.UTF8)
  • El mensaje MSG se lee desde un archivo de texto codificado en UTF-8 y cada línea termina con un crlf.

Pregunta: ¿Cómo cambio el formato del mensaje para evitar este problema?


12
Si bien las dos respuestas altamente votadas a continuación son correctas, consulte esta respuesta para obtener una lista de todas las reglas.
Bobson


5
¿Por qué existe esta "característica"?
chiliNUT

1
Pruebe nuevas líneas de Windows: \r\n. Funcionó para mí.
kevinarpe

Respuestas:


97

Empiece cada línea con 2 espacios y Outlook será "engañado" para que mantenga su formato.

Así que cambia

Date of Hire: %HireDate%
Annual Salary: %AnnualIncome%
Reason for Request: %ReasonForRequest%

Name of Voluntary Employee: %FirstName% %LastName%
Total Coverage Applied For:  %EECoverageAmount%
Guaranteed Coverage Portion: %GICoveragePortion%
Amount Subject to Medical Evident: %GIOverage%

a

  Date of Hire: %HireDate%
  Annual Salary: %AnnualIncome%
  Reason for Request: %ReasonForRequest%

  Name of Voluntary Employee: %FirstName% %LastName%
  Total Coverage Applied For:  %EECoverageAmount%
  Guaranteed Coverage Portion: %GICoveragePortion%
  Amount Subject to Medical Evident: %GIOverage%
^^ <--- Two extra spaces at the start of every line

Aquí está el artículo que encontré al investigar este problema que profundiza un poco más que mi respuesta.


6
Aquí hay una expresión regular útil para resolver esto:Regex.Replace(messageBody, @"^(?!\s\s)", " ", RegexOptions.Multiline);
Wilfred Knievel

2
Ok, en esa expresión regular hay dos espacios, pero al ser html, ¡solo muestra uno!
Wilfred Knievel

Para correos electrónicos de texto sin formato generados con código, esta es la mejor solución.
Salvador Valencia

129

También puede insertar un carácter de tabulación al final de la línea (justo antes del CR LF). Este espacio en blanco adicional estará al final de la línea y, por lo tanto, no será visible para el usuario. Es posible que prefiera esto a tener que insertar espacios a la izquierda. Tenga en cuenta que un solo espacio no es suficiente (aunque quizás varios espacios ayudarían, no lo sé).


14
Regex.Replace(messageBody, @"(?<!\t)((?<!\r)(?=\n)|(?=\r\n))", "\t", RegexOptions.Multiline)
Wilfred Knievel

Solución perfecta para correos electrónicos enviados desde Trac a usuarios de Outlook.
sfarbota

1
+1 Tuve que usar 3 espacios en lugar de una pestaña, pero básicamente esta solución funcionó para mí: Regex.Replace (messageBody, @ "(? <! \ T) ((? <! \ R) (? = \ N) | (? = \ r \ n)) "," ", RegexOptions.Multiline)
Ryan VandenHeuvel

¡confirmado! Aquí regex como fragmento de php: $ re = '/ (? <! \ T) ((? <! \ R) (? = \ N) | (? = \ R \ n)) / m'; $ subst = ""; $ MailText = preg_replace ($ re, $ subst, $ MailText);
C4pt4inC4nn4bis

Funciona para Outlook pero rompe los mensajes de texto en los teléfonos inteligentes fpr del cliente de correo de Samsung :(
C4pt4inC4nn4bis

26

Esta respuesta trata sobre cómo "deshabilitar" la función del cliente de Outlook.

  • Vaya a Herramientas -> "Opciones ..."
  • En la pestaña "Preferencias", haga clic en "Opciones de correo electrónico ..."
  • Desmarca la casilla "Eliminar saltos de línea adicionales en mensajes de texto sin formato".
  • Presiona OK

FYI: estoy usando Outlook 2007


3
Tampoco me gusta esta función. Entre otras cosas, hace que el código de los correos electrónicos se rompa y las comprobaciones de firma PGP fallen.
Brian Reiter

7
Y en Outlook 2010 es: Archivo> Opciones> Correo> Desplácese hacia abajo hasta la sección "Formato de mensaje"> Desmarque la casilla "Eliminar saltos de línea adicionales en mensajes de texto sin formato".
Peter Ford

2
Esta es una solución del lado del cliente. Mucho mejor sería un método confiable para evitar que Outlook haga esto en el lado del servidor, es decir, formateando el correo de una manera que no moleste a otros clientes (porque no sabe qué cliente de correo usará el receptor).
Tobias

7
Gracias, y ahora guíe a nuestros más de 100.000 receptores de boletines informativos para que hagan esto
Muleskinner

4

Siempre he tenido más suerte al formatear correos electrónicos como html. Es posible que todavía tenga el problema del usuario final de tener que configurar el cliente para que permita el formato html, pero generalmente están más familiarizados con esto, ya que muchos correos electrónicos vienen en formato html. También tiene un poco más de trabajo en su extremo agregando las etiquetas html, pero el resultado final es mucho más controlable.

@ephemient también sugiere: Enviar como HTML y texto sin formato. Los buenos clientes mostrarán lo último, Outlook mostrará lo primero, todos están contentos (excepto el programador que tiene que trabajar más).


2
Envíe como HTML y texto sin formato. Los buenos clientes mostrarán lo último, Outlook mostrará lo primero, todos están contentos (excepto el programador que tiene que trabajar más).
efímero

Por cierto, s / http / html / g en su respuesta.
efímero

4

Agregar "\ t \ r \ n" (\ t para TAB) en lugar de "\ r \ n" funcionó para mí en Outlook 2010.


"Resolví" esto usando "\r\n "(dos espacios, sin tabulación) después de la nueva línea como un truco similar. Funciona en Outlook 2016. YMMV.
user2864740

1

Ampliando la respuesta de Doug L , ya que creo que la mensajería HTML es aún más ubicua y aceptada ahora que en 2008 cuando se publicó esa respuesta. Aquí hay un pequeño fragmento de C # para ayudar a convertir el cuerpo y enviar el mensaje en formato HTML:

body = string.Format("<font face='calibri,arial,sans-serif'>{0}<font/>", body.Replace("\r\n", "<br>"));

using (var smtpClient = new SmtpClient() { Host = smtpHost })
using (var msg = new MailMessage(from, emailDistribution, subject, body) { IsBodyHtml = true })
     smtpClient.Send(msg);

0

Veo el mismo problema al generar un correo electrónico de texto sin formato y luego leerlo con Outlook 2003 SP3. Parece que puede evitar el proceso de eliminación si mantiene la longitud de la línea por debajo de los 40 caracteres. Puede que no siempre sea práctico.


0

Coloque el texto en <pre>Etiquetas y Outlook formateará y mostrará el texto correctamente.

lo definí en CSS en línea en HTML Body como:

CSS:

pre {
 font-family: Verdana, Geneva, sans-serif;
}

Definí la familia de fuentes para tener un conjunto de fuentes.

HTML:

<td width="70%"><pre>Entry Date/Time:       2013-09-19 17:06:25
Entered By:     Chris

worklog mania

____________________________________________________________________________________________________

Entry Date/Time:        2013-09-19 17:05:42
Entered By:     Chris

this is a new Worklog Entry</pre></td>

1
Creo que la pregunta original se refiere a correos electrónicos de texto sin formato, no HTML. Estás intentando mezclar HTML como solución.
Chris Peters

0

La limpieza automática es una función de Outlook que elimina los saltos de línea adicionales. Puede prevenirlo de dos maneras.

  • La primera forma es agregar al menos 2 espacios adicionales antes de las líneas al enviar el correo electrónico a través del código. Puede agregar estos espacios adicionales solo antes de las líneas que Outlook elimina automáticamente.

  • La segunda forma es cambiar la configuración de Outlook, lo que evitará que Outlook elimine saltos de línea adicionales.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí


-1

Mi texto incluye '\ r \ n' pero Outlook 2010 no muestra el salto de línea. Cree tokens de líneas delimitadas por '\ r \ n' y tokens de sobre por etiquetas HTML Paragraph. El formato de mi correo electrónico es HTML. Estoy generando HTML Body para mi correo electrónico en el siguiente código.

string[] tokens = Regex.Split(objTickt.Description, "\r\n");
  if (tokens.Length > 0)
  {
     foreach (string line in tokens)
     {
         //htmlTW.WriteEncodedText(objTickt.Description.Replace("\r\n", "\n\n"));
         htmlTW.RenderBeginTag(HtmlTextWriterTag.P);
         htmlTW.WriteEncodedText(line);
         htmlTW.RenderEndTag();
     }
  }

-6

Cambie la terminación de su línea de crlf a cr o lf.

Sospecho que la parte superior del correo electrónico solo usa cr (o lf), y Outlook espera que el resto del correo electrónico siga el mismo formato.


Intenté cambiar el terminador de línea a un CR. Eso no funcionó. Luego intenté cambiarlo a LF. Eso tampoco funcionó.
Aheho

1
Dudoso. Outlook tiene una característica muy dudosa que intenta convertir el correo con saltos de línea en texto fluido. Como era de esperar, con frecuencia se equivoca, como en este caso.
Daniel Cassidy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.