Вопрос

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

Вот исходный текст:

Thread-Topic: test subject
Thread-Index: AcwE4mK6Jj19Hgi0SV6yYKvj2/HJbw==
From: "Lastname, Firstname" <firstname_lastname@domain.com>
To: <testto@domain.com>, testto1@domain.com, testto2@domain.com
Cc: <testcc@domain.com>, test3@domain.com
X-OriginalArrivalTime: 27 Apr 2011 13:52:46.0235 (UTC) FILETIME=[635226B0:01CC04E2]

Я хочу вытащить следующее:

<testto@domain.com>, testto1@domain.com, testto2@domain.com

Я борюсь с Реджкой весь день без удачи.

Это было полезно?

Решение

В отличие от некоторых постов здесь, я должен согласиться с Mmutz, вы не можете проанализировать электронные письма с помощью корпорации ... см. Эта статья:

http://tools.ietf.org/html/rfc2822#section-3.4.1

3.4.1. Спецификация ADDR-SPEC

ADDR-SPEC-это конкретный интернет-идентификатор, который содержит локально интерпретируемую строку, за которой следует символ AT-SIGN («@», значение ASCII 64), за которым следует интернет-домен.

Идея «местного интерпретации» означает, что ожидается, что только приемной сервер сможет проанализировать его.

Если бы я попытался решить это, я бы обнаружил, что содержимое «до», разорвать его на части и попытаться проанализировать каждый сегмент с помощью System.net.mail.mailaddress.

    static void Main()
    {
        string input = @"Thread-Topic: test subject
Thread-Index: AcwE4mK6Jj19Hgi0SV6yYKvj2/HJbw==
From: ""Lastname, Firstname"" <firstname_lastname@domain.com>
To: <testto@domain.com>, ""Yes, this is valid""@[emails are hard to parse!], testto1@domain.com, testto2@domain.com
Cc: <testcc@domain.com>, test3@domain.com
X-OriginalArrivalTime: 27 Apr 2011 13:52:46.0235 (UTC) FILETIME=[635226B0:01CC04E2]";

        Regex toline = new Regex(@"(?im-:^To\s*:\s*(?<to>.*)$)");
        string to = toline.Match(input).Groups["to"].Value;

        int from = 0;
        int pos = 0;
        int found;
        string test;

        while(from < to.Length)
        {
            found = (found = to.IndexOf(',', from)) > 0 ? found : to.Length;
            from = found + 1;
            test = to.Substring(pos, found - pos);

            try
            {
                System.Net.Mail.MailAddress addy = new System.Net.Mail.MailAddress(test.Trim());
                Console.WriteLine(addy.Address);
                pos = found + 1;
            }
            catch (FormatException)
            {
            }
        }
    }

Вывод из приведенной выше программы:

testto@domain.com
"Yes, this is valid"@[emails are hard to parse!]
testto1@domain.com
testto2@domain.com

Другие советы

RFC 2822-соответствие электронной почты:

(?:[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])+)\])

Просто запустите его по тексту, и вы получите адреса электронной почты.

Конечно, всегда есть возможность не использовать Regex, где regex не является лучшим вариантом. Но до тебя!

Вы не можете использовать регулярные выражения для разбора RFC2822 почты, потому что их грамматика содержит рекурсивное производство (вне моей головы, это было для комментариев (a (nested) comment)), что делает грамматику нерегулярной. Регулярные выражения (как следует из названия) может только анализировать обычный грамматика.

Смотрите также Regex Match Open Tags, кроме автономных тегов xhtml Чтобы получить больше информации.

Как следует из слепых, иногда вы можете просто проанализировать его старомодным способом.

Если вы предпочитаете это сделать, вот быстрый подход, предполагая, что текст заголовка электронной почты называется «заголовок»:

int start = header.IndexOf("To: ");
int end = header.IndexOf("Cc: ");
string x = header.Substring(start, end-start);

Я могу быть отключен байтом на вычитании, но вы можете очень легко протестировать и изменить это. Конечно, вы также должны быть уверены, что у вас всегда будет CC: Row в вашем заголовке, или это не сработает.

Есть разбивка проверки электронных писем с помощью Regex здесь, который ссылается на более практичную реализацию RFC 2822 с:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Также похоже, что вы хотите только адреса электронной почты из поля «TO», и вам также нужно беспокоиться, так что, скорее всего, сработало что -то вроде следующего:

^To: ((?:\<?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\>?,?(?:\s*))*)

Опять же, как упоминали другие, вы, возможно, не захотите этого делать. Но если вы хотите корпорацию, которая превратит этот вход в <testto@domain.com>, testto1@domain.com, testto2@domain.com, это сделает это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top