Чтение электронной почты с использованием Pop3 в C#

Я ищу метод чтения электронных писем с использованием Pop3 в C# 2.0. В настоящее время я использую код, найденный в CodeProject. Тем не менее, это решение не идеально. Самая большая проблема в том, что он не поддерживает электронные письма, написанные в юникоде.

8 ответов

Решение

Я успешно использовал OpenPop.NET для доступа к электронной почте через POP3.

Загрузка электронной почты по протоколу POP3 - это простая часть задачи. Протокол довольно прост, и единственной сложной частью могут быть расширенные методы аутентификации, если вы не хотите отправлять открытый текстовый пароль по сети (и не можете использовать зашифрованный канал связи SSL). См. RFC 1939: Почтовый протокол - Версия 3 и RFC 1734: Команда POP3 AUTHentication для получения подробной информации.

Сложная часть возникает, когда вам нужно проанализировать полученное письмо, что в большинстве случаев означает синтаксический анализ формата MIME. Вы можете написать быстрый и грязный MIME-парсер за несколько часов или дней, и он будет обрабатывать 95+% всех входящих сообщений. Улучшение синтаксического анализатора, чтобы он мог анализировать практически любые средства электронной почты:

  • получение образцов электронной почты, отправленных с самых популярных почтовых клиентов, и улучшение синтаксического анализатора для исправления ошибок и неверных интерпретаций RFC, создаваемых ими.
  • Убедитесь, что сообщения, нарушающие RFC для заголовков сообщений и содержимого, не будут приводить к сбоям в вашем синтаксическом анализаторе и что вы сможете прочитать каждое читаемое или предполагаемое значение из искаженного электронного письма
  • правильная обработка вопросов интернационализации (например, языки, написанные справа налево, правильная кодировка для конкретного языка и т. д.)
  • UNICODE
  • Вложения и иерархическое дерево элементов сообщения, как показано в "Образце электронной почты для пыток Mime"
  • 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

Назовите меня по-старому, но зачем использовать стороннюю библиотеку для простого протокола. Я реализовал средства чтения POP3 в веб-приложении ASP.NET с System.Net.Sockets.TCPClient и System.Net.Security.SslStream для шифрования и аутентификации. Что касается протоколов, как только вы открываете связь с сервером POP3, вам нужно иметь дело только с несколькими командами. Это очень простой протокол для работы.

Вы также можете попробовать почтовый компонент 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

Обратите внимание, что это коммерческий продукт, который я создал.

HigLabo.Mail прост в использовании. Вот пример использования:

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]

Я бы не рекомендовал OpenPOP. Я просто потратил несколько часов на отладку проблемы - POPClient.GetMessage() в OpenPOP загадочным образом возвращал ноль. Я отладил это и обнаружил, что это ошибка индекса строки - посмотрите патч, который я отправил здесь: http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778. Трудно было найти причину, потому что есть пустые блоки catch{}, которые поглощают исключения.

Кроме того, проект в основном бездействует... последний выпуск был в 2004 году.

На данный момент мы все еще используем OpenPOP, но я посмотрю на некоторые другие проекты, которые люди рекомендовали здесь.

Я только что попробовал SMTPop, и это сработало.

  1. Я скачал это.
  2. добавленной 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();
        }
    }
}
Другие вопросы по тегам