MailTo объект URI в .NET? - PullRequest
       21

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

1 голос
/ 21 апреля 2011

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

Как если бы .TargetURI было {mailto: your@email.com? subject = все готово & 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
his@email.com
her@email.com
I'm all done
Finished

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

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Я не знаю, какой класс это делает, но вы могли бы легко извлечь его с помощью метода 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"];
0 голосов
/ 21 апреля 2011

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...