【问题标题】:MailTo URI object in .NET?.NET 中的 MailTo URI 对象?
【发布时间】:2011-08-09 21:19:15
【问题描述】:

给定一个 URI(确认为 Uri.UriSchemeMailto),是否有一个可以强制转换的对象提供 mailto 属性?

就像.TargetURI{mailto:your@email.com?subject=I'm all done&body=Finished&cc=his@email.com&bcc=her@email.com}一个将其作为 URI 并返回 MailTo 属性的对象?喜欢

伪代码

Dim mailDetails as New MailDetailsObject(MyURI.TargetURI)

Console.WriteLine(mailDetails.To)
Console.WriteLine(mailDetails.CC)
Console.WriteLine(mailDetails.BCC)
Console.WriteLine(mailDetails.Subject)
Console.WriteLine(mailDetails.Body)

结果:

your@email.com
他的@email.com
她@email.com
我已经完成了
完成

或者这是人们通常只是手动解析或构造 .TargetURI 下的属性的东西吗?

【问题讨论】:

    标签: .net uri mailto


    【解决方案1】:

    我不知道有哪个类可以做到这一点,但您可以使用HttpUtility.ParseQueryString() 方法轻松提取它:

    var mailto = "mailto:your@email.com?subject=I'm all done&body=Finished&cc=his@email.com&bcc=her@email.com";
    var values = HttpUtility.ParseQueryString(mailto.Split('?')[1]);
    var subject = values["subject"];
    var body = values["body"];
    var cc = values["cc"];
    

    【讨论】:

      【解决方案2】:

      我最终为此编写了自己的课程。它并不完整,也没有使用模式的所有可能部分对其进行测试,但对于大多数 mailto 来说,它似乎工作得很好。随意编辑此答案并进行改进。

      Class MailToItem
          Public Property [To] As String
          Public Property Cc As String
          Public Property Subject As String
          Public Property Body As String
          Public Property Bcc As String
          Private _mailToParameters As String()
          Sub New(uri As String)
              Dim mailtoString As String() = uri.Split("?")
              Me.To = GetEmailToRecipients(mailtoString(0).Split(":")(1))
              _mailToParameters = mailtoString(1).Split("&")
              SetOtherEmailRecipients()
              SetSubject()
              SetBody()
          End Sub
          Private Sub SetOtherEmailRecipients()
              Me.Cc = GetEmailRecipients("cc")
              Me.Bcc = GetEmailRecipients("bcc")
          End Sub
          Private Function GetEmailRecipients(type As String) As String
              Dim recipients As String = Field(type)
              If recipients IsNot Nothing Then
                  Dim recipientsAll() As String
                  recipientsAll = recipients.Split("=")(1).Split(",")
                  Dim s As New System.Text.StringBuilder
                  If recipientsAll.Count > 1 Then
                      For r = 0 To recipientsAll.Count - 1
                          If r < recipientsAll.GetUpperBound(0) Then
                              s.Append(recipientsAll(r) + ";")
                          Else
                              s.Append(recipientsAll(r))
                          End If
                      Next
                  Else
                      s.Append(recipientsAll(0))
                  End If
                  Return s.ToString
              Else
                  Return ""
              End If
          End Function
          Private Function Field(type As String) As String
              Return _mailToParameters.Where(Function(f) f.StartsWith(type, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault
          End Function
          Private Function GetEmailToRecipients(toString As String) As String
              Dim recipientsAll() As String = toString.Split(",")
              Dim s As New System.Text.StringBuilder
                  If recipientsAll.Count > 1 Then
                      For r = 0 To recipientsAll.Count - 1
                          If r < recipientsAll.GetUpperBound(0) Then
                              s.Append(recipientsAll(r) + ";")
                          Else
                              s.Append(recipientsAll(r))
                          End If
                      Next
                  Else
                      s.Append(recipientsAll(0))
                  End If
                  Return s.ToString
          End Function
          Private Sub SetSubject()
              Dim subject As String = Field("subject")
              If subject IsNot Nothing Then
                  Me.Subject = NormalizeText(subject.Split("=")(1))
              End If
          End Sub
          Private Sub SetBody()
              Dim body As String = Field("body")
              If body IsNot Nothing Then
                  Me.Body = NormalizeText(body.Split("=")(1))
              End If
          End Sub
          Private Function NormalizeText(text As String) As String
              text.Replace("%20", " ")
              text.Replace("%0A%0A", Environment.NewLine + Environment.NewLine)
              text.Replace("%0A", Environment.NewLine)
              text.Replace("%0D", Environment.NewLine)
              Return text
          End Function
      End Class
      

      请注意,将.TargetURI 传递给构造函数可能会导致失败,因为它似乎没有涵盖完整的架构。例如 mailto:john@jim.com,jim@john.com(两个收件人)将导致 .TargetURI 失败。在这种情况下,您可以改为传入.TargetURI.OriginalString

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 2012-06-28
        • 1970-01-01
        • 2018-02-16
        • 2019-06-21
        • 2015-07-19
        相关资源
        最近更新 更多