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

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

Например, если .TargetURI был {mailto:[email protected]?subject=Я готов[email protected][email protected]}, есть ли объект, который примет это как 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)

Это приводит к:

[email protected]
[email protected]
[email protected]
I'm all done
Finished

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


person Todd Main    schedule 20.04.2011    source источник


Ответы (2)


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

var mailto = "mailto:[email protected]?subject=I'm all done&body=Finished&[email protected]&[email protected]";
var values = HttpUtility.ParseQueryString(mailto.Split('?')[1]);
var subject = values["subject"];
var body = values["body"];
var cc = values["cc"];
person John Sheehan    schedule 20.04.2011

Я закончил тем, что написал свой собственный класс для этого. Он неполный и не проверял его со всеми возможными частями схемы, но, похоже, он работает достаточно хорошо для большинства почтовых ящиков. Не стесняйтесь редактировать этот ответ с улучшениями.

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:[email protected],[email protected] (два получателя) приведет к сбою .TargetURI. В этом случае вы можете вместо этого передать .TargetURI.OriginalString.

person Todd Main    schedule 21.04.2011