Объект URI MailTo в .NET?

#.net #uri #mailto

#.net #uri #mailto

Вопрос:

Учитывая URI (который, как подтверждено, является Uri.UriSchemeMailto ), есть ли объект, к которому это может быть приведено, который предоставил бы свойства mailto?

Например, если .TargetURI было {mailto:your@email.com?subject=I я все doneamp;body=Finishedamp;cc=his@email.comamp;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
his@email.com
her@email.com
Я все закончил
ЗАКОНЧЕННЫЕ

Или это то, что люди обычно просто вручную анализируют или создают из свойств в .TargetURI ?

Ответ №1:

Я не знаю класса, который делает это, но вы могли бы легко извлечь его с помощью HttpUtility.ParseQueryString() метода:

 var mailto = "mailto:your@email.com?subject=I'm all doneamp;body=Finishedamp;cc=his@email.comamp;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("amp;")
        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(" ", " ")
        text.Replace("

", Environment.NewLine   Environment.NewLine)
        text.Replace("
", Environment.NewLine)
        text.Replace("
", Environment.NewLine)
        Return text
    End Function
End Class
  

Обратите внимание, что передача .TargetURI в конструктор может вызвать сбои, поскольку, похоже, он не охватывает всю схему. Например mailto:john@jim.com ,jim@john.com (два получателя) приведет .TargetURI к сбою. В этом случае вы можете вместо этого передать .TargetURI.OriginalString .