Как проанализировать отформатированный адрес электронной почты в отображаемое имя и адрес электронной почты?

синхронизированный простой означает, что два потока не могут одновременно обращаться к блоку / методу. Когда мы говорим, что любой блок / метод класса синхронизирован, это означает, что только один поток может обращаться к ним за раз. Внутренний поток, который пытается получить к нему доступ, сначала берет блокировку этого объекта, и пока эта блокировка недоступна, ни один другой поток не может получить доступ к любому из синхронизированных методов / блоков этого экземпляра класса.

Обратите внимание, что другой поток может получить доступ к методу того же объекта, который не определен для синхронизации. Поток может освободить блокировку, вызвав

Object.wait()
14
задан Dylan 6 October 2008 в 18:38
поделиться

12 ответов

Если Вы надеетесь анализировать адрес электронной почты вручную, Вы хотите считать RFC2822 ( https://tools.ietf.org/html/rfc822.html#section-3.4). Разделите 3,4 переговоров о формате адреса.

, Но адреса электронной почты парсинга правильно не легко, и MailAddress должен смочь обработать большинство сценариев.

Согласно документации MSDN для MailAddress:

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 не стоит проблемы, если можно избежать его.

20
ответ дан 1 December 2019 в 10:19
поделиться

Работы для меня:

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 имеет закрытый метод, который анализирует адрес электронной почты. Не знайте, насколько хороший это, но я был бы склонен использовать его вместо того, чтобы писать мое собственное.

4
ответ дан 1 December 2019 в 10:19
поделиться

Попытка:

"Jimbo <jim@example.com>"
2
ответ дан 1 December 2019 в 10:19
поделиться

попытка: "Jim" < jim@example.com> не уверенный, если это будет работать, но это - то, как я обычно вижу его в почтовых клиентах.

0
ответ дан 1 December 2019 в 10:19
поделиться

при создании предположения всегда существует пространство между этими 2, Вы могли бы просто использовать Строку. Разделение ('') для разделения его на пробелах. Это дало бы Вам массив с разделением частей.

поэтому, возможно, как это:

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

проблема с этим для проверки на - то, что, если отображаемое имя имеет пространство в нем, оно будет разделено на 2 или больше объекта в массиве самом, но электронная почта всегда была бы последней.

Редактирование - Вы, возможно, также должны были бы вырезать скобки, просто добавить замены теми.

0
ответ дан 1 December 2019 в 10:19
поделиться

Я просто описал это, это захватывает первый хорошо сформированный адрес электронной почты из строки. Тем путем Вы не должны принимать, где адрес электронной почты находится в строке

Партии простора для совершенствования, но я должен уехать в работу :)

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");
    }
}
0
ответ дан 1 December 2019 в 10:19
поделиться

Это немного "грубо и готово", но будет работать на пример, который Вы дали:

        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('>');
        }
0
ответ дан 1 December 2019 в 10:19
поделиться
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));
0
ответ дан 1 December 2019 в 10:19
поделиться
string inputEmailString = "\"Jimbo\" <jim@example.com>";
string[] strSet =  inputEmailString.Split('\"','<','>');   

MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);
0
ответ дан 1 December 2019 в 10:19
поделиться

Для обработки встроенных пробелов разделите на скобках, следующим образом:

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]);
0
ответ дан 1 December 2019 в 10:19
поделиться

Так, это - то, что я сделал. Это немного быстро и грязно, но, кажется, работает.

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

Комментарии?

0
ответ дан 1 December 2019 в 10:19
поделиться

Я не кодирую на этом языке, но я вижу две проблемы, которые Вы могли бы хотеть проверить:

1-Вы не знаете точно, почему это было отклонено. На непосредственной возможности был то, что она имеет черный список для example.com.

2-действительное решение, которое Вы хотите, состоит в том, чтобы, вероятно, реализовать строгий блок проверки допустимости. Переполнение стека является, вероятно, хорошим местом для разработки этого, потому что существует много людей с практическим опытом.

Вот пара вещей, в которых Вы нуждаетесь:

  1. пробел для обрезки и очевидно хлам.
  2. синтаксический анализ в отдельные части (отображаемое имя, левая сторона адреса, правая сторона адреса).
  3. проверяют каждый из них со структурой данных определенный блок проверки допустимости. Например, правая сторона должна быть допустимым FQDN (или дисквалифицированное имя хоста, если Вы находитесь в либеральной почтовой системе).

Это - лучший долгосрочный подход к решению этой проблемы.

0
ответ дан 1 December 2019 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: