2014-04-04 16 views
5

Sto utilizzando la creazione di Windows 8.1 Store App in WinRT.Impossibile creare una nuova posta con più destinatari con mailto uri

Non riesco a creare una nuova posta con più destinatari con il mailto uri separando ogni e-mail con virgola o punto e virgola, entrambi mi danno lo stesso errore.

Invalid URI: The hostname could not be parsed. 

il mailto stringhe assomiglia a questo

"mailto:[email protected],[email protected]" 
"mailto:[email protected],[email protected]," 
"mailto:[email protected], [email protected]" 
"mailto:[email protected];[email protected]" 
"mailto:[email protected];[email protected];" 
"mailto:[email protected]; [email protected]" 

Ho provato tutte queste varianti un tutto mi danno lo stesso errore quando Newing l'URI, come questo.

var uri = new Uri(string.Format("mailto:{0}", mails)); 

ho idea che cosa sto facendo male, o nel caso in cui il suo non è implementato il motivo per cui non lo sarebbe?

ho creato un paio di unit test per vedere se eventuali variazioni avrebbe funzionato, ma no ..

[TestClass] 
public class UriMailToTest 
{ 
    private Uri CreateMailToUri(string mail) 
    { 
     if (string.IsNullOrEmpty(mail)) throw new ArgumentNullException("mail"); 

     var uriMailTo = string.Format("mailto:{0}", mail); 
     return new Uri(uriMailTo); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest1() 
    { 
     const string mailto = "[email protected]"; 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest2() 
    { 
     const string mailto = "[email protected],[email protected]"; 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest3() 
    { 
     const string mailto = "[email protected],[email protected],"; 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest4() 
    { 
     const string mailto = "[email protected];[email protected]"; 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest5() 
    { 
     const string mailto = "[email protected];[email protected];"; 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest6() 
    { 
     const string mailto = "[email protected], [email protected]"; 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest7() 
    { 
     const string mailto = "[email protected]; [email protected]"; 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest8() 
    { 
     var mails = new[] { "[email protected]", "[email protected]"}; 
     var mailto = mails.Select(WebUtility.UrlEncode).Aggregate((c, n) => string.Format("{0},{1}", c, n)); 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest9() 
    { 
     var mails = new[] { "[email protected]", "[email protected]" }; 
     var mailto = mails.Select(WebUtility.UrlEncode).Aggregate((c, n) => string.Format("{0};{1}", c, n)); 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest10() 
    { 
     var mails = new[] { "[email protected]", "[email protected]" }; 
     var mailto = mails.Aggregate((c, n) => string.Format("{0},{1}", c, n)); 
     var urlEncodedMailTo = WebUtility.UrlEncode(mailto); 
     var uri = CreateMailToUri(urlEncodedMailTo); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest11() 
    { 
     var mails = new[] { "[email protected]", "[email protected]" }; 
     var mailto = mails.Aggregate((c, n) => string.Format("{0};{1}", c, n)); 
     var urlEncodedMailTo = WebUtility.UrlEncode(mailto); 
     var uri = CreateMailToUri(urlEncodedMailTo); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest12() 
    { 
     var mails = new[] { "[email protected]", "[email protected]" }; 
     var mailto = mails.Select(WebUtility.UrlEncode).Aggregate((c, n) => string.Format("{0}, {1}", c, n)); 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest13() 
    { 
     var mails = new[] { "[email protected]", "[email protected]" }; 
     var mailto = mails.Select(WebUtility.UrlEncode).Aggregate((c, n) => string.Format("{0}; {1}", c, n)); 
     var uri = CreateMailToUri(mailto); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest14() 
    { 
     var mails = new[] { "[email protected]", "[email protected]" }; 
     var mailto = mails.Aggregate((c, n) => string.Format("{0}, {1}", c, n)); 
     var urlEncodedMailTo = WebUtility.UrlEncode(mailto); 
     var uri = CreateMailToUri(urlEncodedMailTo); 
     uri.Should().NotBeNull(); 
    } 

    [TestMethod] 
    public void CreateMailToUriTest15() 
    { 
     var mails = new[] { "[email protected]", "[email protected]" }; 
     var mailto = mails.Aggregate((c, n) => string.Format("{0}; {1}", c, n)); 
     var urlEncodedMailTo = WebUtility.UrlEncode(mailto); 
     var uri = CreateMailToUri(urlEncodedMailTo); 
     uri.Should().NotBeNull(); 
    } 
} 

con Tasto Windows + R (Run) digitando mailto: [email protected]; nomeutente2 @ mail.com funziona alla grande, non sono in grado di creare un oggetto Uri con più destinatari ...

Secondo lo mailto:Protocol @ msdn dovrei essere in grado di utilizzare il protocollo mailto con più destinatari.

Sintassi

mailto: sAddress [sHeaders]

Gettoni

sAddress 
    One or more valid e-mail addresses separated by a semicolon. You must use Internet-safe characters, such as %20 for the space character. 
sHeaders 
    Optional. One or more name-value pairs. The first pair should be prefixed by a "?" and any additional pairs should be prefixed by a "&". The name can be one of the following strings. 
subject 
    Text to appear in the subject line of the message. 
body 
    Text to appear in the body of the message. 
CC 
    Addresses to be included in the "cc" (carbon copy) section of the message. 
BCC 
    Addresses to be included in the "bcc" (blind carbon copy) section of the message. 
+0

Potrebbe provare con ' mailto:? [email protected] [email protected]; USERNAME3 @ mail.com'? – ohaal

+0

la cosa divertente è che funziona @ohaal ma 'mailto:? [email protected]; username2 @ mail.com' non funziona. – furier

+0

Come una soluzione sporca e sporca, che ne dici di generare una pagina web che viene caricata in background e apre 'mailto:' da lì? Qualcosa sulla falsariga di ' ' – ohaal

risposta

-4
cant you follow this code? 

    System.Net.Mail.MailMessage email = new System.Net.Mail.MailMessage(); 

    email.To.Add("[email protected]"); 
    email.CC.add("[email protected]"); 
    email.CC.add("[email protected]"); 
    email.CC.add("[email protected]"); 
+3

Potresti spiegare perché questa è una buona soluzione al problema. –

+0

Funziona ma non è la soluzione ed è una soluzione molto pessima. – furier

2

C'è un hack, utilizzando il HyperLinkButton (sor ry, questo è un hack sporco):

  1. Caricare un hyperlinkbutton utilizzando un XAmlReader,
  2. recuperarne il AutomationPeer,
  3. Avviare un click

    var uriString = "mailto:[email protected],[email protected]"; 
        string xamlString = "<HyperlinkButton " 
        + "xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" " 
        + "NavigateUri=\"" + uriString + "\"/>"; 
        var c = (HyperlinkButton)XamlReader.Load(xamlString); 
        new HyperlinkButtonAutomationPeer(c).Invoke(); 
    
Problemi correlati