【问题标题】:Line breaks being removed from email body从电子邮件正文中删除换行符
【发布时间】:2014-05-21 09:41:48
【问题描述】:

我正在使用System.Net.Mail.MailMessage 类生成一封简单的电子邮件,并使用StringBuilder 构建正文。我正在循环通过string[] 并尝试每次都添加一个新行。我遇到的问题是我似乎每次都无法生成一条新行。我可以得到两个或一个都没有。

我的尝试:

foreach (var message in messages)
{
    body.AppendLine(message);
}

foreach (var message in messages)
{
    body.Append(message + "\n");
}

foreach (var message in messages)
{
    body.Append(message + System.Environment.NewLine);
}

我也试过string.Format()

对于上面的每个示例,我得到了相同的结果。没有生成新行。

但是,当我尝试以下操作时,我得到了预期的结果。一个新行,中间有一个空行。

foreach (var message in messages)
{
    body.AppendLine(message + System.Environment.NewLine);
}

为什么要这样做,我该怎么做才能每次只换一个新行?

更新:

所以我发现 Outlook 和可能的 Gmail(还没有测试过其他人)实际上正在删除一些换行符而不是其他换行符。有谁知道他们为什么或如何确定要删除的内容?

【问题讨论】:

  • 为什么你认为没有添加新行?
  • @HamletHakobyan 一切都显示在同一行。
  • 邮件信息是什么格式的?如果是 HTML,则需要 <br/> 换行。
  • 在您的工作示例中,您正在附加一个带有换行符的行。在没有的情况下,您只使用 Append 并且只有一个换行符。我不清楚您遇到的问题。
  • @EliArbel 这不是 html

标签: c# outlook gmail newline stringbuilder


【解决方案1】:

当我在 Outlook 中检查电子邮件时,我收到一条很小的信息消息,上面写着“此消息中的多余换行符已被删除”以及恢复它们的选项。 Gmail 没有给出这样的指示(我发现),但我必须假设它也删除了它们。

有趣的是,我在正文的其他地方有按预期工作的换行符,只有循环中的换行符被认为是“额外的”。

我已修改我的代码以使用 html 构建电子邮件正文。

IsBodyHtml = true

如果有人知道防止这种情况的方法,或者是什么导致某些换行符被删除,请告诉我。

更新:

一旦我知道我在寻找什么,我就找到了this 帖子,它有助于解释事情并提供一些替代解决方案。我没有尝试任何一个,因为我认为在我的情况下使用 html 是更好的解决方案。

【讨论】:

    【解决方案2】:

    Gmail 将删除显式换行符。此代码在发送到 Gmail 以及带有正确换行符的 Outlook 时适用于我。如果没有看到您的 messages[] 数组的样子,我完全无法复制您的问题。某些格式可能会被视为换行符,导致所有内容都被剥离?我篡改了我的示例字符串,我无法让 Outlook 或 Gmail 删除我身上的换行符。

        private void SendMessage()
        {
            try
            {
                StringBuilder body = new StringBuilder();
                string[] messages = { "test with    a tab in it", "    test with     spaces", " \r\nTab, then line break", "\n\n\n\n\n\nlots of returns...", "                test spaces" };
    
                foreach (var msg in messages)
                {
                    body.AppendLine(msg);
                    //body.AppendLine(string.Empty);
                }
    
    
                using (MailMessage message = new MailMessage())
                {
                    message.From = new MailAddress("you@test.com", "Your Display Name");
                    message.ReplyToList.Add("reply-email@test.com");
                    message.To.Add("to@test.com");
                    message.Subject = "Test Line Break Message";
                    message.IsBodyHtml = false;
                    message.Priority = MailPriority.Normal;
                    message.BodyEncoding = System.Text.Encoding.UTF8;
                    message.Body = body.ToString();
    
                    using (SmtpClient smtpClient = new SmtpClient())
                    {
                        smtpClient.Host = "127.0.0.1";
                        smtpClient.Send(message);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
    

    我将假设在您的代码中构建或检索消息数组的某个地方发生了一些事情导致了这个问题。我相信它是可以修复的,但并非没有看到该部分是如何编码的。

    【讨论】:

    • 感谢您的回答,但这实际上增加了一个额外的空行。在我的问题中,您可以看到我能够达到这个结果。
    【解决方案3】:

    我刚刚通过 LINQPad 运行了这个

    string[] messages = new string[]{"First line in message", "Second Line in message", "Third Line in message"};
    
    StringBuilder sbA = new StringBuilder();
    StringBuilder sbB = new StringBuilder();
    StringBuilder sbC = new StringBuilder();
    StringBuilder sbD = new StringBuilder();
    
    // New line for each string
    foreach (var message in messages)
    {
        sbA.AppendLine(message);
    }
    
    // New line for each string
    foreach (var message in messages)
    {
        sbB.Append(message + "\n");
    }
    
    // New line for each string
    foreach (var message in messages)
    {
        sbC.Append(message + System.Environment.NewLine);
    }
    
    //One Line
    foreach (var message in messages)
    {
        sbD.Append(message);
    }
    
    
    sbA.Dump();
    sbB.Dump();
    sbC.Dump();
    sbD.Dump();
    

    在 StringBuilder 意义上,每个都按预期执行。

    我怀疑您需要在每个 AppendLine 的末尾添加 "</br>" 类似这样的内容(未测试):

    MailMessage mail = new MailMessage(new MailAddress("someSender@email.com"), new MailAddress("someReceiver@email.com"));
    string[] messages = new string[]{"First line in message", "Second Line in message", "Third Line in message"};
    
    StringBuilder body = new StringBuilder();
    
    body.AppendLine("<h2>My Message<h2></br>" );
    
    foreach (var message in messages)
    {
        body.AppendLine(message + "</br>");
    }
    
    mail.Body = body.ToString();
    
    mail.Dump();
    

    【讨论】:

    • 查看我发布的答案。你是对的, StringBuilder 按预期工作。最初,我没有在消息中使用 html,但是当我添加 确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2015-12-21
    相关资源
    最近更新 更多