如何格式化电子邮件中的字符串以便 Outlook 打印换行符?

IT小君   2021-10-07T23:30:15

我正在尝试用 Java 发送电子邮件,但是当我在 Outlook 中阅读电子邮件正文时,它摆脱了我所有的换行符。我将 \n 放在行尾,但除此之外我还需要做什么特别的事情吗?接收者将始终使用 Outlook。

我在 microsoft.com 上找到了一个页面,上面写着 Outlook 中有一个“删除换行符”“功能”,这是否意味着除了取消选中该设置之外没有其他解决方案可以解决这个问题?

谢谢

评论(27)
IT小君

我今天一直在与这个斗争。让我们将删除额外换行符的行为称为“延续”。一些实验发现以下行为:

  • 每条消息都以 continuation off 开始。
  • 长度少于 40 个字符的行不会触发续行,但如果启用续行,它们的换行符将被删除。
  • 40 个字符或更长的行打开继续。它一直保持打开状态,直到发生将其关闭的事件。
  • 以句点、问号、感叹号或冒号结尾的行会关闭续行。(Outlook 假设它是句子的结尾?)
  • 关闭续行的行将以换行符开头,但如果它们的长度超过 40 个字符,则会重新启用续行。
  • 以制表符开头或结尾的行会关闭继续。
  • 以 2 个或更多空格开头的行将关闭继续。
  • 以 3 个或更多空格结尾的行将关闭继续。

请注意,我在 Outlook 2007 中尝试了所有这些。YMMV。
因此,如果可能,请以句子终止标点符号、制表符或什至三个空格来结束所有项目符号项。

2021-10-07T23:30:15   回复
IT小君

您需要\r\n用作解决方案。

2021-10-07T23:30:16   回复
IT小君

在换行符 (CRLF) 之前附加一个(或两个?)制表符 (\t) 时,您可以在 Outlook 中强制换行。

例子:

This is my heading in the mail\t\n
Just here Outlook is forced to begin a new line.

它似乎适用于 Outlook 2010。请测试这是否适用于其他版本。

另请参阅Outlook 自动清理我的换行符并弄乱我的电子邮件格式

2021-10-07T23:30:16   回复
IT小君

默认情况下,Microsoft Outlook 2002 及更高版本会从文本消息中删除“额外的换行符” (kb308319)也就是说,Outlook 似乎只是忽略文本消息中的换行和/或回车序列,将所有行放在一起。

如果您尝试编写自动生成电子邮件以供使用 Outlook 的人阅读的代码,这可能会导致问题。

例如,假设您想在单独的行中提供单独的信息,以便清楚起见,如下所示:

交易需注意!
发布日期:1/30/2009
金额:12,222.06 美元
TransID:8gk288g229g2kg89 邮政编码
:91543

您的 Outlook 收件人将看到信息全部拼凑在一起,如下所示:

交易需注意!发布日期:1/30/2009 金额:12,222.06 美元 TransID:8gk288g229g2kg89 邮编:91543

似乎没有一个简单的解决方案。替代方案是:

  1. 您可以提供2组,每组线之间的换行符。这确实阻止 Outlook 将这些行合并为一行,但随后会在每行之间显示一个额外的空行(产生相反的问题)。通过“提供两组换行符”我的意思是你应该使用 "\r\n\r\n" 或 "\r\r" 或 "\n\n" 而不是 "\r\n" 或 "\n \r”。
  2. 您可以在电子邮件正文的每一行的开头提供两个空格。这避免了在每行之间引入额外的空行。但是,如果您的邮件中的每一行都相当短,这种方法效果最好,因为用户可能正在一个非常窄的 Outlook 窗口中预览文本,该窗口将每行的末尾环绕到下一行的第一个位置,在那里它不会与您的两个空格缩进的行对齐。这种策略已被用于一些时事通讯
  3. 您可以放弃使用纯文本格式,而使用 html 格式。
2021-10-07T23:30:16   回复
IT小君

我遇到了同样的问题,并找到了解决方案。试试这个: %0D%0A添加换行符。

2021-10-07T23:30:16   回复
IT小君

我使用了 html 换行符而不是 "\n" 。它工作得很好。

2021-10-07T23:30:16   回复
IT小君

添加 "\t\r\n" ( \t 表示 TAB) 而不是 "\r\n" 在 Outlook 2010 上对我有用。注意:在每行末尾添加 3 个空格也可以做同样的事情,但这看起来像是一个编程技巧!

2021-10-07T23:30:16   回复
IT小君

诀窍是使用encodeURIComponent()js功能:

var formattedBody = "FirstLine \n Second Line \n Third Line";
var mailToLink = "mailto:[email protected]?body=" + encodeURIComponent(formattedBody);

结果:

FirstLine
SecondLine
ThirdLine
2021-10-07T23:30:17   回复
IT小君

对于 Outlook 2010 及更高版本,请使用\t\n而不是 \r\n。

2021-10-07T23:30:17   回复
IT小君

您需要发送 HTML 电子邮件。<br />在电子邮件中使用s,您将始终有换行符。

2021-10-07T23:30:17   回复
IT小君

如果你可以添加一个'.' (点)字符,这似乎可以防止 Outlook 破坏文本格式。

2021-10-07T23:30:17   回复
IT小君

尝试\r\c代替\n.

编辑:我认为@Robert Wilkinson 说得对。\r\n. 记忆力已经不是以前的样子了。

2021-10-07T23:30:17   回复
IT小君

\n在很大程度上对我们有用,但 Outlook 有时会自行删除您所说的换行符。

2021-10-07T23:30:17   回复
IT小君

我也遇到了纯文本/文本邮件类型的问题。早些时候,我使用了 "\n\n" 但有两个换行符。然后,我使用了 "\t\n" 并且它起作用了。StringBuffer在java中使用来附加内容。
内容打印在 Outlook 2010 邮件的下一行。

2021-10-07T23:30:18   回复
IT小君

我一直在努力解决上述所有解决方案,但在这里没有任何帮助,因为我在我的电子邮件库中使用了一个字符串变量(来自 JTextPane 的纯文本)和“text/html”格式。

所以,这个问题的解决方案是使用“text/plain”,而不是“text/html”,根本不需要替换返回字符:

MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(message, "text/plain");
2021-10-07T23:30:18   回复
IT小君

将文本放入<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>
2021-10-07T23:30:18   回复
IT小君

因为它是一个查询,所以只有百分比转义字符有效,这意味着 %0A 给你一个换行符。例如,

&lt;a href=&quot;mailto:someone@gmail.com?Subject=TEST&amp;amp;body=Hi there,%0A%0AHow are you?%0A%0AThanks&quot;&gt;email to me&lt;/a&gt;
2021-10-07T23:30:18   回复
IT小君

我也遇到了纯文本/文本邮件类型的问题。Form Feed\f对我有用

2021-10-07T23:30:18   回复
IT小君

有时您必须输入 \r\n 两次才能强制 Outlook 进行中断。

这将添加一个空行,但所有行都将中断。

2021-10-07T23:30:18   回复
IT小君

\r\n除非您将正文类型设置为文本,否则将无法使用。

message.setBody(MessageBody.getMessageBodyFromText(msg));
BodyType type = BodyType.Text;
message.getBody().setBodyType(type);
2021-10-07T23:30:19   回复
IT小君

我遇到了同样的问题,这里是解决它的代码:

\t\n - for new line in Email service JavaMailSender

String mailMessage = JSONObject.toJSONString("Your message").replace(",", "\t\n").trim();
2021-10-07T23:30:19   回复
IT小君

在我的申请中解决

在我的应用程序中,我试图发送一封电子邮件,其邮件正文由用户在文本区域中键入。发送邮件时,Outlook 会自动删除用户输入的换行符。

例如,如果用户输入
Yadav
Mahesh

Outlook 将其显示为
YadavMahesh

解决方案:我将换行符“\r\n”更改为“\par”(记住在RTF代码“\par”末尾打空格)并重新设置换行符。

干杯,
马赫什

2021-10-07T23:30:19   回复
IT小君

尝试这个:

message.setContent(new String(body.getBytes(), "iso-8859-1"),
                    "text/html; charset=\"iso-8859-1\"");

问候,穆罕默德·拉苏尔·贾维德

2021-10-07T23:30:19   回复
IT小君

我有一个很好的解决方案,我尝试过,它只是在行尾添加 Char(13) ,如下例所示:

Dim S As String
 S = "Some Text" & Chr(13)
 S = S + "Some Text" & Chr(13)
2021-10-07T23:30:19   回复
IT小君

如果消息是文本/纯文本使用,\r\n 应该可以工作;如果消息类型是 text\html,请使用< p/>

2021-10-07T23:30:19   回复
IT小君

如果需要使用没有 html 编码的格式化文本来完成工作。通过以下场景可以轻松实现,即动态创建 div 元素并使用<pre></pre>html 元素保持格式。

var email_body = htmlEncode($("#Body").val());

 function htmlEncode(value) {
    return "<pre>" + $('<div/>').text(value).html() + "</pre>";
}
2021-10-07T23:30:20   回复
IT小君

不确定上面是否提到过,但 Outlook 有一个名为“删除纯文本消息中的额外换行符”的复选框设置,默认情况下处于选中状态。对于不同版本的 Outlook,它位于不同的位置,但对于 2010,请转到“文件”选项卡。选择“选项 => 邮件”向下滚动到“消息格式”取消选中复选框。

2021-10-07T23:30:20   回复