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

Posted

技术标签:

【中文标题】Outlook 自动清理我的换行符并搞砸了我的电子邮件格式【英文标题】:Outlook autocleaning my line breaks and screwing up my email format 【发布时间】:2010-09-19 20:08:12 【问题描述】:

我正在使用 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 等后所需的换行符...

对于电子邮件收件人来说,获得格式正确的电子邮件很重要,我必须假设他们中的一些人使用 Outlook 2003。我也不能假设他们知道足以关闭自动清理功能以使邮件格式化适当地。

我已经在其他邮件客户端中查看过这些邮件并且它们显示正确

更多信息:

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

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

【问题讨论】:

虽然下面两个高度赞成的答案都是正确的,但请参阅this answer 了解所有规则的列表。 How do I format a String in an email so Outlook will print the line breaks?的可能重复 为什么还会存在这个“功能”? 尝试 Windows 换行符:\r\n。它对我有用。 【参考方案1】:

自动清理是一项 Outlook 功能,可删除多余的换行符。您可以通过两种方式防止它。

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

第二种方法是更改 Outlook 设置,这将阻止 Outlook 从删除额外的换行符。

【讨论】:

【参考方案2】:

扩展 Doug L 答案,因为我认为 html 消息传递现在比 2008 年发布该答案时更加普遍和被接受。这里有一个小小的 c# sn -p 来帮助转换正文并以 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);

【讨论】:

【参考方案3】:

在 Outlook 2010 上添加“\t\r\n”(TAB 为 \t)而不是“\r\n”对我有用。

【讨论】:

我在换行符之后使用"\r\n "(两个空格,没有制表符)“解决”了这个问题,就像一个类似的黑客攻击。适用于 Outlook 2016。YMMV。 空间很烂。制表确实规则。谢谢:)【参考方案4】:

我的文本包含“\r\n”,但 Outlook 2010 不呈现换行符。创建由 '\r\n' 分隔的行标记和 HTML 段落标记的信封标记。我的电子邮件格式是 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();
     
  

【讨论】:

【参考方案5】:

将文本放入&lt;pre&gt; 标签中,outlook 将正确格式化和显示文本。

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

CSS:

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

我将字体系列定义为必须设置字体。

HTML:

<td ><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>

【讨论】:

我相信最初的问题是指纯文本电子邮件,而不是 HTML。您正在尝试混合 HTML 作为解决方案。【参考方案6】:

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

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

仅供参考:我使用的是 Outlook 2007

【讨论】:

我也不喜欢这个功能。除其他外,它会导致电子邮件中的代码被破坏并且 PGP 签名检查失败。 在 Outlook 2010 中它是:文件 > 选项 > 邮件 > 向下滚动到“邮件格式”部分 > 取消选中“删除纯文本邮件中的多余换行符”框。 这是一个客户端解决方案。更好的是防止 Outlook 在服务器端执行此操作的可靠方法,即通过以不干扰其他客户端的方式格式化邮件(因为您不知道接收者将使用哪个邮件客户端)。 谢谢 - 现在请指导我们的 100.000 多名时事通讯接收者这样做【参考方案7】:

你也可以在行的end处插入一个制表符(就在CR LF之前)。这个额外的空白将位于行尾,因此对用户不可见。您可能更喜欢这样,而不是必须在左侧插入空格。请注意,一个空格是不够的(尽管我不知道多个空格可能会有所帮助。)

【讨论】:

Regex.Replace(messageBody, @"(?&lt;!\t)((?&lt;!\r)(?=\n)|(?=\r\n))", "\t", RegexOptions.Multiline) 从 Trac 向 Outlook 用户发送电子邮件的完美解决方案。 +1 我不得不使用 3 个空格而不是制表符,但基本上这个修复对我有用:Regex.Replace(messageBody, @"(? 确认!这里正则表达式为 php sn-p: $re = '/(? 适用于 Outlook,但会破坏三星邮件客户端 fpr 智能手机上的文本邮件:(【参考方案8】:

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

【讨论】:

【参考方案9】:

每行以 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

这是我在研究这个问题时发现的article,它比我的答案更深入。

【讨论】:

这是一个方便的正则表达式来解决这个问题:Regex.Replace(messageBody, @"^(?!\s\s)", " ", RegexOptions.Multiline); 好的,在那个正则表达式中有两个空格,但这是 html 它只显示一个! 对于代码生成的纯文本电子邮件,这是最好的解决方案。【参考方案10】:

我总是比较幸运地将电子邮件格式化为 html。您可能仍然会遇到必须将客户端设置为允许 html 格式的最终​​用户问题,但他们通常更熟悉这一点,因为很多电子邮件都采用 html 格式。您还需要在添加 html 标记方面做更多工作,但最终结果更加可控。

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

【讨论】:

以 HTML 和纯文本形式发送。好的客户会显示后者,Outlook 会显示前者,每个人都很高兴(除了需要做更多工作的程序员)。 顺便说一句,你的答案是 s/http/html/g。【参考方案11】:

将您的线路终止从 crlf 更改为 cr 或 lf。

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

【讨论】:

我尝试将行终止符更改为 CR。那没有用。然后我尝试将其更改为LF。那也没用。 值得怀疑。 Outlook 有一个非常可疑的功能,它试图将带有硬换行符的邮件转换为流动文本。不出所料,它经常出错,就像本例一样。

以上是关于Outlook 自动清理我的换行符并搞砸了我的电子邮件格式的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 搞砸了我的查询

为啥 Outlook 2010 会破坏我的 HTML 电子邮件正文?

我在 Access 中的导航表单搞砸了我的查询和子表单

Gradle 在 Android Studio 中搞砸了我的应用程序,如何修复?

无法实例化抽象类我认为我搞砸了我的构造函数 C++

<br> 标签使用 scrapy 和 python 搞砸了我的数据