قراءة البريد الإلكتروني باستخدام Pop3 في C# [مغلق]

StackOverflow https://stackoverflow.com/questions/44383

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أبحث عن طريقة لقراءة رسائل البريد الإلكتروني باستخدام Pop3 في C# 2.0.حاليًا، أستخدم الكود الموجود في CodeProject.ومع ذلك، فإن هذا الحل أقل من المثالي.المشكلة الأكبر هي أنه لا يدعم رسائل البريد الإلكتروني المكتوبة باليونيكود.

هل كانت مفيدة؟

المحلول

لقد استخدمت بنجاح OpenPop.NET للوصول إلى رسائل البريد الإلكتروني عبر POP3.

نصائح أخرى

يعد تنزيل البريد الإلكتروني عبر بروتوكول POP3 هو الجزء السهل من المهمة.البروتوكول بسيط للغاية والجزء الصعب الوحيد يمكن أن يكون طرق المصادقة المتقدمة إذا كنت لا ترغب في إرسال كلمة مرور نصية واضحة عبر الشبكة (ولا يمكنك استخدام قناة الاتصال المشفرة SSL).يرى آر إف سي 1939:بروتوكول مكتب البريد - الإصدار 3 و آر إف سي 1734:أمر مصادقة POP3 للتفاصيل.

يأتي الجزء الصعب عندما يتعين عليك تحليل البريد الإلكتروني المستلم، مما يعني تحليل تنسيق MIME في معظم الحالات.يمكنك كتابة محلل MIME السريع والقذر في غضون ساعات أو أيام قليلة وسيتعامل مع 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.GetMessage() الخاص بـ OpenPOP يُرجع قيمة فارغة بشكل غامض.لقد قمت بتصحيح هذا الأمر ووجدت أنه خطأ في فهرس السلسلة - راجع التصحيح الذي أرسلته هنا: http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778.كان من الصعب العثور على السبب نظرًا لوجود كتل الصيد{} الفارغة التي تبتلع الاستثناءات.

كما أن المشروع في الغالب خامل..الإصدار الأخير كان في عام 2004.

في الوقت الحالي، ما زلنا نستخدم OpenPOP، ولكنني سألقي نظرة على بعض المشاريع الأخرى التي أوصى بها الأشخاص هنا.

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 أو نوجيت [HigLabo]

اتصل بي بالطريقة القديمة ولكن لماذا تستخدم مكتبة تابعة لجهة خارجية لبروتوكول بسيط.لقد قمت بتطبيق قارئات POP3 في تطبيق ASP.NET المستند إلى الويب باستخدام System.Net.Sockets.TCPClient وSystem.Net.Security.SslStream للتشفير والمصادقة.فيما يتعلق بالبروتوكولات، بمجرد فتح الاتصال بخادم POP3، لا يوجد سوى عدد قليل من الأوامر التي يتعين عليك التعامل معها.إنه بروتوكول سهل للغاية للعمل معه.

لقد قمت للتو بتجربة 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();
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top