Обработка ошибок электронной почты с C # - PullRequest
2 голосов
/ 22 декабря 2011

Я хочу, чтобы C # подключился к учетной записи электронной почты и обрабатывал недоставленную почту или сбои. И я хотел бы, чтобы ошибочный адрес или исходное письмо были записаны в текстовый файл.

Я уверен, что смогу выяснить, как распознать ошибочное сообщение. Пример: ГДЕ тема содержит «сбой», «возвращен» и т. Д.

То, что я не знаю, как сделать, это получить ошибочный адрес из электронной почты.

В какой-то момент я использовал программу под названием popmonger для клиента, но теперь она собирает неправильные адреса электронной почты. В качестве примера он собирает mailer-daemon@gateway03.websitewelcome.com вместо исходного или ошибочного электронного письма. Я подумал, что будет проще, если я напишу сервис на C #.

Учетная запись электронной почты, к которой я подключаюсь, находится на hostgator. Кто-нибудь знает с чего начать?

Спасибо

Jake

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Поскольку используемый почтовый клиент называется popmonger, похоже, что вы будете иметь дело с протоколом POP3, и, хотя .Net предоставляет способ легко отправлять электронную почту через SMTP, он не совсем оправдывает себя при проверке электронной почты.

Вам потребуется использовать стороннюю DLL-библиотеку с POP3-клиентом для получения электронных писем. Самое главное, вам нужно будет проверить одно из уведомлений об ошибках по электронной почте, чтобы увидеть, что ожидает ваше приложение. В теме, теле, адресе отправителя и т. Д. Должно быть что-то общее, чтобы указать, какие электронные письма являются уведомлениями об ошибках. Затем вам нужно увидеть, где в теле письма указывается информация об ошибке, которую вам нужно получить для записи в текстовый файл. В основном ваши шаги должны идти примерно так:

  • Проверка и получение сообщений электронной почты
  • Добавить каждый объект сообщения об ошибке в коллекцию (List<T> работает просто отлично)
  • Чтение / анализ каждого письма для извлечения необходимой информации
  • Запишите извлеченные данные в файл
  • Если все идет хорошо и вы не получаете исключений, удалите электронную почту с POP-сервера с помощью объекта клиента POP (таким образом, вы не будете каждый раз читать одни и те же уведомления об ошибках и заполнять текстовый файл избыточными данными)

Я использовал класс POP3 из этой статьи codeproject, и он включает в себя код для вложений, но я никогда не использую его для вложений, потому что он немного глючит в них. Что касается чтения основного текста письма, оно меня еще не подвело (стучит по дереву).

Получив уведомление об ошибке, вы можете извлечь ошибочный адрес в соответствии с заданным форматом с помощью простого шаблона регулярного выражения и сопоставить его. Давайте предположим, что основной текст уже получен с сервера, и вы сохранили его в строковом формате с именем bodyText

using System.Text.RegularExpressions;
// ...

string failedAddressPattern = @"The mail system <(?<address>.+)>";
string capturedAddress = null;
Match match = Regex.Match(bodyText, failedAddressPattern, RegexOptions.IgnoreCase);

if(match.Groups["address"].Success)
{
    capturedAddress = match.Groups["address"].Value.Trim();
}

if(capturedAddress == null)
{
    // do some form of debug logging here because the pattern no longer works, etc.
}
1 голос
/ 27 декабря 2011

Помимо сканирования текста, существует стандарт для этого, он называется DSN (уведомления о состоянии доставки, определенные в RFC 3464). Вы можете удалить такие сообщения с помощью заголовка типа содержимого "multipart / report; report-type = delivery-status". Вы можете проверить http://www.lumisoft.ee/lsWWW/download/downloads/Examples/ - в нем есть все, что вам нужно, клиент POP3 / IMAP с примерами. Он также имеет анализатор сообщений MIME, что вам нужно, он также имеет поддержку сообщений DSN. Полный код Soruce предоставляется, поэтому начать работу должно быть легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...