我正在使用 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 结尾。
问题:如何更改消息的格式以避免此问题?
您还可以在行尾(就在 CR LF 之前)插入制表符。这个额外的空白将位于行尾,因此对用户不可见。您可能更喜欢这样,而不是在左侧插入空格。请注意,单个空格是不够的(尽管我不知道多个空格可能会有所帮助。)
以 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);
此答案是关于如何从 Outlook 客户端“禁用”该功能。
转到工具->“选项...”
在“首选项”选项卡中单击“电子邮件选项...”
取消选中“删除纯文本消息中多余的换行符”框。
点击确定
仅供参考:我正在使用 Outlook 2007
在 Outlook 2010 上添加“\t\r\n”(TAB 为 \t)而不是“\r\n”对我有用。
"\r\n "
(两个空格,没有制表符)“解决”了这个问题,就像一个类似的 hack。适用于 Outlook 2016。YMMV。
我总是有更好的运气将电子邮件格式化为 html。您可能仍然会遇到必须将客户端设置为允许 html 格式的最终用户问题,但他们通常更熟悉这一点,因为很多电子邮件确实都是 html 格式的。在添加 html 标记时,您还需要做更多的工作,但最终结果更加可控。
@ehemient 还建议:以 HTML 和纯文本形式发送。好的客户会显示后者,Outlook 会显示前者,每个人都很高兴(除了必须做更多工作的程序员)。
扩展 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);
自动清理是一项删除额外换行符的 Outlook 功能。您可以通过两种方式进行预防。
第一种方法是在通过代码发送电子邮件时在行前添加至少 2 个额外空格。您只能在 Outlook 自动删除的那些行之前添加这些额外的空格。
第二种方法是更改 Outlook 设置,这将阻止 Outlook 删除额外的换行符。
https://i.stack.imgur.com/Fvh6c.jpg
https://i.stack.imgur.com/LYwPz.jpg
在生成纯文本电子邮件然后使用 Outlook 2003 SP3 阅读它时,我看到了同样的问题。看来您可以通过将行长保持在 40 个字符以下来避免删除过程。可能并不总是实用的。
将文本放入 <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>
我的文本包含 '\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();
}
}
将您的线路终止从 crlf 更改为 cr 或 lf。
我怀疑电子邮件的顶部仅使用 cr(或 lf),而 Outlook 希望电子邮件的其余部分遵循相同的格式。
不定期副业成功案例分享
Regex.Replace(messageBody, @"(?<!\t)((?<!\r)(?=\n)|(?=\r\n))", "\t", RegexOptions.Multiline)