Outlook nettoie automatiquement mes sauts de ligne et bousille mon format de courrier électronique


119

J'envoie un e-mail en utilisant le framework dotnet. Voici le modèle que j'utilise pour créer le message:

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%

Lorsque les messages sont reçus dans Outlook, Outlook m'indique que "Les sauts de ligne supplémentaires dans ce message ont été supprimés". Et le message s'affiche comme ceci:

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

Notez comment Outlook supprime de manière incorrecte les sauts de ligne nécessaires après le nom, EECoverageAmount, etc.

Il est important que les destinataires des e-mails reçoivent un e-mail correctement formaté, et je dois supposer que certains d'entre eux utilisent Outlook 2003. Je ne peux pas non plus supposer qu'ils en sauront suffisamment pour arrêter la fonction de nettoyage automatique pour que le message se formate correctement.

J'ai vu ces messages dans d'autres clients de messagerie et ils s'affichent correctement

quelques informations supplémentaires:

  • J'utilise UTF-8 BodyEncoding (msg.BodyEncoding = System.Text.Encoding.UTF8)
  • Le msg.Body est lu à partir d'un fichier texte encodé en UTF-8, et chaque ligne se termine par un crlf.

Question: Comment modifier le format du message pour éviter ce problème?


12
Bien que les deux réponses hautement votées ci-dessous soient correctes, consultez cette réponse pour une liste de toutes les règles.
Bobson


5
Pourquoi cette «fonctionnalité» existe-t-elle même?
chiliNUT

1
Essayez de Windows nouvelles lignes: \r\n. Cela a fonctionné pour moi.
kevinarpe

Réponses:


97

Commencez chaque ligne avec 2 espaces et les perspectives seront "trompées" pour conserver votre mise en forme.

Alors change

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%

à

  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

Voici l' article que j'ai trouvé en recherchant ce problème qui va un peu plus en profondeur que ma réponse.


6
Voici un Regex pratique pour résoudre ce problème:Regex.Replace(messageBody, @"^(?!\s\s)", " ", RegexOptions.Multiline);
Wilfred Knievel

2
Ok, dans cette regex il y a deux espaces mais ceci étant html, il n'en affiche qu'un!
Wilfred Knievel le

Pour les e-mails en texte brut générés par du code, c'est la meilleure solution.
Salvador Valencia

129

Vous pouvez également insérer un caractère de tabulation à la fin de la ligne (juste avant le CR LF). Cet espace blanc supplémentaire sera à la fin de la ligne et donc non visible par l'utilisateur. Vous préférerez peut-être cela à l'insertion d'espaces sur la gauche. Notez qu'un seul espace n'est pas suffisant (même si plusieurs espaces pourraient aider, je ne sais pas.)


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

Solution parfaite pour les e-mails envoyés par Trac aux utilisateurs d'Outlook.
sfarbota

1
+1 J'ai dû utiliser 3 espaces au lieu d'une tabulation, mais fondamentalement, ce correctif a fonctionné pour moi: Regex.Replace (messageBody, @ "(? <! \ T) ((? <! \ R) (? = \ N) | (? = \ r \ n)) "," ", RegexOptions.Multiline)
Ryan VandenHeuvel

confirmé! Voici regex en tant qu'extrait de code php: $ re = '/ (? <! \ T) ((? <! \ R) (? = \ N) | (? = \ R \ n)) / m'; $ subst = ""; $ MailText = preg_replace ($ re, $ subst, $ MailText);
C4pt4inC4nn4bis

Fonctionne pour Outlook mais casse les messages texte sur les smartphones fpr du client de messagerie Samsung :(
C4pt4inC4nn4bis

26

Cette réponse explique comment «désactiver» la fonctionnalité du client Outlook.

  • Allez dans Outils -> "Options ..."
  • Dans l'onglet "Préférences", cliquez sur "Options de messagerie ..."
  • Décochez la case "Supprimer les sauts de ligne supplémentaires dans les messages en texte brut".
  • Appuyez sur OK

FYI: j'utilise Outlook 2007


3
Je n'aime pas non plus cette fonctionnalité. Entre autres choses, cela provoque la rupture du code dans les e-mails et l'échec des contrôles de signature PGP.
Brian Reiter

7
Et dans Outlook 2010, c'est: Fichier> Options> Courrier> Faites défiler jusqu'à la section "Format du message"> Décochez la case "Supprimer les sauts de ligne supplémentaires dans les messages en texte brut".
Peter Ford

2
Il s'agit d'une solution côté client. Une méthode fiable serait bien meilleure pour empêcher Outlook de le faire côté serveur, c'est-à-dire en formatant le courrier de manière à ne pas déranger les autres clients (car vous ne savez pas quel client de messagerie le destinataire utilisera).
Tobias

7
Merci - et maintenant s'il vous plaît guider nos 100.000+ destinataires de newsletter pour ce faire
Muleskinner

4

J'ai toujours eu plus de chance de formater les e-mails en HTML. Vous pouvez toujours avoir le problème de l'utilisateur final d'avoir à configurer le client pour autoriser le format html, mais ils sont généralement plus familiers avec cela car de nombreux e-mails sont au format html. Vous avez également un peu plus de travail de votre côté en ajoutant les balises html, mais le résultat final est beaucoup plus contrôlable.

@ephemient suggère également: Envoyer à la fois en HTML et en texte brut. Les bons clients montreront ce dernier, Outlook montrera le premier, tout le monde est content (sauf le programmeur qui doit faire plus de travail).


2
Envoyer à la fois en HTML et en texte brut. Les bons clients montreront ce dernier, Outlook montrera le premier, tout le monde est content (sauf le programmeur qui doit faire plus de travail).
éphémère

BTW, s / http / html / g dans votre réponse.
éphémère

4

L'ajout de "\ t \ r \ n" (\ t pour TAB) au lieu de "\ r \ n" a fonctionné pour moi sur Outlook 2010.


J'ai "résolu" cela en utilisant "\r\n "(deux espaces, pas de tabulation) après la nouvelle ligne comme un hack similaire. Fonctionne dans Outlook 2016. YMMV.
user2864740

1

Élargissement de la réponse Doug L , car je pense que la messagerie HTML est encore plus omniprésente et acceptée maintenant qu'en 2008, lorsque cette réponse a été publiée. Voici un petit extrait de code c # pour vous aider à convertir le corps et à envoyer le message au format 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

Je vois le même problème lors de la génération d'un e-mail en texte brut, puis de sa lecture avec Outlook 2003 SP3. Il semble que vous pouvez éviter le processus de suppression en gardant la longueur de ligne inférieure à 40 caractères. Peut-être pas toujours pratique.


0

Mettez le texte dans <pre>Tags et Outlook formatera et affichera le texte correctement.

Je l'ai défini en CSS inline dans HTML Body comme:

CSS:

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

J'ai défini la famille de polices pour avoir un jeu de polices.

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
Je crois que la question originale fait référence aux e-mails en texte brut, pas au HTML. Vous essayez de mélanger du HTML comme solution.
Chris Peters

0

Le nettoyage automatique est une fonction Outlook qui supprime les sauts de ligne supplémentaires. Vous pouvez l'empêcher de deux manières.

  • La première façon consiste à ajouter au moins 2 espaces supplémentaires avant les lignes lors de l'envoi de l'e-mail via le code. Vous pouvez ajouter ces espaces supplémentaires uniquement avant les lignes que Outlook supprime automatiquement.

  • La deuxième méthode consiste à modifier le paramètre Outlook, ce qui empêchera Outlook de supprimer les sauts de ligne supplémentaires.

entrez la description de l'image ici

entrez la description de l'image ici


-1

Mon texte inclut '\ r \ n' mais Outlook 2010 ne rend pas le saut de ligne. Créez des jetons de lignes délimitées par '\ r \ n' et des jetons d'enveloppe par des balises de paragraphe HTML. Mon format de courrier électronique est HTML. Je génère un corps HTML pour mon e-mail dans le code ci-dessous.

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

Changez la terminaison de votre ligne de crlf en cr ou lf.

Je soupçonne que le haut de l'e-mail n'utilise que cr (ou lf), et Outlook s'attend à ce que le reste de l'e-mail suive le même format.


J'ai essayé de changer le terminateur de ligne en CR. Cela n'a pas fonctionné. Ensuite, j'ai essayé de le changer en LF. Cela n'a pas fonctionné non plus.
Aheho

1
Douteux. Outlook a une fonctionnalité très douteuse qui tente de convertir le courrier avec des sauts de ligne durs en texte fluide. Sans surprise, il se trompe souvent, comme dans ce cas.
Daniel Cassidy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.