簡體   English   中英

如何將格式化的 email 地址解析為顯示名稱和 email 地址?

[英]How to parse formatted email address into display name and email address?

給定 email 地址:“Jim”<jim@example.com>

如果我嘗試將其傳遞給 MailAddress,則會出現異常:

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

如何將此地址解析為顯示名稱 (Jim) 和 C# 中的 email 地址 (jim@example.com)?

編輯:我正在尋找 C# 代碼來解析它。

EDIT2:我發現 MailAddress 拋出了異常,因為我在 email 地址字符串的開頭有一個空格。

如果您想手動解析電子郵件地址,則需要閱讀 RFC2822 ( https://tools.ietf.org/html/rfc822.html#section-3.4 )。 3.4 節討論地址格式。

但是正確解析電子郵件地址並不容易, MailAddress應該能夠處理大多數情況。

根據MailAddress的 MSDN 文檔:

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 不值得麻煩。

對我有用:

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

嘗試:“Jim”<jim@example.com> 不確定它是否會起作用,但我通常在電子郵件客戶端中看到它。

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

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

如果您假設 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('>');
        }

要處理嵌入的空格,請在括號上拆分,如下所示:

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(如果您使用的是自由郵件系統,則必須是不合格的主機名)。

這是解決此問題的最佳長期方法。

我可以建議我的基於正則表達式的解決方案來解碼電子郵件地址字段值(“發件人”、“收件人”)和字段值“主題”

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

如果您按照建議使用MailKit ,那么您可以使用 MimeKit.MailboxAddress 的方法 Parse 和 TryParse。 這是一個例子。

[Test]
public void Should_Parse_EmailAddress_With_Alias()
{
    //Arrange
    var expectedAlias = "Jim";
    var expectedAddress = "jim@example.com";
    string addressWithAlias = "\"Jim\" <jim@example.com>";

    //Act
    var mailboxAddressWithAlias = MimeKit.MailboxAddress.Parse(addressWithAlias);

    //Assert
    Assert.AreEqual(expectedAddress, mailboxAddressWithAlias.Address);
    Assert.AreEqual(expectedAlias, mailboxAddressWithAlias.Name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM