Я закончил писать свой собственный класс для этого. Он не завершен и не тестировал его со всеми возможными частями схемы, но, похоже, он работает достаточно хорошо для большинства 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
.