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

C# 如何将格式化的电子邮件地址解析为显示名称和电子邮件地址?,c#,parsing,mailaddress,C#,Parsing,Mailaddress,给定电子邮件地址:“Jim” 如果我尝试将此消息传递到MailAddress,则会出现异常: 指定的字符串不是电子邮件地址所需的格式 如何将此地址解析为显示名(Jim)和电子邮件地址(jim@example.com)在C#中 编辑:我正在寻找C代码来解析它 EDIT2:我发现MailAddress引发了异常,因为我在电子邮件地址字符串的开头有一个空格 试试看: "Jimbo <jim@example.com>" “Jimbo” 要解析您提供的字符串,请执行以下操作: string

给定电子邮件地址:“Jim”

如果我尝试将此消息传递到MailAddress,则会出现异常:

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

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

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

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

试试看:

"Jimbo <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));
string input=“\”Jimbo“jim@example.com";
string[]片段=input.Split(“”);
MailAddress ma=新邮件地址(条[1]。替换(“”,string.Empty),条[0]。替换(“\”,string.Empty));
试试“吉姆” 不确定它是否有效,但这是我在电子邮件客户端中通常看到的情况。

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

MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);
string[]strSet=inputEmailString.Split(“\”,“”); MailAddress mAddress=新邮件地址(strSet[0],strSet[2]);
如果假设2之间始终存在空格,则可以使用String.Split(“”)在空格上拆分。这将为您提供一个拆分了部分的数组

所以可能是这样的:

string str = "\"Jimbo\" jim@example.com"
string[] parts = str.Trim().Replace("\"","").Split(' ')
需要检查的一个问题是,如果显示名称中有空格,它将被拆分为数组中的两个或多个项目,但电子邮件始终是最后一个


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

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

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

类程序
{
静态void Main(字符串[]参数)
{
字符串email=“\”Jimbo\”;
Console.WriteLine(parseEmail(email));
}
私有静态字符串解析电子邮件(字符串输入字符串)
{
正则表达式r=
新的正则表达式(^((?:(?:(?:[a-zA-Z0-9][\.-\+\++])*)[a-zA-Z0-9]+)\((?:(?:[a-zA-Z0-9][\.-\.-\\+])+([a-zA-Z0-9]{2,6})”;
string[]标记=inputString.Split(“”);
foreach(令牌中的字符串s)
{
字符串温度=s;
温度=温度微调开始(“”);
如果(r.匹配(临时)成功)
返回温度;
}
抛出新的ArgumentException(“不是电子邮件地址”);
}
}
这有点“粗略且准备就绪”,但适用于您给出的示例:

        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('>');
        }
字符串emailAddress,displayname;
字符串unparsedText=“\”Jimbo\”;

string[]emailParts=unparsedText.Split(新字符[]{'如果要手动解析电子邮件地址,请阅读RFC2822()。第3.4节讨论地址格式

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

根据
邮件地址的MSDN文档

它应该能够解析带有显示名称的地址。他们给出了
“Tom Smith”
作为一个例子。也许引号是问题所在?如果是,只需去掉引号并使用MailAddress解析其余的

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

MailAddress address = new MailAddress(emailAddress.Replace("\"", ""));
string emailAddress=“\”Jim\”;
MailAddress=新的邮件地址(emailAddress.Replace(“\”,”);

如果可以避免的话,手动解析RFC2822是不值得的。

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

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]);
string addrin=“\”吉姆·史密斯\”;
字符[]方括号={''};
字符串[]个数=addrin.Split(括号);
件[0]=件[0]
.子字符串(0,个数[0]。长度-1)
.Replace(“\”,string.Empty);
MailAddress ma=新的邮寄地址(件[1],件[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);
string emailTo=“\”Jim\”;
[a-z0-10-9 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7)10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10[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]|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)”;
字符串emailAddress=Regex.Match(emailTo.ToLower(),emailRegex).Value;
字符串displayName=null;
尝试
{
displayName=emailTo.Substring(0,emailTo.ToLower().IndexOf(emailAddress)-1);
}
抓住
{
//没有显示名称
}
MailAddress addr=新的邮件地址(emailAddress,displayName);

注释?

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

1-你不知道它被拒绝的确切原因。最直接的可能是它有一个黑名单,例如.com

2-您想要的真正解决方案可能是实现一个严格的验证器。堆栈溢出可能是一个很好的开发此功能的地方,因为有很多具有实际经验的人

以下是您需要的几件事:

  • 修剪空白和明显粗糙
  • 解析为各个部分(显示名称、地址左侧、地址右侧)
  • 使用特定于数据结构的验证器验证其中的每一项。例如,右侧必须是有效的FQDN(如果您使用的是开放式邮件系统,则为非限定主机名)
  • 这是解决这个问题的最佳长期方法。

    对我来说很有效:

    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);
    
    string s=“\'Jim\”;
    System.Net.Mail.MailAddress a=新的System.Net.Mail.MailAddress;
    Debug.WriteLine(“DisplayName:+a.DisplayName”);
    Debug.WriteLine(“地址:+a.Address”);
    
    MailAddress类有一个解析电子邮件地址的私有方法。我不知道它有多好,但我倾向于使用它,而不是自己编写。

    我可以建议
    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);
    
    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);