Поскольку используемый почтовый клиент называется 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.
}