#.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
.