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

18

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

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

  

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

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

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

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


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

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");
    }
}

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

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

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

有什么评论吗?


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