Outlook自动清理我的换行符并弄乱了我的电子邮件格式


119

我正在使用dotnet框架发送电子邮件。这是我用来创建消息的模板:

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%

在Outlook中收到消息后,Outlook会告诉我“该消息中的多余换行符已被删除”。消息显示如下:

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

请注意Outlook如何在名称,EECoverageAmount等后面错误地删除所需的换行符...

对于电子邮件接收者而言,获取正确格式的电子邮件非常重要,我必须假设其中一些使用Outlook2003。我也不能假设他们会足够了解自动清除功能以使消息正确格式化。

我已经在其他邮件客户端中查看了这些消息,它们显示正确

一些更多的信息:

  • 我正在使用UTF-8 BodyEncoding(msg.BodyEncoding = System.Text.Encoding.UTF8)
  • 从UTF-8编码的文本文件中读取msg.Body,并且每行以crlf结尾。

问题:如何更改消息格式以避免此问题?


12
尽管以下两个非常受好评的答案都是正确的,但请参阅此答案以获取所有规则的列表。
Bobson


5
为什么这个“功能”甚至存在?
chiliNUT

1
尝试使用Windows换行符:\r\n。它为我工作。
kevinarpe

Answers:


97

每行以2个空格开头,Outlook将被“欺骗”以保持格式。

所以改变

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

这是我研究此问​​题时发现的文章,其深度比我的回答要深得多。


6
这是一个方便的正则表达式来解决:Regex.Replace(messageBody, @"^(?!\s\s)", " ", RegexOptions.Multiline);
Wilfred Knievel 2010年

2
好的,在该正则表达式中有两个空格,但是这是html,只显示一个空格!
Wilfred Knievel 2010年

对于代码生成的纯文本电子邮件,这是最佳的解决方案。
萨尔瓦多·瓦伦西亚

129

您也可以在行的末尾(在CR LF之前)插入一个制表符。该多余的空白将在行的结尾,因此用户看不到。您可能更喜欢这样做,而不必在左侧插入空格。请注意,仅一个空格是不够的(尽管我可能不知道多个空格会有所帮助。)


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

从Trac发送到Outlook用户的电子邮件的完美解决方案。
sfarbota

1
+1我必须使用3个空格而不是制表符,但基本上此修复程序对我有用:Regex.Replace(messageBody,@“(?<!\ t)((?<!\ r)(?= \ n) |(?= \ r \ n))“,”“,RegexOptions.Multiline)
Ryan VandenHeuvel

确认!这里的regex作为php片段:$ re ='/(?<!\ t)((?<!\ r)(?= \ n)|(?= \ r \ n))/ m'; $ subst =“”; $ MailText = preg_replace($ re,$ subst,$ MailText);
C4pt4inC4nn4bis

适用于Outlook,但会在三星邮件客户端fpr智能手机上破坏文本邮件:(
C4pt4inC4nn4bis

26

这个答案是关于如何从Outlook客户端“禁用”功能。

  • 转到工具->“选项...”
  • 在“首选项”选项卡中,单击“电子邮件选项...”
  • 取消选中“删除纯文本消息中的多余换行符”框。
  • 点击确定

仅供参考:我正在使用Outlook 2007


3
我也不喜欢这个功能。除其他事项外,这会导致电子邮件中的代码损坏以及PGP签名检查失败。
Brian Reiter 2010年

7
在Outlook 2010中,它是:文件>选项>邮件>向下滚动到“邮件格式”部分>取消选中“在纯文本邮件中删除多余的换行符”框。
彼得·福特

2
这是一个客户端解决方案。更好的方法是阻止Outlook在服务器端执行此操作,这是一种可靠的方法,即以一种不会干扰其他客户端的方式格式化邮件(因为您不知道接收方将使用哪个邮件客户端)。
Tobias

7
谢谢-现在请指导100.000+通讯接收器要做到这一点
Muleskinner

4

我一直以来都比较幸运,可以将电子邮件格式设置为html。您可能仍然遇到最终用户的问题,必须将客户端设置为允许html格式,但是由于许多电子邮件确实采用html格式,因此他们通常对此更加熟悉。添加html标签还需要做更多的工作,但是最终结果可控得多。

@ephemient还建议:以HTML和纯文本形式发送。好的客户将显示后者,Outlook将显示前者,每个人都很高兴(除了必须做更多工作的程序员)。


2
以HTML和纯文本形式发送。好的客户将显示后者,Outlook将显示前者,每个人都很高兴(除了必须做更多工作的程序员)。
迅速

顺便说一句,答案中的s / http / html / g。
迅速

4

在Outlook 2010中,为我添加“ \ t \ r \ n”(对于TAB为\ t)而不是“ \ r \ n”。


"\r\n "将换行符之后的内容(两个空格,没有制表符)“解决” 为类似的hack。在Outlook 2016中工作。YMMV。
user2864740 '02

1

扩展Doug L答案,因为我认为HTML消息传递现在比2008年发布该答案时更加普及和接受。以下是一些c#代码段,可帮助您转换正文并以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

生成纯文本电子邮件,然后使用Outlook 2003 SP3进行阅读时,我遇到了相同的问题。看来您可以通过将行长保持在40个字符以下来避免删除过程。可能并不总是实用的。


0

将文本放入“ <pre>标记”中,Outlook将格式化并正确显示文本。

我在HTML正文的CSS内联中定义了它,例如:

CSS:

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

我定义了必须设置字体的字体系列。

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
我相信原始问题是针对纯文本电子邮件,而不是HTML。您正在尝试混合使用HTML作为解决方案。
克里斯·彼得斯

0

自动清洁是一种外观功能,可以消除多余的换行符。您可以通过两种方法来防止它。

  • 第一种方法是在通过代码发送电子邮件时,在行前至少添加2个额外的空格。您只能在Outlook自动删除的那些行之前添加这些额外的空格。

  • 第二种方法是更改Outlook设置,这将防止Outlook删除多余的换行符。

在此处输入图片说明

在此处输入图片说明


-1

我的文字包括“ \ r \ n”,但Outlook 2010不会呈现换行符。创建以'\ r \ n'分隔的行的标记,并通过HTML Paragraph标签创建信封标记。我的电子邮件格式是HTML。我正在以下代码中为我的电子邮件生成HTML正文。

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

将线路终端从crlf更改为cr或lf。

我怀疑电子邮件的顶部仅使用cr(或lf),而Outlook希望电子邮件的其余部分采用相同的格式。


我尝试将行终止符更改为CR。那没用。然后,我尝试将其更改为LF。那也不起作用。
Aheho

1
疑。Outlook具有一个高度可疑的功能,该功能试图将带有强行换行符的邮件转换为流文本。毫不奇怪,在这种情况下,它经常会出错。
丹尼尔·卡西迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.