2008-09-04 3 views
73

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

ответ

71

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

+1

ссылку NuGet: https://www.nuget.org/packages/OpenPop.NET/ – razon 2017-01-13 11:50:30

15

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

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

  • получать образцы, отправленные из наиболее популярных почтовых клиентов и улучшить парсер для того, чтобы исправить ошибки и RFC кривотолков, генерируемые ими.
  • Убедившись, что сообщения, нарушающие RFC для заголовков сообщений и контента не приведут к сбою анализатора, и что вы будете иметь возможность читать каждое читаемое или угадываемо значение из искореженной электронной почты
  • корректной обработки вопросов интернационализации (например, языки написано с RIGH налево, правильную кодировку для конкретного языка и т.д.)
  • UNICODE
  • Вложения и иерархического дерева пункт сообщения, как показано в "Mime torture email sample"
  • S/MIME (подписанных и зашифрованных электронных писем).
  • и так далее

Отладка надежный анализатор MIME занимает месяцы работы. Я знаю, потому что я смотрел, как мой друг пишет один такой парсер для компонента, упомянутого ниже, и писал для него несколько модульных тестов ;-)

Назад к исходному вопросу.

После code taken from our POP3 Tutorial page и ссылки поможет вам:

// 
// 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(); 
+7

В основном вы говорите «купите мой компонент», правильно? Ничего плохого в этом, это звучит как хороший компонент. – MarkJ 2009-11-06 12:31:01

+3

Вы можете попробовать любой сторонний компонент (свободный или коммерческий). Мой пост пытался указать на то, что написание такого компонента является трудным и трудоемким, потому что потребность в обширном тестировании - то, что вы вряд ли сможете обойтись без большого отчета об ошибках с данными большого числа реальных пользователей. Было бы неплохо, если вы выберете компонент Rebex, но если вы выберете другой, у меня нет проблем с ним. Написание собственного анализатора MIME или использование кода доказательной концепции, найденного в Интернете, - это ИМХО, в данном случае это не лучший способ. Но я, может быть, навязана ;-), нарисуйте свой собственный конкремент и сначала проверьте код. – 2009-11-06 19:21:16

+0

Могу ли я использовать компонент Rebex для получения сообщений из почтового ящика Exchange 2003? – Kiquenet 2010-11-23 09:46:53

2

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

8

Приложение с открытым исходным кодом BugTracker.NET включает в себя клиент POP3, который может анализировать MIME. И код POP3, и MIME-код принадлежат другим авторам, но вы можете видеть, как все это сочетается в моем приложении.

Для анализа MIME я использую http://anmar.eu.org/projects/sharpmimetools/.

Смотрите файл POP3Main.cs, POP3Client.cs и insert_bug.aspx

5

Вы также можете попробовать Mail.dll mail component, он имеет поддержку 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

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

3

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

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

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

3

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]

2

Я просто попытался SMTPop и она работала.

  1. Скачано this.
  2. Добавлен smtpop.dll ссылку на мой проект # .NET C

написал следующий код:

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(); 
     } 
    } 
} 
Смежные вопросы