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

时间:2008-10-02 14:42:36

标签: c# parsing mailaddress

给出电子邮件地址:“Jim”< jim@example.com>

如果我尝试将此传递给MailAddress,我会得到异常:

  

指定的字符串不是电子邮件地址所需的格式。

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

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

EDIT2:我发现MailAddress抛出了异常,因为我在电子邮件地址字符串的开头有一个空格。

13 个答案:

答案 0 :(得分:20)

如果您要手动解析电子邮件地址,则需要阅读RFC2822(https://tools.ietf.org/html/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 :(得分:4)

适合我:

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 :(得分:2)

尝试:

"Jimbo <jim@example.com>"

答案 3 :(得分: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));

答案 4 :(得分:0)

尝试:“Jim”&lt; jim@example.com> 不知道它是否有效,但这就是我在电子邮件客户端中通常看到的情况。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

如果你假设2之间总是有空格,你可以使用String.Split('')在空格上分割它。这会给你一个分割部分的数组。

所以也许这样:

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

要检查的问题是,如果显示名称中有空格,则会将其拆分为数组本身中的2个或更多项目,但电子邮件将始终为最后一个。

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

答案 7 :(得分:0)

我刚刚写了这个,它从一个字符串中抓取了第一个格式良好的电子邮件地址。这样您就不必假设电子邮件地址在字符串中的位置

有很多改进空间,但我需要离开工作:)

class Program
{
    static void Main(string[] args)
    {
        string email = "\"Jimbo\" <jim@example.com>";
        Console.WriteLine(parseEmail(email));
    }

    private static string parseEmail(string inputString)
    {
        Regex r = 
            new Regex(@"^((?:(?:(?:[a-zA-Z0-9][\.\-\+_]?)*)[a-zA-Z0-9])+)\@((?:(?:(?:[a-zA-Z0-9][\.\-_]?){0,62})[a-zA-Z0-9])+)\.([a-zA-Z0-9]{2,6})$");

        string[] tokens = inputString.Split(' ');

        foreach (string s in tokens)
        {
            string temp = s;
            temp = temp.TrimStart('<'); temp = temp.TrimEnd('>');

            if (r.Match(temp).Success)
                return temp;
        }

        throw new ArgumentException("Not an e-mail address");
    }
}

答案 8 :(得分:0)

它有点“粗糙和准备好”,但会适用于你给出的例子:

        string emailAddress, displayname;
        string unparsedText = "\"Jimbo\" <jim@example.com>";
        string[] emailParts = unparsedText.Split(new char[] { '<' });

        if (emailParts.Length == 2)
        {
            displayname = emailParts[0].Trim(new char[] { ' ', '\"' });
            emailAddress = emailParts[1].TrimEnd('>');
        }

答案 9 :(得分:0)

要处理嵌入空格,请在括号中拆分,如下所示:

string addrin = "\"Jim Smith\" <jim@example.com>";
char[] bracks = {'<','>'};
string[] pieces = addrin.Split(bracks);
pieces[0] = pieces[0]
  .Substring(0, pieces[0].Length - 1)
  .Replace("\"", string.Empty);
MailAddress ma = new MailAddress(pieces[1], pieces[0]);

答案 10 :(得分:0)

所以,这就是我所做的。它有点快速和肮脏,但似乎有效。

string emailTo = "\"Jim\" <jim@example.com>";
string emailRegex = @"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])";
string emailAddress = Regex.Match(emailTo.ToLower(), emailRegex).Value;
string displayName = null;

try
{
    displayName = emailTo.Substring(0, emailTo.ToLower().IndexOf(emailAddress) - 1);
}
catch 
{
    // No display name 
}

MailAddress addr = new MailAddress(emailAddress, displayName);

评论

答案 11 :(得分:0)

我不使用这种语言编写代码,但我发现您可能需要检查两个问题:

1-您不确切地知道它被拒绝的原因。立即可能的是它有example.com的黑名单。

2-您想要的真正解决方案是实现严格的验证器。 Stack Overflow可能是开发此项目的好地方,因为有很多人具有实践经验。

以下是您需要的几件事:

  1. 修剪空白,显然是残缺的。
  2. 解析为个别部分(显示名称,地址的左侧,地址的右侧)。
  3. 使用特定于数据结构的验证器验证其中的每一个。例如,右侧需要是有效的FQDN(如果您使用的是自由邮件系统,则需要是非限定主机名)。
  4. 这是解决这个问题的最佳长期方法。

答案 12 :(得分:0)

我可以建议我的基于正则表达式的解决方案来解码电子邮件地址字段值(&#34;来自&#34;,&#34;到&#34;)和字段值&#34;主题&#34;

https://www.codeproject.com/Tips/1198601/Parsing-and-Decoding-Values-of-Some-Email-Message