代码之家  ›  专栏  ›  技术社区  ›  Aheho

Outlook自动清理我的换行符并破坏我的电子邮件格式

  •  103
  • Aheho  · 技术社区  · 17 年前

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

    对于电子邮件接收者来说,获得正确格式的电子邮件是很重要的,我必须假设他们中的一些人使用Outlook2003。我也不能假设他们足够了解关闭autoclean功能以使消息正确格式化。

    我在其他邮件客户机中查看了这些邮件,它们显示正确

    更多信息:

    • 我使用的是utf-8 bodyencoding(msg.bodyencoding=system.text.encoding.utf8)
    • 正在从一个UTF-8编码的文本文件中读取msg.body,每行以一个CRLF结尾。

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

    10 回复  |  直到 8 年前
        1
  •  92
  •   Alex B    17 年前

    每行以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 我在研究这个问题时发现,这个问题比我的答案要深入一点。

        2
  •  119
  •   Jim Davis    17 年前

    也可以在 结束 线的(就在CR LF之前)。这个额外的空白将在行尾,因此用户看不到。您可能更喜欢在左侧插入空格。请注意,单个空间是不够的(虽然可能多个空间会有帮助,但我不知道。)

        3
  •  26
  •   DHornpout    16 年前

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

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

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

        4
  •  4
  •   Doug L.    17 年前

    我总是更幸运地将电子邮件格式化为HTML格式。您可能仍然存在最终用户的问题,即必须将客户机设置为允许HTML格式,但他们通常更熟悉这一点,因为许多电子邮件都采用HTML格式。在添加HTML标记的过程中,您还有更多的工作要做,但是最终的结果要可控得多。

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

        5
  •  2
  •   supernova    9 年前

    添加“\t\r\n”(\t用于制表符)而不是“\r\n”在Outlook 2010上对我有效。

        6
  •  1
  •   Ho Ho Ho    8 年前

    扩展 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);
    
        7
  •  0
  •   Geep    17 年前

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

        8
  •  0
  •   Christian Casutt    12 年前

    把课文放进去 <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>
    
        9
  •  -1
  •   Keyur Patel    11 年前

    “我的文本包括”“\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();
         }
      }
    
        10
  •  -6
  •   seanyboy    17 年前

    将您的线路终端从CRLF更改为CR或LF。

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

    推荐文章