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