Чтение электронной почты с помощью Pop3 в C # [закрыто]
Вопрос
Я ищу метод чтения электронных писем с использованием Pop3 в C # 2.0.В настоящее время я использую код, найденный в Кодпроект.Однако это решение далеко не идеально.Самая большая проблема заключается в том, что он не поддерживает электронные письма, написанные в юникоде.
Решение
Я успешно использовал OpenPop.NET для доступа к электронной почте через POP3.
Другие советы
загрузка электронной почты по протоколу POP3 - самая простая часть задачи.Протокол довольно прост, и единственной сложной частью могут быть расширенные методы аутентификации, если вы не хотите отправлять открытый текстовый пароль по сети (и не можете использовать канал связи с шифрованием SSL).Видишь RFC 1939:Протокол почтового отделения - Версия 3 и RFC 1734:Команда аутентификации POP3 за подробностями.
Самое сложное возникает, когда вам нужно проанализировать полученное электронное письмо, что в большинстве случаев означает анализ формата MIME.Вы можете написать quick & dirty MIME parser за несколько часов или дней, и он будет обрабатывать более 95% всех входящих сообщений.Улучшение парсера, чтобы он мог анализировать практически любую электронную почту, означает:
- получение образцов электронных писем, отправленных с самых популярных почтовых клиентов, и улучшение синтаксического анализатора с целью исправления ошибок и неверных интерпретаций RFC, сгенерированных ими.
- Убедитесь, что сообщения, нарушающие RFC для заголовков и содержимого сообщений, не приведут к сбою вашего анализатора и что вы сможете прочитать каждое читаемое или угадываемое значение из искаженного электронного письма
- правильное решение вопросов интернационализации (например,языки, написанные справа налево, правильная кодировка для конкретного языка и т.д.)
- ЮНИКОД
- Вложения и иерархическое дерево элементов сообщений, как показано на рисунке "Образец электронного письма с мимическими пытками"
- S / MIME (подписанные и зашифрованные электронные письма).
- и так далее
Отладка надежного MIME-анализатора занимает месяцы работы.Я знаю, потому что я наблюдал, как мой друг писал один такой парсер для компонента, упомянутого ниже, и тоже писал для него несколько модульных тестов ;-)
Вернемся к первоначальному вопросу.
Следующие код взят с нашей страницы руководства по POP3 и ссылки помогут вам:
//
// create client, connect and log in
Pop3 client = new Pop3();
client.Connect("pop3.example.org");
client.Login("username", "password");
// get message list
Pop3MessageCollection list = client.GetMessageList();
if (list.Count == 0)
{
Console.WriteLine("There are no messages in the mailbox.");
}
else
{
// download the first message
MailMessage message = client.GetMailMessage(list[0].SequenceNumber);
...
}
client.Disconnect();
Мое приложение с открытым исходным кодом BugTracker.NET включает POP3-клиент, который может анализировать MIME.И POP3-код, и MIME-код принадлежат другим авторам, но вы можете увидеть, как все это сочетается в моем приложении.
Для синтаксического анализа MIME я использую http://anmar.eu.org/projects/sharpmimetools/.
Смотрите файлы POP3Main.cs, Pop3Client.cs и insert_bug.aspx
Вы также можете попробовать Mail.dll почтовый компонент, он имеет поддержку SSL, Unicode и международную поддержку электронной почты.:
using(Pop3 pop3 = new Pop3())
{
pop3.Connect("mail.host.com"); // Connect to server and login
pop3.Login("user", "password");
foreach(string uid in pop3.GetAll())
{
IMail email = new MailBuilder()
.CreateFromEml(pop3.GetMessageByUID(uid));
Console.WriteLine( email.Subject );
}
pop3.Close(false);
}
Вы можете скачать его здесь по адресу https://www.limilabs.com/mail
Пожалуйста, обратите внимание, что это коммерческий продукт, который я создал.
Я бы не рекомендовал OpenPop.Я только что потратил несколько часов на отладку проблемы - POPClient OpenPop.GetMessage() таинственным образом возвращал значение null.Я отладил это и обнаружил, что это ошибка со строковым индексом - смотрите патч, который я отправил здесь: http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778.Было трудно найти причину, так как существуют пустые блоки catch{}, которые проглатывают исключения.
Кроме того, проект в основном находится в состоянии покоя...последний релиз состоялся в 2004 году.
На данный момент мы все еще используем OpenPop, но я взгляну на некоторые другие проекты, которые люди рекомендовали здесь.
HigLabo.Почта проста в использовании.Вот пример использования:
using (Pop3Client cl = new Pop3Client())
{
cl.UserName = "MyUserName";
cl.Password = "MyPassword";
cl.ServerName = "MyServer";
cl.AuthenticateMode = Pop3AuthenticateMode.Pop;
cl.Ssl = false;
cl.Authenticate();
///Get first mail of my mailbox
Pop3Message mg = cl.GetMessage(1);
String MyText = mg.BodyText;
///If the message have one attachment
Pop3Content ct = mg.Contents[0];
///you can save it to local disk
ct.DecodeData("your file path");
}
вы можете получить это от https://github.com/higty/higlabo или Nuget [ХигЛабо]
назовите меня старомодным, но зачем использовать стороннюю библиотеку для простого протокола?Я внедрил программы чтения POP3 в веб-приложении ASP.NET с System.Net.Sockets.TcpClient и System.Net.Security.SslStream для шифрования и аутентификации.Что касается протоколов, то, как только вы открываете связь с POP3-сервером, вам приходится иметь дело лишь с несколькими командами.Это очень простой протокол для работы.
Я только что попробовал SMTPop, и это сработало.
- Я скачал это.
- Добавлено
smtpop.dll
ссылка на мой проект C # .NET
Написал следующий код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SmtPop;
namespace SMT_POP3 {
class Program {
static void Main(string[] args) {
SmtPop.POP3Client pop = new SmtPop.POP3Client();
pop.Open("<hostURL>", 110, "<username>", "<password>");
// Get message list from POP server
SmtPop.POPMessageId[] messages = pop.GetMailList();
if (messages != null) {
// Walk attachment list
foreach(SmtPop.POPMessageId id in messages) {
SmtPop.POPReader reader= pop.GetMailReader(id);
SmtPop.MimeMessage msg = new SmtPop.MimeMessage();
// Read message
msg.Read(reader);
if (msg.AddressFrom != null) {
String from= msg.AddressFrom[0].Name;
Console.WriteLine("from: " + from);
}
if (msg.Subject != null) {
String subject = msg.Subject;
Console.WriteLine("subject: "+ subject);
}
if (msg.Body != null) {
String body = msg.Body;
Console.WriteLine("body: " + body);
}
if (msg.Attachments != null && false) {
// Do something with first attachment
SmtPop.MimeAttachment attach = msg.Attachments[0];
if (attach.Filename == "data") {
// Read data from attachment
Byte[] b = Convert.FromBase64String(attach.Body);
System.IO.MemoryStream mem = new System.IO.MemoryStream(b, false);
//BinaryFormatter f = new BinaryFormatter();
// DataClass data= (DataClass)f.Deserialize(mem);
mem.Close();
}
// Delete message
// pop.Dele(id.Id);
}
}
}
pop.Quit();
}
}
}