ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 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 如何错误地删除名称、EEOverageAmount 等后所需的换行符...

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

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

更多信息:

我正在使用 UTF-8 BodyEncoding (msg.BodyEncoding = System.Text.Encoding.UTF8)

msg.Body 是从一个 UTF-8 编码的文本文件中读取的,每一行都以 crlf 结尾。

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

虽然下面两个高度赞成的答案都是正确的,但请参阅 this answer 了解所有规则的列表。
为什么这个“功能”甚至存在?
试试 Windows 换行符:\r\n。它对我有用。

J
Jim Davis

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


Regex.Replace(messageBody, @"(?<!\t)((?<!\r)(?=\n)|(?=\r\n))", "\t", RegexOptions.Multiline)
从 Trac 发送到 Outlook 用户的电子邮件的完美解决方案。
+1 我必须使用 3 个空格而不是制表符,但基本上这个修复对我有用: Regex.Replace(messageBody, @"(?
确认的!这里正则表达式作为 php 片段: $re = '/(?
适用于 Outlook,但会破坏三星邮件客户端 fpr 智能手机上的文本邮件:(
A
Alex B

以 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 它只显示一个!
对于代码生成的纯文本电子邮件,这是最好的解决方案。
不幸的是,它不起作用——线条仍然混合在一起。
D
DHornpout

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

转到工具->“选项...”

在“首选项”选项卡中单击“电子邮件选项...”

取消选中“删除纯文本消息中多余的换行符”框。

点击确定

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


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

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


我在换行符之后使用 "\r\n "(两个空格,没有制表符)“解决”了这个问题,就像一个类似的 hack。适用于 Outlook 2016。YMMV。
空间很烂。制表确实规则。谢谢 :)
D
Doug L.

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

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


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

扩展 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);

B
Brijesh Kumar Tripathi

自动清理是一项删除额外换行符的 Outlook 功能。您可以通过两种方式进行预防。

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

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

https://i.stack.imgur.com/Fvh6c.jpg

https://i.stack.imgur.com/LYwPz.jpg


佚名

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


C
Christian Casutt

将文本放入 <pre> 标签中,outlook 将正确格式化和显示文本。

我在 HTML Body 的 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>

我相信最初的问题是指纯文本电子邮件,而不是 HTML。您正在尝试混合 HTML 作为解决方案。
K
Keyur Patel

我的文本包含 '\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();
     }
  }

s
seanyboy

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

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


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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅