如何将格式化的电子邮件地址解析为显示名称和电子邮件地址?

18

给定电子邮件地址:"Jim" <jim@example.com>

如果我尝试将其传递给MailAddress,我会收到以下异常:

  

指定的字符串不符合电子邮件地址的要求。

如何在C#中解析此地址为显示名称(Jim)和电子邮件地址(jim@example.com)?

编辑:我正在寻找解析它的C#代码。

编辑2:我发现由于电子邮件地址字符串开头有空格而导致MailAddress抛出异常。


我可以建议使用 MimeKit 吗?它是一个非常符合标准的库,能够正确解析电子邮件地址。 - Roy Tinker
可能是如何解析格式为“名称<电子邮件>”的字符串的重复问题。 - Michael Freidgeim
14个回答

21

如果您想手动解析电子邮件地址,建议阅读RFC2822 (https://www.rfc-editor.org/rfc/rfc822.html#section-3.4)。第3.4节讨论了地址格式。

但是正确解析电子邮件地址并不容易,MailAddress 应该能够处理大多数场景。

根据 MailAddress 的MSDN文档:

http://msdn.microsoft.com/en-us/library/591bk9e8.aspx

它应该能够解析带有显示名称的地址。他们给出了一个例子: "Tom Smith <tsmith@contoso.com>"。也许引号是问题所在?如果是这样,只需去掉引号并使用 MailAddress 解析其余部分即可。

string emailAddress = "\"Jim\" <jim@example.com>";

MailAddress address = new MailAddress(emailAddress.Replace("\"", ""));

如果可以避免的话,手动解析RFC2822格式并不值得麻烦。


1
太酷了 - 我从来不知道你可以只发送“Name email@domain.com”!我正要写另一个字符串分割函数 :) - TimS
2
也许会对某些人有帮助,我不得不使用这个小区别,因为它不接受一个空字符,因为 char 类型的每个可能值都是一个字符长。 MailAddress address = new MailAddress(emailAddress.Replace("\"", "")); - Soph

5

适用于我:

string s = "\"Jim\" <jim@example.com>";
System.Net.Mail.MailAddress a = new System.Net.Mail.MailAddress(s);
Debug.WriteLine("DisplayName:  " +  a.DisplayName);
Debug.WriteLine("Address:  " + a.Address);

MailAddress类有一个私有方法,用于解析电子邮件地址。不确定它的质量如何,但我倾向于使用它而不是编写自己的方法。


2

尝试:

"Jimbo <jim@example.com>"

0

如果你正在使用MailKit(作为推荐),那么你可以使用MimeKit.MailboxAddress的Parse和TryParse方法。这是一个例子。

[Test]
public void Should_Parse_EmailAddress_With_Alias()
{
    //Arrange
    var expectedAlias = "Jim";
    var expectedAddress = "jim@example.com";
    string addressWithAlias = "\"Jim\" <jim@example.com>";

    //Act
    var mailboxAddressWithAlias = MimeKit.MailboxAddress.Parse(addressWithAlias);

    //Assert
    Assert.AreEqual(expectedAddress, mailboxAddressWithAlias.Address);
    Assert.AreEqual(expectedAlias, mailboxAddressWithAlias.Name);
}

0

0
尝试一下:"Jim" <jim@example.com>,虽然不确定是否有效,但这通常是我在电子邮件客户端中看到的方式。

0
string inputEmailString = "\"Jimbo\" <jim@example.com>";
string[] strSet =  inputEmailString.Split('\"','<','>');   

MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);

我知道如何调用MailAddress,我需要解析给定地址的代码。 - Dylan

0

我不用这种语言编程,但是我看到两个问题你可能需要检查:

1- 你不知道它被拒绝的确切原因。一个可能性是它有一个针对example.com的黑名单。

2- 你想要的真正解决方案可能是实现一个严格的验证器。Stack Overflow可能是开发这个的好地方,因为有很多有实际经验的人。

以下是你需要的几件事:

  1. 修剪空格和明显的垃圾。
  2. 解析成单独的部分(显示名称,地址左侧,地址右侧)。
  3. 使用特定数据结构的验证器验证每个部分。例如,右侧必须是有效的FQDN(或者如果你在自由邮件系统上,则为未限定主机名)。

这是解决这个问题的最佳长期方法。


0
new MailAddress("jim@example.com", "Jimbo");

解析您提供的字符串:

string input = "\"Jimbo\" jim@example.com";
string[] pieces = input.Split(' ');
MailAddress ma = new MailAddress(pieces[1].Replace("<", string.Empty).Replace(">",string.Empty), pieces[0].Replace("\"", string.Empty));

0

如果您假设在两个单词之间始终有一个空格,那么您可以使用String.Split(' ')函数在空格处将其拆分,从而获得拆分后的部分数组。

所以大概可以像这样:

string str = "\"Jimbo\" jim@example.com"
string[] parts = str.Trim().Replace("\"","").Split(' ')

需要注意的一个问题是,如果显示名称中有空格,则它将在数组本身中分成2个或更多项,但电子邮件始终是最后一个。

编辑-您还可能需要编辑括号,只需用替换即可。


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