Outlook pulisce automaticamente le mie interruzioni di riga e rovina il mio formato di posta elettronica


119

Sto inviando un'e-mail utilizzando il framework dotnet. Ecco il modello che sto usando per creare il messaggio:

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%

Quando i messaggi vengono ricevuti in Outlook, Outlook mi dice "Sono state rimosse le interruzioni di riga aggiuntive in questo messaggio". E il messaggio viene visualizzato in questo modo:

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

Nota come Outlook rimuove erroneamente le interruzioni di riga necessarie dopo il nome, EECoverageAmount, ecc ...

È importante che i destinatari delle e-mail ricevano un'e-mail formattata correttamente e devo presumere che alcuni di loro utilizzino Outlook 2003. Inoltre, non posso presumere che ne sapranno abbastanza per disattivare la funzione di autoclean per ottenere il formato corretto del messaggio.

Ho visualizzato questi messaggi in altri client di posta e vengono visualizzati correttamente

qualche informazione in più:

  • Sto usando UTF-8 BodyEncoding (msg.BodyEncoding = System.Text.Encoding.UTF8)
  • Il msg.Body viene letto da un file di testo codificato UTF-8 e ogni riga termina con un crlf.

Domanda: come si modifica il formato del messaggio per evitare questo problema?


12
Sebbene entrambe le risposte altamente votate di seguito siano corrette, vedi questa risposta per un elenco di tutte le regole.
Bobson


5
Perché esiste anche questa "caratteristica"?
chiliNUT

1
Prova a capo di Windows: \r\n. Ha funzionato per me.
kevinarpe

Risposte:


97

Inizia ogni riga con 2 spazi e Outlook sarà "indotto" a mantenere la formattazione.

Quindi 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%

per

  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

Ecco l' articolo ho trovato durante la ricerca di questo problema che va un po 'più in profondità rispetto alla mia risposta.


6
Ecco una pratica Regex per risolvere questo problema:Regex.Replace(messageBody, @"^(?!\s\s)", " ", RegexOptions.Multiline);
Wilfred Knievel

2
Ok, in quella regex ci sono due spazi ma essendo html ne mostra solo uno!
Wilfred Knievel,

Per le e-mail di testo normale generate da codice questa è la soluzione migliore.
Salvador Valencia

129

Puoi anche inserire un carattere di tabulazione alla fine della riga (subito prima di CR LF). Questo spazio bianco extra sarà alla fine della riga e quindi non sarà visibile all'utente. Potresti preferire questo a dover inserire spazi a sinistra. Nota che un singolo spazio non è sufficiente (anche se forse più spazi potrebbero aiutare, non lo so).


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

Soluzione perfetta per le email inviate da Trac agli utenti di Outlook.
sfarbota

1
+1 Ho dovuto usare 3 spazi invece di una tabulazione, ma fondamentalmente questa correzione ha funzionato per me: Regex.Replace (messageBody, @ "(? <! \ T) ((? <! \ R) (? = \ N) | (? = \ r \ n)) "," ", RegexOptions.Multiline)
Ryan VandenHeuvel

confermato! Qui regex come snippet php: $ re = '/ (? <! \ T) ((? <! \ R) (? = \ N) | (? = \ R \ n)) / m'; $ subst = ""; $ MailText = preg_replace ($ re, $ subst, $ MailText);
C4pt4inC4nn4bis

Funziona con Outlook ma interrompe i messaggi di testo sugli smartphone con client di posta Samsung per smartphone :(
C4pt4inC4nn4bis

26

Questa risposta è su come "disabilitare" la funzionalità dal client Outlook.

  • Vai a Strumenti -> "Opzioni ..."
  • Nella scheda "Preferenze" fai clic su "Opzioni email ..."
  • Deseleziona la casella "Rimuovi interruzioni di riga aggiuntive nei messaggi di testo normale".
  • Premi OK

FYI: sto usando Outlook 2007


3
Non mi piace nemmeno questa caratteristica. Tra le altre cose, provoca l'interruzione del codice nelle e-mail e il fallimento dei controlli della firma PGP.
Brian Reiter

7
E in Outlook 2010 è: File> Opzioni> Posta> Scorri verso il basso fino alla sezione "Formato messaggio"> Deseleziona la casella "Rimuovi interruzioni di riga extra nei messaggi di testo normale".
Peter Ford

2
Questa è una soluzione lato client. Molto meglio sarebbe un metodo affidabile per impedire a Outlook di farlo sul lato server, cioè formattando la posta in modo da non disturbare gli altri client (perché non si sa quale client di posta verrà utilizzato dal destinatario).
Tobias

7
Grazie - e ora guida i nostri oltre 100.000 destinatari di newsletter a farlo
Muleskinner

4

Ho sempre avuto più fortuna nel formattare le e-mail come html. Potresti ancora avere il problema dell'utente finale di dover impostare il client per consentire il formato html, ma di solito è più familiare con questo dato che molte e-mail arrivano in formato html. Hai anche un po 'più di lavoro da parte tua aggiungendo i tag html, ma il risultato finale è molto più controllabile.

@ephemient suggerisce anche: Invia sia come HTML che come testo normale. I buoni clienti mostreranno il secondo, Outlook mostrerà il primo, tutti sono contenti (tranne il programmatore che deve fare più lavoro).


2
Invia sia come HTML che come testo normale. I buoni clienti mostreranno il secondo, Outlook mostrerà il primo, tutti sono contenti (tranne il programmatore che deve fare più lavoro).
effimero

BTW, s / http / html / g nella tua risposta.
effimero

4

L'aggiunta di "\ t \ r \ n" (\ t per TAB) invece di "\ r \ n" ha funzionato per me su Outlook 2010.


Ho "risolto" questo problema utilizzando "\r\n "(due spazi, nessuna tabulazione) dopo la nuova riga come un trucco simile. Funziona in Outlook 2016. YMMV.
user2864740

1

Espandendo la risposta di Doug L , dal momento che penso che la messaggistica HTML sia ancora più onnipresente e accettata ora rispetto al 2008, quando quella risposta è stata pubblicata. Ecco un piccolo frammento c # per aiutare a convertire il corpo e inviare il messaggio in 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

Sto riscontrando lo stesso problema durante la generazione di un'e-mail di testo normale e la lettura con Outlook 2003 SP3. Sembra che tu possa evitare il processo di rimozione mantenendo la lunghezza della riga inferiore a 40 caratteri. Potrebbe non essere sempre pratico.


0

Inserisci il testo <pre> Tag e Outlook formatterà e visualizzerà il testo correttamente.

l'ho definito in CSS inline in HTML Body come:

CSS:

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

Ho definito la famiglia di caratteri da avere per il set di caratteri.

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
Credo che la domanda originale si riferisca a messaggi di posta elettronica in chiaro, non HTML. Stai cercando di mescolare HTML come soluzione.
Chris Peters

0

La pulizia automatica è una funzionalità di Outlook che rimuove le interruzioni di riga aggiuntive. Puoi prevenirlo in due modi.

  • Il primo modo è aggiungere almeno 2 spazi extra prima delle righe durante l'invio dell'email tramite codice. Puoi aggiungere questi spazi extra solo prima di quelle righe che Outlook rimuove automaticamente.

  • Il secondo modo è modificare l'impostazione di Outlook che impedirà a Outlook di rimuovere interruzioni di riga aggiuntive.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


-1

Il mio testo include "\ r \ n" ma Outlook 2010 non esegue il rendering dell'interruzione di riga. Crea token di righe delimitate da "\ r \ n" e token di busta da tag di paragrafo HTML. Il formato della mia email è HTML. Sto generando HTML Body per la mia email nel codice sottostante.

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

Cambia la tua terminazione di linea da crlf a cr o lf.

Sospetto che la parte superiore dell'email utilizzi solo cr (o lf) e Outlook si aspetta che il resto dell'email segua lo stesso formato.


Ho provato a cambiare il terminatore di riga in un CR. Non ha funzionato. Poi ho provato a cambiarlo in un LF. Neanche questo ha funzionato.
Aheho

1
Dubbioso. Outlook ha una caratteristica molto dubbia che cerca di convertire la posta con interruzioni di riga rigide in testo scorrevole. Non sorprende che spesso si sbagli, come in questo caso.
Daniel Cassidy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.