gpt4 book ai didi

c# - 解析电子邮件地址字符串的最佳方法

转载 作者:可可西里 更新时间:2023-11-01 09:00:47 32 4
gpt4 key购买 nike

所以我正在处理一些电子邮件标题数据,对于 to:、from:、cc: 和 bcc: 字段,电子邮件地址可以用多种不同的方式表示:

First Last <name@domain.com>
Last, First <name@domain.com>
name@domain.com

这些变体可以出现在同一条消息中,以任何顺序出现,都在一个逗号分隔的字符串中:

First, Last <name@domain.com>, name@domain.com, First Last <name@domain.com>

我一直在尝试想出一种方法来将这个字符串解析为每个人的名字、姓氏和电子邮件(如果只提供电子邮件地址,则省略姓名)。

有人可以建议最好的方法吗?

我试过在逗号上拆分,除了在第二个例子中姓氏放在第一位外,它会起作用。我想这个方法可以工作,如果在我拆分之后,我检查每个元素并查看它是否包含'@'或'<'/'>',如果不包含那么可以假设下一个元素是名。这是解决这个问题的好方法吗?我是否忽略了地址可能采用的另一种格式?


更新:也许我应该澄清一点,基本上我想要做的就是将包含多个地址的字符串分解成包含地址的单独字符串,无论发送格式是什么。我有自己的验证方法和从地址中提取信息时,我很难找出分隔每个地址的最佳方法。

这是我想出的解决方案:

String str = "Last, First <name@domain.com>, name@domain.com, First Last <name@domain.com>, \"First Last\" <name@domain.com>";

List<string> addresses = new List<string>();
int atIdx = 0;
int commaIdx = 0;
int lastComma = 0;
for (int c = 0; c < str.Length; c++)
{
if (str[c] == '@')
atIdx = c;

if (str[c] == ',')
commaIdx = c;

if (commaIdx > atIdx && atIdx > 0)
{
string temp = str.Substring(lastComma, commaIdx - lastComma);
addresses.Add(temp);
lastComma = commaIdx;
atIdx = commaIdx;
}

if (c == str.Length -1)
{
string temp = str.Substring(lastComma, str.Legth - lastComma);
addresses.Add(temp);
}
}

if (commaIdx < 2)
{
// if we get here we can assume either there was no comma, or there was only one comma as part of the last, first combo
addresses.Add(str);
}

上面的代码生成了我可以进一步处理的各个地址。

最佳答案

有一个内部 System.Net.Mail.MailAddressParser 类,它有方法 ParseMultipleAddresses 可以完全满足您的需求。您可以通过反射或调用接受电子邮件列表字符串的 MailMessage.To.Add 方法直接访问它。

private static IEnumerable<MailAddress> ParseAddress(string addresses)
{
var mailAddressParserClass = Type.GetType("System.Net.Mail.MailAddressParser");
var parseMultipleAddressesMethod = mailAddressParserClass.GetMethod("ParseMultipleAddresses", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
return (IList<MailAddress>)parseMultipleAddressesMethod.Invoke(null, new object[0]);
}


private static IEnumerable<MailAddress> ParseAddress(string addresses)
{
MailMessage message = new MailMessage();
message.To.Add(addresses);
return new List<MailAddress>(message.To); //new List, because we don't want to hold reference on Disposable object
}

关于c# - 解析电子邮件地址字符串的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/451529/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com