【问题标题】:Adding Newline in string for HTML email body在 HTML 电子邮件正文的字符串中添加换行符
【发布时间】:2020-12-29 15:25:10
【问题描述】:

我正在尝试根据 FormView 中的标签生成具有一些基本格式的电子邮件。我将使用Process.Start("mailto:... 而不是 System.Net.Mail 的路线,因此电子邮件会在默认电子邮件客户端中打开,让用户有机会编辑 To: CC: 等,而无需创建新表单来处理它。我有以下代码隐藏来处理“电子邮件表单”按钮,用于通过电子邮件发送网络表单的 URL。

protected void fvBF_ItemCommand(object sender, FormViewCommandEventArgs e)
{
    if (e.CommandName == "Email")
    {
        Label lblBFID = (Label)fvBookingForm.FindControl("lblBFID");
        Label lblProjectID = (Label)fvBookingForm.FindControl("lblProjectNum");
        Label lblProjectName = (Label)fvBookingForm.FindControl("lblProjectName");
        Label lblReleaseName = (Label)fvBookingForm.FindControl("lblReleaseName");
        Label lblPMName = (Label)fvBookingForm.FindControl("lblPM");

        String strReleaseName = String.IsNullOrEmpty(lblReleaseName.Text) ? "[Description]" : lblReleaseName.Text;

        String pmFirst = lblPMName.Text.ToString().Split()[0];
        String pmLast = lblPMName.Text.ToString().Split()[1];

        String strSubject = "BF " + lblBFID.Text + " - " + lblProjectName.Text  + " - Release " + strReleaseName;
        String strBody = "A Booking Form for Project #"+ lblProjectID.Text + " - " + lblProjectName.Text + 
            " - Release " + strReleaseName + " has been created or modified. \n\n" + Request.Url.ToString();

        Process.Start("mailto:" + pmFirst + "." + pmLast + "@company.com?subject=" +
            HttpUtility.HtmlAttributeEncode(strSubject) + "&body=" +
            HttpUtility.HtmlAttributeEncode(strBody).Replace("\n", Environment.NewLine));
    }
}

但是,在生成电子邮件时,“A Booking Form....”句子和 URL 之间的正文中没有换行符。我试过将 Environment.NewLine 直接放在字符串中。

...created or modified. " + Environment.Newline + Environment.NewLine + Request.Url.ToString();

这基本上给了我相同的结果。我尝试用<br /> 替换\n,它不添加换行符,并且由于某种原因,也不显示URL。我只能猜测问题与 HtmlAttributeEncode() 并让它正确解析 NewLine 有关。我这里有什么遗漏吗?

【问题讨论】:

  • 你试过\r\n吗?
  • 您知道现在很多用户的计算机上都没有安装电子邮件客户端,而只是使用基于 Web 的邮件?也许这是一个您知道每个人都有 Outlook 的公司环境,但对于公共应用程序来说,这不是一个好主意。
  • 适用于企业 Intranet 应用程序,Outlook 是标准 PC 部署的一部分。那些将在 BYOD 设备上使用它的人不会通过它使用电子邮件。
  • 您正在 asp.net 服务器上打开一个进程。这是怎么回事?
  • 这段代码是在网络服务器上运行的吗? Process.Start 在服务器机器上运行,正如@maxbeaudoin 所暗示的那样。这在那个时候是行不通的。您需要在客户端计算机上运行一个应用程序才能调用 Process.Start。但是,您可以在网页中嵌入您的 mailto: URI。

标签: c# html asp.net


【解决方案1】:

您可能想在主体上尝试.Replace("\r\n", "<br />")您已完成主体编码。

【讨论】:

  • .Replace("\r\n", "
    ") 适用于 HTML 格式的电子邮件正文。
  • 这让我得到以下输出,仍然在一行上。 ...created or modified. <br />http://localhost:49768/BookingForm/538

  • 在 html 电子邮件中查看时将强制换行。
【解决方案2】:

您应该在这里使用StringBuilder 而不是字符串。

然后您可以执行以下操作:

StringBuilder builder = new StringBuilder();
builder.AppendLine(string.Format("A Booking Form for Project #{0} - {1}",lblProjectID.Text, lblProjectName.Text));
builder.AppendLine(string.Format(" - Release {0}  has been created or modified.", strReleaseName));
builder.AppendLine();
builder.AppendLine(Request.Url.ToString());
String strBody = builder.ToString();

您还可以在字符串创建中包含 (char)10 和 (char)13。例如:

string.Format("First Line{0}{1}Second Line", (char)10, (char)13);

【讨论】:

    【解决方案3】:

    Model.Message = "我的消息\n第二条消息";

    然后将此样式添加到字符串标记 style="white-space: pre-line;" 例如<h3 style="white-space: pre-line;">@Model.Message</h3>

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2013-11-14
      • 2015-12-02
      • 2011-06-26
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      相关资源
      最近更新 更多