14

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

如果我尝试将其传递给 MailAddress,则会出现异常:

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

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

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

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

4

13 回答 13

20

如果您希望手动解析电子邮件地址,则需要阅读 RFC2822 ( https://www.rfc-editor.org/rfc/rfc822.html#section-3.4 )。3.4 节讨论地址格式。

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

根据 MSDN 文档MailAddress

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 是不值得的。

于 2008-10-02T15:40:53.023 回答
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 类有一个解析电子邮件地址的私有方法。不知道它有多好,但我倾向于使用它而不是自己编写。

于 2008-10-02T17:16:12.187 回答
2

尝试:

"Jimbo <jim@example.com>"
于 2008-10-02T14:46:01.250 回答
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));
于 2008-10-02T14:46:02.390 回答
0

try: "Jim" <jim@example.com> 不确定它是否会起作用,但这就是我通常在电子邮件客户端中看到它的方式。

于 2008-10-02T14:46:04.713 回答
0
string inputEmailString = "\"Jimbo\" <jim@example.com>";
string[] strSet =  inputEmailString.Split('\"','<','>');   

MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);
于 2008-10-02T14:46:48.457 回答
0

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

所以可能是这样的:

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

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

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

于 2008-10-02T14:49:05.223 回答
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");
    }
}
于 2008-10-02T14:49:54.970 回答
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('>');
        }
于 2008-10-02T14:51:21.910 回答
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]);
于 2008-10-02T16:08:27.793 回答
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);

评论?

于 2008-10-02T16:23:21.097 回答
0

我没有用这种语言编写代码,但我看到了两个您可能想要检查的问题:

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

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

以下是您需要的几件事:

  1. 修剪空白和明显的杂乱无章。
  2. 解析成单独的部分(显示名称、地址左侧、地址右侧)。
  3. 使用特定于数据结构的验证器验证其中的每一个。例如,右侧需要是有效的 FQDN(如果您在自由邮件系统上,则需要是不合格的主机名)。

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

于 2008-10-02T16:42:31.533 回答
0

我可以建议我的基于正则表达式的解决方案来解码电子邮件地址字段值(“发件人”、“收件人”)和字段值“主题”

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

于 2017-07-26T17:06:12.673 回答