Чтение электронной почты с помощью Pop3 в C# [закрыто]
Я ищу способ чтения электронной почты с помощью Pop3 в C# 2.0. В настоящее время, я использую код в CodeProject. Однако это решение не является идеальным. Самая большая проблема заключается в том, что он не поддерживает электронные письма, написанные в юникоде.
8 ответов:
Я успешно использовал OpenPop.NET для доступа к электронной почте через POP3.
загрузка электронной почты через протокол POP3 является легкой частью задачи. Протокол довольно прост, и единственной трудной частью могут быть расширенные методы аутентификации, если вы не хотите отправлять пароль с открытым текстом по сети (и не можете использовать зашифрованный канал связи SSL). Смотрите в RFC 1939: протокол почтового отделения версия 3 и РЧЦ 1734: команда проверки подлинности по протоколу POP3 для сведения.
трудная часть приходит, когда вам нужно разобрать получено письмо, что означает разбор формата MIME в большинстве случаев. Вы можете написать быстрый и грязный парсер MIME за несколько часов или дней, и он будет обрабатывать 95% всех входящих сообщений. Улучшение парсера, чтобы он мог анализировать практически любую электронную почту означает:
- получение образцов электронной почты, отправленных из самых популярных почтовых клиентов, и улучшение парсера для исправления ошибок и неверных интерпретаций RFC, генерируемых ими.
- убедитесь, что сообщения, нарушающие RFC для заголовков сообщений и контент не будет разбивать ваш парсер и что вы сможете прочитать каждое читаемое или угадываемое значение из искореженной электронной почты
- корректная обработка вопросов интернационализации (например, языки, написанные от righ влево, правильная кодировка для конкретного языка и т. д.)
- UNICODE
- вложения и иерархическое дерево элементов сообщений, как показано в "мим пытка образец электронной почты"
- 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
вы также можете попробовать Почта.компонент dll mail, он имеет поддержку 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 [HigLabo]
назовите меня старомодным, но зачем использовать стороннюю библиотеку для простого протокола. Я реализовал 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(); } } }