Читання електронної пошти за допомогою Pop3 в C # [закрито]


75

Я шукаю метод читання електронних листів за допомогою Pop3 в C # 2.0. В даний час я використовую код, знайдений у CodeProject . Однак це рішення менш ніж ідеальне. Найбільша проблема полягає в тому, що він не підтримує електронні листи, написані в Unicode.

Відповіді:



16

завантаження електронної пошти через протокол POP3 - це найпростіша частина завдання. Протокол досить простий, і єдиною складною частиною можуть бути вдосконалені методи автентифікації, якщо ви не хочете надсилати чіткий текстовий пароль через мережу (і не можете використовувати зашифрований канал зв'язку SSL). Детальніше див. У RFC 1939: Протокол пошти - версія 3 та RFC 1734: Команда POP3 AUTHentication .

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

  • отримання зразків електронної пошти, надісланих від найпопулярніших поштових клієнтів, та вдосконалення аналізатора для виправлення помилок та неправильних тлумачень RFC, створених ними.
  • Переконайтесь, що повідомлення, що порушують RFC для заголовків та вмісту повідомлень, не розберуть ваш синтаксичний аналізатор і що ви зможете прочитати кожне читабельне або вгадане значення з пошкодженої електронної пошти
  • правильне вирішення питань інтернаціоналізації (наприклад, мови, написані зліва направо, правильне кодування для певної мови тощо)
  • ЮНІКОД
  • Вкладені файли та ієрархічне дерево елементів повідомлень, як показано у "Зразку електронної пошти щодо тортур 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();

8
В основному ви кажете "придбайте мій компонент", так? У цьому немає нічого поганого, це звучить як хороший компонент.
MarkJ

3
Ви можете спробувати будь-який сторонній компонент (безкоштовний або комерційний). У своєму дописі я намагався вказати, що написання такого компонента є одночасно і складним, і трудомістким, тому що необхідність детального тестування - чогось, що ви навряд чи можете обійтися без численних звітів про помилки з даними великої кількості реальних користувачів. Було б непогано, якщо ви вибрали компонент Rebex, але якщо ви вибрали інший, у мене з цим проблем немає. Написання власного синтаксичного аналізатора MIME або використання коду доказу концепції, знайденого в Інтернеті, є IMHO, в цьому випадку не найкращий спосіб піти. Але я можу бути упередженим ;-), зробіть власний висновок і спершу протестуйте код.
Мартін Вобр

Чи можу я використовувати компонент Rebex для отримання повідомлень із папки "Вхідні" Exchange 2003 ??
Kiquenet

4
Дискусія автора про те, як важко проаналізувати MIME, заплямована його комерційною зацікавленістю в тому, щоб ніхто його не намагався.
Джон Мелвілл,

1
@ThunderGr: хороший момент щодо декодерів. Я думаю, що це залежить від того, що є більш ефективним. Якщо простіше написати свій власний декодер, подумайте. Якщо вашим основним завданням є зробити ще щось, і декодування чогось лише частина, якщо я спробую використовувати готове рішення. Врешті-решт, зазвичай йдеться про балансування між тим, чи легше приборкати сторонню бібліотеку за допомогою безлічі найкращих практик (і вирішити проблеми в чужому коді), або написати це з нуля (і вирішити той факт, що ви, мабуть, не знаєте повного масштабу проблеми).
Martin Vobr

8

Моя програма з відкритим кодом BugTracker.NET включає клієнт POP3, який може аналізувати MIME. І код POP3, і MIME від інших авторів, але ви можете побачити, як це все поєднується в моєму додатку.

Для розбору MIME я використовую http://anmar.eu.org/projects/sharpmimetools/ .

Дивіться файл POP3Main.cs, POP3Client.cs та insert_bug.aspx


5

Ви також можете спробувати поштовий компонент 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

Зверніть увагу, що це комерційний продукт, який я створив.


1
Чи можу я використовувати його для доступу до inbox Exchange 2003?
Kiquenet

Так, ти можеш. Вам просто потрібно ввімкнути протоколи IMAP або POP3.
Павел Лесніковський,

4

називайте мене старою модою, але навіщо використовувати сторонні бібліотеки для простого протоколу. Я впровадив зчитувачі POP3 у веб-програму ASP.NET із System.Net.Sockets.TCPClient та System.Net.Security.SslStream для шифрування та автентифікації. Що стосується протоколів, то після того, як ви відкриєте зв'язок із сервером POP3, є лише кілька команд, з якими вам доводиться мати справу. З ним дуже легко працювати.


4

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

Крім того, проект переважно неактивний ... останній реліз був у 2004 році.

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


що тобі рекомендує ?? thx
Кікенет

16
Привіт. Я обігнав проект OpenPop.NET і привів його в більш функціональний стан. Ці спроби лову були вилучені, і бібліотека тепер набагато стабільніша. Я не вважаю, що ця публікація вже є дійсною.
foens

4

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. Я завантажив це .
  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();
        }
    }
}

я спробував ваш код, але немає повідомлення електронної пошти - усі дані надходять нормально, крім тексту ??? будь-яка ідея ?????
AbuQauod
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.