【问题标题】:Unable to create a new mail with multiple recipients with mailto uri无法使用 mailto uri 创建具有多个收件人的新邮件
【发布时间】:2014-04-04 12:36:26
【问题描述】:

我正在 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 有效,但 mailto:?to=username@mail.com;username2@mail.com 无效。
  • 作为一个肮脏、肮脏的解决方法,如何生成一个在后台加载并从那里打开mailto: 的网页?类似于<script>location.href = "mailto:username@mail.com;username2@mail.com";</script>

标签: c# email windows-runtime windows-store-apps uri


【解决方案1】:

有一个黑客,使用HyperLinkButton(对不起,这是一个肮脏的黑客):

  1. 使用XAmlReader 加载hyperlinkbutton
  2. 检索其AutomationPeer
  3. 启动点击

      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();
    

【讨论】:

    【解决方案2】:

    尝试在主机名后添加 2 个正斜杠,如下所示:mailto://

    【讨论】:

      【解决方案3】:
      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");
      

      【讨论】:

      • 您能否解释一下为什么这是解决问题的好方法。
      • 这可行,但它不是解决方案,而且它是一个非常非常糟糕的解决方法 imo。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多