завантаження електронної пошти через протокол POP3 - це найпростіша частина завдання. Протокол досить простий, і єдиною складною частиною можуть бути вдосконалені методи автентифікації, якщо ви не хочете надсилати чіткий текстовий пароль через мережу (і не можете використовувати зашифрований канал зв'язку SSL). Детальніше див. У RFC 1939: Протокол пошти - версія 3
та RFC 1734: Команда POP3 AUTHentication .
Найскладніша ситуація виникає, коли доводиться аналізувати отриманий електронний лист, що в більшості випадків означає аналіз формату MIME. Ви можете написати швидкий і брудний синтаксичний аналізатор MIME за кілька годин або днів, і він оброблятиме 95 +% усіх вхідних повідомлень. Удосконалення парсера, щоб він міг проаналізувати майже будь-які засоби електронної пошти:
- отримання зразків електронної пошти, надісланих від найпопулярніших поштових клієнтів, та вдосконалення аналізатора для виправлення помилок та неправильних тлумачень RFC, створених ними.
- Переконайтесь, що повідомлення, що порушують RFC для заголовків та вмісту повідомлень, не розберуть ваш синтаксичний аналізатор і що ви зможете прочитати кожне читабельне або вгадане значення з пошкодженої електронної пошти
- правильне вирішення питань інтернаціоналізації (наприклад, мови, написані зліва направо, правильне кодування для певної мови тощо)
- ЮНІКОД
- Вкладені файли та ієрархічне дерево елементів повідомлень, як показано у "Зразку електронної пошти щодо тортур MIME"
- S / MIME (підписані та зашифровані електронні листи).
- і так далі
Налагодження надійного синтаксичного аналізатора MIME вимагає місяців роботи. Я знаю, бо я спостерігав, як мій друг писав один такий синтаксичний аналізатор для згаданого нижче компоненту, і також писав кілька модульних тестів для нього ;-)
Повернімося до початкового питання.
Наступний код, взятий з нашої сторінки підручника з POP3, та посилання допоможуть вам:
Pop3 client = new Pop3();
client.Connect("pop3.example.org");
client.Login("username", "password");
Pop3MessageCollection list = client.GetMessageList();
if (list.Count == 0)
{
Console.WriteLine("There are no messages in the mailbox.");
}
else
{
MailMessage message = client.GetMailMessage(list[0].SequenceNumber);
...
}
client.Disconnect();