根据电子邮件地址:<!>“; Jim <!>”; LT <!>; jim@example.com GT <!>;

如果我尝试将此传递给MailAddress,我会得到异常:

  

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

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

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

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

有帮助吗?

解决方案

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

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

根据"Tom Smith <tsmith@contoso.com>"的MSDN文档:

http://msdn.microsoft.com/en-us/library /591bk9e8.aspx

它应该能够解析具有显示名称的地址。他们以<=>为例。也许报价是问题?如果是这样,只需删除引号并使用MailAddress解析其余部分。

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

MailAddress address = new MailAddress(emailAddress.Replace("\"", ""));

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

其他提示

适合我:

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

尝试:

"Jimbo <jim@example.com>"

尝试:<!>“吉姆<!>”; LT <!>; <!> jim@example.com GT; 不知道它是否有效,但这就是我在电子邮件客户端中通常看到的情况。

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

所以也许这样:

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

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

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

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

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

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

有点<!>“粗略且准备好了<!>”;但是会为你给出的例子工作:

        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('>');
        }
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));
string inputEmailString = "\"Jimbo\" <jim@example.com>";
string[] strSet =  inputEmailString.Split('\"','<','>');   

MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);

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

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

评论

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

1-您不确切地知道它被拒绝的原因。立即可能的是它有example.com的黑名单。

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

以下是您需要的几件事:

  1. 修剪空白,显然是残缺的。
  2. 解析为个别部分(显示名称,地址的左侧,地址的右侧)。
  3. 使用特定于数据结构的验证器验证其中的每一个。例如,右侧需要是有效的FQDN(如果您使用的是自由邮件系统,则需要是非限定主机名)。
  4. 这是解决这个问题的最佳长期方法。

我可以建议我的基于正则表达式的解决方案,用于解码电子邮件地址字段值(<!>“From <!> quot;,<!>; To <!>”;)和字段值<!>“;受试者QUOT <!>;

https:// www .codeproject.com /提示/ 1198601 /解析和解码值-的-一些-电子邮件-消息

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top