无法使用mailto链接创建带多个收件人的新邮件。

5
我正在使用WinRT创建一个Windows 8.1商店应用程序。使用mailto uri无法创建带有多个收件人的新邮件,无论使用逗号还是分号分隔每个电子邮件都会给出相同的错误。
Invalid URI: The hostname could not be parsed.

mailto字符串的格式如下:

"mailto:username@mail.com,username2@mail.com"
"mailto:username@mail.com,username2@mail.com,"
"mailto:username@mail.com, username2@mail.com"
"mailto:username@mail.com;username2@mail.com"
"mailto:username@mail.com;username2@mail.com;"
"mailto:username@mail.com; username2@mail.com"

我已经尝试了所有这些变体,但当我新建uri时都会出现相同的错误,就像这样。

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

我不知道我做错了什么,或者如果它没有被实现,为什么会这样?我创建了一些单元测试来看看是否有任何变化可以起作用,但是没有。
[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 = "username@mail.com";
        var uri = CreateMailToUri(mailto);
        uri.Should().NotBeNull();
    }

    [TestMethod]
    public void CreateMailToUriTest2()
    {
        const string mailto = "username@mail.com,username2@mail.com";
        var uri = CreateMailToUri(mailto);
        uri.Should().NotBeNull();
    }

    [TestMethod]
    public void CreateMailToUriTest3()
    {
        const string mailto = "username@mail.com,username2@mail.com,";
        var uri = CreateMailToUri(mailto);
        uri.Should().NotBeNull();
    }

    [TestMethod]
    public void CreateMailToUriTest4()
    {
        const string mailto = "username@mail.com;username2@mail.com";
        var uri = CreateMailToUri(mailto);
        uri.Should().NotBeNull();
    }

    [TestMethod]
    public void CreateMailToUriTest5()
    {
        const string mailto = "username@mail.com;username2@mail.com;";
        var uri = CreateMailToUri(mailto);
        uri.Should().NotBeNull();
    }

    [TestMethod]
    public void CreateMailToUriTest6()
    {
        const string mailto = "username@mail.com, username2@mail.com";
        var uri = CreateMailToUri(mailto);
        uri.Should().NotBeNull();
    }

    [TestMethod]
    public void CreateMailToUriTest7()
    {
        const string mailto = "username@mail.com; username2@mail.com";
        var uri = CreateMailToUri(mailto);
        uri.Should().NotBeNull();
    }

    [TestMethod]
    public void CreateMailToUriTest8()
    {
        var mails = new[] { "username@mail.com", "username2@mail.com"};
        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[] { "username@mail.com", "username2@mail.com" };
        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[] { "username@mail.com", "username2@mail.com" };
        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[] { "username@mail.com", "username2@mail.com" };
        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[] { "username@mail.com", "username2@mail.com" };
        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[] { "username@mail.com", "username2@mail.com" };
        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[] { "username@mail.com", "username2@mail.com" };
        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[] { "username@mail.com", "username2@mail.com" };
        var mailto = mails.Aggregate((c, n) => string.Format("{0}; {1}", c, n));
        var urlEncodedMailTo = WebUtility.UrlEncode(mailto);
        var uri = CreateMailToUri(urlEncodedMailTo);
        uri.Should().NotBeNull();
    }
}

使用 Windows 键 + R(运行)键入 mailto:username@mail.com;username2@mail.com 很方便,但我无法创建带有多个收件人的 Uri 对象...

根据 mailto:Protocol @ msdn,我应该能够使用带有多个收件人的 mailto 协议。 语法

mailto:sAddress[sHeaders]

标记
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.

你可以尝试使用mailto:username@mail.com?cc=username2@mail.com;username3@mail.com吗? - ohaal
有趣的是,@ohaal 是可以工作的,但是 mailto:?to=username@mail.com;username2@mail.com 却不起作用。 - furier
作为一个肮脏的、肮脏的解决办法,那么生成一个后台加载并从中打开mailto:的网页怎么样?类似于<script>location.href = "mailto:username@mail.com;username2@mail.com";</script>这样的内容。 - ohaal
似乎这不是微软第一次搞砸了。 - ohaal
3个回答

2

有一种hack方法,使用HyperLinkButton(抱歉,这是一种不太正规的方法):

  1. Load an hyperlinkbutton using a XAmlReader,
  2. Retrieve its AutomationPeer,
  3. Launch a click

      var uriString = "mailto:username@mail.com,username2@mail.com";
      string xamlString = "<HyperlinkButton "
         + "xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" " 
         + "NavigateUri=\"" + uriString + "\"/>";
      var c = (HyperlinkButton)XamlReader.Load(xamlString);
      new HyperlinkButtonAutomationPeer(c).Invoke();
    

1
尝试在主机名后添加两个斜杠,像这样:mailto://

-4
cant you follow this code?

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

  email.To.Add("abcd@mail.com");
  email.CC.add("abcd1@mail.com");
  email.CC.add("abcd2@mail.com");
  email.CC.add("abcd2@mail.com");

3
请问您能否解释一下为什么这是解决问题的好方法? - Matas Vaitkevicius
这个方法可以用,但并不是解决方案,而且在我看来是非常非常糟糕的权宜之计。 - furier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接