【问题标题】:How to get Multiline string如何获取多行字符串
【发布时间】:2022-02-23 01:07:12
【问题描述】:

如何在C#中存储一条语句例如如下方式

string EmailBody = "Request no.- ('" + objUserModel.ID + "') has been raised for special 
                            vehicle by requester-( '" + RequesterInfo + "'). " + 
                            "ORG_Unit:'"+ objUserModel.OrgUnit + "'" +
                            "TDC:'"+ objUserModel.TDC + "'" +
                            "Customer Name:'"+ objUserModel.CustName + "'" +
                            "Supply Plant:'"+ objUserModel.CustName + "'";

我试图在电子邮件中以多行显示此变量,因为我需要将它存储在字符串中的多行中。

我见过@$"" 的变体,但它对我不起作用。

【问题讨论】:

  • 电子邮件是纯文本还是 HTML?
  • 电子邮件正文可以解释为 HTML。每次需要换行时都可以添加<br/>
  • @phuzi 电子邮件将是纯文本
  • @Xavier 你能给出一个代码示例
  • 如果没有实际生成 HTML 正文并指定正确的标头,就不能将电子邮件正文视为 HTML。如果您的问题是How can I send well-formatted multiline emails,那么答案是Use MailKit and create an HTML message as shown here

标签: c# string


【解决方案1】:

查看用于包含字段值的插值字符串。

对于新行,需要注意三个不同的项目:Enivronment.NewLine 常量、\n 字符文字和 HTML <br> 元素。最后一点对于使用 HTML 正文的电子邮件尤其重要。

在这种情况下,我建议使用 C# 多行字符串文字,并为额外的结束行添加一个插值,您可以根据平台的需要设置或不设置。

所以你最终得到了这个:

string br = ""; // set this to "<br>" for HTML emails

string EmailBody = 
$@"Request no.- ('{objUserModel.ID}') has been raised for special{br}
vehicle by requester-( '{RequesterInfo}').{br}
{br}
ORG_Unit:'{objUserModel.OrgUnit}'{br}
TDC:'{objUserModel.TDC}'{br}
Customer Name:'{objUserModel.CustName}'{br}
Supply Plant:'{objUserModel.CustName}'";

原始代码由于串联而出现问题。字符串的每一行代码在最后都被分解成这样:" +,在下一行继续使用新的字符串文字。这样,代码中的换行符在结果字符串中丢失了。

此处的代码通过将所有内容放入相同的字符串文字来解决此问题。只有一组双引号定义了整个字符串,现在包括代码中内置的换行符。使用此技术需要注意的一件事是,您希望将字符串一直向左移动,而不管代码中的任何其他缩进。

【讨论】:

  • 这不起作用
  • 您按照建议设置“
    ”后是否尝试过?
  • 所以我应该设置字符串 br = ""
    ""
  • 很抱歉与兄弟合作,谢谢
【解决方案2】:

我建议加入行与必需的delimiter,例如

// Set "<br/>" if you want HTML delimiter  
// Put "\n" to have a new line, 
// Use Environment.NewLine to have OS specific delimiter
string delimiter = "<br/>";

string EmailBody = string.Join(delimiter,
  $"Request no.- ('{objUserModel.ID}') has been raised for special vehicle by requester-( '{RequesterInfo}'). ",
  $"ORG_Unit:'{objUserModel.OrgUnit}'",
  $"TDC:'{objUserModel.TDC}'",
  $"Customer Name:'{objUserModel.CustName}'",
  $"Supply Plant:'{objUserModel.CustName}'"
);

【讨论】:

    【解决方案3】:

    您可以使用逐字字符串创建多行字符串,即以@ 开头的字符串。 $ 用于对普通字符串和逐字字符串进行字符串插值。 但是这并不意味着它们会像您期望的那样出现在电子邮件正文中。

    回答您的具体问题,这将创建一个多行字符串:

        string EmailBody = $@"Request no.- ('{objUserModel.ID}') has been raised for special 
                            vehicle by requester-'({RequesterInfo}'). 
                            ORG_Unit:'{objUserModel.OrgUnit}'
                            TDC:'{objUserModel.TDC}'
                            Customer Name:'{objUserModel.CustName }'
                            Supply Plant:'{objUserModel.CustName}'";
    

    打印出来:

    Request no.- ('3') has been raised for special 
                                vehicle by requester-'(123456'). 
                                ORG_Unit:'Blah'
                                TDC:'XYZ'
                                Customer Name:'Gone'
                                Supply Plant:'Gone'
    

    所有制表符和空格都包含在字符串中。为避免这种情况,每行开头都应不缩进:

            string EmailBody = @$"Request no.- ('{objUserModel.ID}') has been raised for special 
    vehicle by requester-'({RequesterInfo}'). 
    ORG_Unit:'{objUserModel.OrgUnit}'
    TDC:'{objUserModel.TDC}'
    Customer Name:'{objUserModel.CustName }'
    Supply Plant:'{objUserModel.CustName}'";
    

    这会产生:

    Request no.- ('3') has been raised for special 
    vehicle by requester-'(123456'). 
    ORG_Unit:'Blah'
    TDC:'XYZ'
    Customer Name:'Gone'
    Supply Plant:'Gone'
    

    运算符的顺序并不重要。 @$ 的行为与 $@ 相同。

    发送格式正确的电子邮件

    这是一个不同的问题,其答案以Don't Use .NET's SmtpClient开头。 documentation page of the class 警告:

    我们不建议您将 SmtpClient 类用于新开发,因为 SmtpClient 不支持许多现代协议。请改用MailKit 或其他库。有关详细信息,请参阅 SmtpClient 不应在 GitHub 上使用。

    使用 MailKit 发送消息所需的代码类似于旧的 SmptClient。

    using (var client = new SmtpClient ()) 
    {
        await client.ConnectAsync("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect);
        await client.AuthenticateAsync("username", "password");
        await client.SendAsync(message);
    
        await client.DisconnectAsync(true);
    }
    

    Create Messages 页面展示了如何创建纯文本或 HTML 消息。一些较旧的电子邮件客户端不支持 HTML,因此通常需要同时创建纯文本和 HTML 消息。

    字符串插值和逐字字符串可用于为这两个部分创建文本:

    string plainBody = @$"Request no.- ('{objUserModel.ID}') has been raised for special 
    vehicle by requester-'({RequesterInfo}'). 
    ORG_Unit:'{objUserModel.OrgUnit}'
    TDC:'{objUserModel.TDC}'
    Customer Name:'{objUserModel.CustName }'
    Supply Plant:'{objUserModel.CustName}'";
    
    string htmlBody = @$"<div>Request no.- ('{objUserModel.ID}') has been raised for special 
    vehicle by requester-'({RequesterInfo}').
    </div>
    <dl>
        <dt>ORG_Unit:</dt><dd>'{objUserModel.OrgUnit}'</dd>
        <dt>TDC:</dt><dd>'{objUserModel.TDC}'</dd?
        <dt>Customer Name:</dt><dd>'{objUserModel.CustName }'</dd?
        <dt>Supply Plant:</dt><dd>'{objUserModel.CustName}'</dd>
    </dl>";
    

    这些可以与以下内容组合在一封电子邮件中:

    var message = new MimeMessage ();
    message.From.Add (new MailboxAddress ("Blah Blah", "blah@gmail.com"));
    
    message.Subject = "Special Request";
    
    var builder = new BodyBuilder ();
    builder.TextBody = plainBody;
    builder.HtmlBody = htmlBody;
    
    message.Body = builder.ToMessageBody ();
    

    【讨论】:

    • 运算符的顺序并不重要 - 除非您使用的是 8.0 之前的 C#,在这种情况下它需要是 $@
    • 这不起作用
    • 什么不起作用?我发布了实际生成的多行字符串。这并不意味着电子邮件客户端会正确显示多行字符串。
    • @sandeeppradhan 我添加了代码,展示了如何创建和发送包含多行纯正文消息和 HTML 正文的电子邮件
    【解决方案4】:

    尝试在需要换行符的地方使用+ Environment.NewLine

    【讨论】:

      【解决方案5】:
      + "vehicle by requester - ('" + RequesterInfo + "'). " + "\n" + "ORG_Unit:'" + objUserModel.OrgUnit + "'" + "\n"
      + "TDC:'" + objUserModel.TDC + "'" + "\n" + "Customer Name:'" + objUserModel.CustName + "'" + "\n"
      + "Supply Plant:'" + objUserModel.CustName + "'";```
      
      If i have understood it correctly you just add ```+ "\n" +```
      

      【讨论】:

      • "'). " + "\n" + "ORG_Unit:'" - 我一直想知道为什么人们会做这种不必要的连接
      • 你需要在开头添加```我无法获得整个代码吗?
      【解决方案6】:

      使用字符串插值,您可以在这里实现您想要做的事情,例如:

      string EmailBody = $"Request no.- ('\"{objUserModel.ID}\"') has been raised 
      

      注意“之前的\”

      如果您想在字符串中添加新行,您可以添加 string1 $" 这个字符串写在一行上"; string2 $" 这个字符串\n写在两行";

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 2017-06-19
        • 2013-03-29
        相关资源
        最近更新 更多