PDA

View Full Version : مقاله ای جامع در مورد دریافت E_Mailها در VB با پروتوکول POP3



Behrouz_Rad
یک شنبه 06 دی 1383, 08:34 صبح
سلام. :sunglass:
مقاله ی قبلی بنده در مورد ارسال E_Mail در VB با استفاده از پروتوکول SMTP بود که مورد توجه دوستان قرار گرفت. بنا به درخواست چند تا از دوستان در مورد توضیح نحوه دریافت E_Mail ها از طریق کدنویسی، تصمیم به نوشتن این مقاله گرفتم.

پروتوکول POP3 که مخفف عبارت Post Office Protocol است، برای دریافت E_Mail ها مورد استفاده قرار می گیرد.
این پروتوکول نیز همانند پروتوکول SMTP (که برای ارسال E_Mail به کار می رود) دارای دستورات ساده ای جهت برقراری تعامل با Mail Box شما است.
برای آگاهی از ساختار پروتوکول POP3 می توانید به RFC1939 در آدرس های زیر مراجعه کنید:

http://www.faqs.org/rfcs/rfc1939.html
http://www.ietf.org/rfc/rfc1939.txt

به طور خلاصه، فرمان هایی را که در ارتباط با پروتوکول POP3 با آنها سر و کار دارید در زیر آورده ام:

در زمانی که به سرور مربوطه متصل شدید، برای اجازه دسترسی به Mail Box خود، ابتدا باید هویت شما برای سرور مشخص شود. بدین منظور شما باید اطلاعات Account خود را که شامل UserName و Password است به سرور ارسال کنید.
برای اینکار از فرمان های USER و PASS استفاده می شود.
پس از تصدیق اطلاعات اکانت شما توسط سرور، جهت آگاهی از تعداد E_Mail های موجود در Mail Box تان از فرمان STAT استفاده کنید.
فرمان STAT، حجم اشغالی Mail Box شما بر حسب بایت و تعداد E_Mail های موجود در آن را که به هرکدامشان یک شماره منحصر به فرد اختصاص داده شده است (ID) بر می گرداند.
نکته: برای آگاهی از حجم هر کدام از E_Mail ها می توانید از فرمان LIST به همراه شماره منحصر به فردی که به هر E_Mail اختصاص داده شده است استفاده کنید.
برای خواندن E_Mail از فرمان RETR استفاده می شود. این تابع یک آرگومان دارد که همان شماره ی E_Mail ای است که توسط فرمان STAT برگشت داده شده است.
برای حذف کردن یک E_Mail از Mail Box، از فرمان DELE استفاده می شود. این فرمان نیز یک آرگومان دارد که همان شماره ی E_Mail ای است که قصد حذف آن را داریم.
پس از اتمام کار با Mail Box، باید Session اختصاص داده شده به شما از طرف سرور از بین برود یا اصطلاحا Sign Out کنید. بدین منظور از فرمان QUIT استفاده می شود.

استفاده از فرمان هایی که در بالا توضیح داده شد بسیار آسان است.
در یک نگاه کلی تمام کاری که باید انجام دهید، اتصال به سرور با پورت 110 (پورت پیش فرض POP3) و ارسال فرامین به سرور است.
توجه: پورت 110 پورت پیش فرض پروتوکول POP3 است که البته بر روی تمامی سرورها اینچنین نیست.

توضیحات فوق خلاصه ای از چند فرمان مهم بود که در پروتوکول POP3 استفاده می شوند.
فرمان های دیگری نیز وجود دارند. به عنوان مثال، فرمان NOOP برای مطمئن شدن از ارتباط با سرور به کار می رود.
فرمان دیگری به نام RSET وجود دارد که برای توضیح کار آن ذکر مقدمه ای ضروری است.
هنگامی که با استفاده از فرمان DELE، یک E_Mail را از Mail Box خود حذف می کنید، در حقیقت حذف E_Mail به شکل منطقی صورت می گیرد نه فیزیکی. به عبارت دیگر، شما با فرمان DELE، ایمیل را جهت حذف علامت گذاری می کنید اما عمل حذف واقعی (فیزیکی) زمانی انجام می پذیرد که شما فرمان QUIT را صادر کرده و Sign Out کنید.
با استفاده از فرمان RSET، قادر خواهید بود که تمامی E_Mail هایی را که جهت حذف فیزیکی علامت خورده اند، غیر علامت دار کنید. به عبارت ساده تر، استفاده از این فرمان باعث می شود که Mail Box شما به حالت اولیه خود بازگردد.

برای بیان بهتر مسائل گفته شده، به ذکر یک مثال می پردازم:
از آنجا که تعدادی از فرمان های پروتوکول POP3 برای اجرا نیاز به آرگومان دارند، یک List Box ایجاد می کنیم و تمامی فرمان ها را در آن قرار داده و تعیین می کنیم که با دابل کلیک بر روی هر کدام از فرمان ها در List Box، هر کدام از آنها که نیاز به پارامتر ورودی داشت، از کاربر دریافت شود.


Private Sub Form_Load()
lstCommands.AddItem "USER"
lstCommands.AddItem "PASS"
lstCommands.AddItem "STAT"
lstCommands.AddItem "LIST"
lstCommands.AddItem "RETR"
lstCommands.AddItem "DELE"
lstCommands.AddItem "NOOP"
lstCommands.AddItem "RSET"
lstCommands.AddItem "QUIT"
End Sub



در در روال DblClick از List Box، کدهای زیر قرار می گیرند:
توجه: در برنامه یک Text Box به نام txtLog جهتن نمایش جزئیات عملکرد دستورات قرار دارد.


Private Sub lstCommands_DblClick()
Dim Cmd As String
Dim Param As String

If lstCommands.ListIndex = -1 Then
Exit Sub
Else
Cmd = lstCommands.List(lstCommands.ListIndex)

If Cmd = "LIST" Or Cmd = "RETR" Or Cmd = "DELE" Then
Param = Trim$(InputBox$("Enter mail number:"))
ElseIf Cmd = "USER" Or Cmd = "PASS" Then
Param = Trim$(InputBox$("Enter details:"))
End If

If Socket.State = sckConnected Then
Socket.SendData Cmd & " " & Param & vbCrLf
DoEvents
End If

txtLog.Text = txtLog.Text & "-->" & Cmd & " " & Param & vbCrLf
End If
End Sub

به منظور نمایش جزئیات اجرای دستورات و فرمان های ارسال شده از طرف Mail Server در txtLog از روال DataArrival به شکل زیر استفاده می کنیم:


Private Sub Socket_DataArrival(ByVal bytesTotal As Long)
Dim Data As String

Socket.GetData Data

txtLog.Text = txtLog.Text & Data
txtLog.SelStart = Len(txtLog.Text)
End Sub


مهمترین قسمت کار، برقراری ارتباط با Mail Server است:


Private Sub cmdConnect_Click()
Socket.Close
Socket.RemoteHost = txtServer.Text
Socket.RemotePort = txtPort.Text
lblStatus.Caption = "Status: Connecting..."
Socket.Connect
End Sub

هنگامی که ارتباط برقرار شد، رویداد Winsock_Connect() اتفاق می افتد. در این هنگام باید در Mail Server، لوگین کنیم:


Private Sub Socket_Connect()
Dim Cmd As String

lblStatus.Caption = "Status: Loggin in..."

Cmd = "USER " & txtUserName.Text & vbCrLf
Socket.SendData Cmd
DoEvents

txtLog.Text = txtLog.Text & "-->" & Cmd

Cmd = "PASS " & txtPassword.Text & vbCrLf
Socket.SendData Cmd
DoEvents

txtLog.Text = txtLog.Text & "-->" & Cmd

lblStatus.Caption = "Status: Connected"
End Sub

نکته مهم: توجه داشته باشید که اکثر فرمان های پروتوکول ها، به کاراکتر VbCrLf ختم می شوند. این کاراکتر برای سرور، مشخص کننده ی پایان فرمان است.
دکمه ی Disconnect نیز در برنامه برای Sign Out کردن از Mail Server استفاده می شود.
نکته ی مهم: پس از پایان کار (در صورتی که E_Mail ای را برای حذف علامتدار کرده اید)، حتما دکمه ی DisConnect را کلیک کنید. این کار به منظور تایید عمل حذف E_Mail های انتخاب شده است.

نکاتی پیرامون پاسخ های سرور:
هر پاسخی که از طرف سرور برای کلاینت ارسال می شود، با یکی از دو کلمه ی +OK)) یا ((–ERR آغاز می شود.
منظور از کلمه ی +OK این است که آخرین فرمان ارسال شده به Mail Server‌، بدون هیچ مشکلی و با موفقیت اجرا شده است.
منظور از کلمه ی –ERR این است که آخرین فرمان ارسال شده به Mail Server، با خطا مواجه شده است. معمولا در جلوی کلمه ی ERR، توضیحی کوتاه در مورد خطای اتفاق افتاده آمده است.
نکته ی مهم: پایان هر داده ی ارسالی از سمت سرور، با کد زیر است:


vbCrLf & "." & vbCrLf

با استفاده از کد فوق، قادر خواهید بود تا پایان ارسال پاسخی خاص از سمت سرور را بررسی کنید.
به عنوان مثال، در زیر، یک نمونه از پرسش و پاسخ بین کلاینت و سرور آمده است:


+OK InterMail POP3 server ready.
-->USER behrouz
+OK please send PASS command
-->PASS 123456
+OK behrouz is welcome here
-->STAT
+OK 7 85292
-->LIST
+OK 7 messages
1 18015
2 2651
3 21588
4 1409
5 20928
6 1402
7 19299
.
-->RETR 2
+OK 2651 octets
mail follows here
.
-->NOOP
+OK
-->RSET
+OK
-->QUIT
+OK chiefy InterMail POP3 server signing off.



در مثال فوق، نام کاربری behrouz و کلمه ی عبور 123456 به منظور تصدیق اکانت به Mail Server ارسال و پس از تصدیق و ارسال پیغام LIST، میل سرور لیستی از E_Mail های موجود در Mail Box اکانت مربوطه را بر می گرداند.
سپس با ارسال پیغام RETR به همراه شماره ی E_Mail مورد نظر (در اینجا شماره 2)، محتویات E_Mail شماره ی 2 برگشت داده می شود.
فرمان NOOP برای تصدیق برقراری ارتباط با Mail Server و RSET برای باز گرداندن Mail Box به حالت اول ارسال می شوند. در پایان نیز فرمان QUIT برای Sign Out کردن از Mail Server فرستاده می شود.

نکته پایانی:
برخی از برنامه ها به منظور دریافت یک E_Mail و برای تسریع بخشیدن به بازیابی E_Mail، از شگرد جالبی استفاده می کنند.
این برنامه ها، تنها تعدادی از خطوط اولیه ی (Subject و Header) ایمیل را به منظور آگاهی Client از محتوای E_Mail بازیابی کرده و نمایش می دهند.
جهت انجام این کار، از فرمان TOP استفاده می شود.
این فرمان، 2 پارامتر دارد:
اولین پارامتر، شماره ی ایمیلی است که قصد بازیابی آن را داریم و دومین پارامتر، تعداد خطوطی است که قصد داریم از ایمیل، بازیابی شود.
پس از ارسال این فرمان، Header ایمیل به همراه تعداد خطوطی که در پارامتر دوم مشخص شده، از قسمت Body ایمیل برگشت داده می شود.
مزایای استفاده از این فرمان این است که شما نیاز به دریافت کامل محتویات ایمیل برای آگاهی از اینکه ایمیل ارسال شده از طرف چه کسی است یا موضوع آن چیست یا تاریخ و زمان ارسال آن چه موقع بوده است و … ندارید.
طریقه ی استفاده از فرمان TOP به شکل زیر است:


TOP msg n

نکته ی مهم: شماره ی ایمیلی که قصد بازیابی آن را دارید، نباید شماره ی ایمیلی باشد که جهت انجام عمل حذف توسط فرمان DELE، علامت خورده است.
آرگومان دوم نیز باید عددی مثبت باشد.

نسخه ی قابل داونلود این مقاله و یک برنامه ی نمونه مرتبط با آن، تا یک ماه پس از ارائه ی این مقاله در زیر قابل دریافت است.
با آرزوی موفقیت روز افزون برای تمامی دوستان برنامه نویس.
بهروز راد

:wink:

bamzy
یک شنبه 06 دی 1383, 09:33 صبح
:تشویق: ,واقعا ممنون.دست شما درد نکنه.
:thnx:

بابک زواری
یک شنبه 06 دی 1383, 10:25 صبح
بهروز جان دستت درد نکنه و خیلی ممنون از اینکه مقاله به فرم قابل دانلود هم گذاشتید

Behrouz_Rad
یک شنبه 06 دی 1383, 10:36 صبح
خواهش می کنم.
:wise1:

مطهر
یک شنبه 06 دی 1383, 15:39 عصر
با سلام
ممنون از این مقاله ی جالب
اگر به خواهیم به Hotmail متصل شویم چگونه این کار میسر است.

اینجا چی باید بنویسیم

Socket.RemoteHost = txtServer.Text
Socket.RemotePort = txtPort.Text

Behrouz_Rad
دوشنبه 07 دی 1383, 10:16 صبح
سلام.


Socket.RemoteHost = mail.hotmail.com
Socket.RemotePort = 110


:wise1:

مطهر
دوشنبه 07 دی 1383, 11:01 صبح
با سلام
وصل نمیشه Connecting... همچنان نمایش داده میشه

Behrouz_Rad
دوشنبه 07 دی 1383, 13:02 عصر
سلام.
درخواست شما رو انجام دادم.
برنامه ی نمونه رو در بالا دریافت کنید.
موفق باشید.
بهروز راد
:wise1:

bahar60
دوشنبه 07 دی 1383, 13:58 عصر
:thnx: :thnx: :thnx:


موفق و پیروز باشید :flower: :flower: :flower:

مطهر
دوشنبه 07 دی 1383, 16:21 عصر
سپاس و صد سپاس :flower: :تشویق:

درخواست شما رو انجام دادم.
بزرگواری فرمودید.
برنامه را اجرا کردم. :flower:
به نظر شما چه خطاهایی ممکن است رخ بدهد.چون پیغام زیر ظاهرشد
The attempt to connect timed out
با سپاس

Behrouz_Rad
سه شنبه 08 دی 1383, 07:35 صبح
زمان انتظار برای اتصال را بیشتر کنید.
احتمالا خط اینترنت شما کند است.
:wise1:

soltanvb
یک شنبه 18 اردیبهشت 1384, 11:42 صبح
خیلی ممنون از مقاله جالبت
خسته نباشی
همیشه موفق باشی

EhsanKhafan
یک شنبه 19 تیر 1384, 12:26 عصر
سلام
خیلی مقاله خوبیه.من برنامشو با C# دارم پیاده سازی میکنم که چک میل کنه.سرورم رو mail.yahoo.com ست کردم و پورت هم 110 ولی وسط کار اشکال زیر میاد:

An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in system.dll

Additional information: An existing connection was forcibly closed by the remote host

به نظرتون چرا؟
تشکر از مقاله خوبتون
احسان

black_code
شنبه 30 اردیبهشت 1385, 17:24 عصر
خیلی جالب . توپپپپپپ.. ان شاا... موفق باشید. من دانشجو هستم و دوست دارم برنامه نویسی در حد تووووپپ یاد بگیرم و کار کنم/ ولی خودم رو در طراحی بیشتر قبل می دونم.

kronos
یک شنبه 31 اردیبهشت 1385, 05:50 صبح
وای دستت درد نکنه بینظیر بود

فقط Socket چه کنترلیه

mostafa20
چهارشنبه 15 شهریور 1385, 16:00 عصر
من نیاز به مرجع کامل دستورات مربوط به PORT 110 دارم کسی هست کمکم کنه
(می خوام با VS .NET میل ها رو به صورت کامل در بیارم)

mostafa20
یک شنبه 19 شهریور 1385, 17:10 عصر
الو کسی نمی خواد کمکم کنی

mostafa20
پنج شنبه 23 شهریور 1385, 14:03 عصر
سلام
من تونستم یه برنامه کامل برای POP3 و دریافت میل با C# بنویسم هر کدوم از دوستان خواستن فقط به من خبر بدن
فقط یه سوال ایا هیچ جوری میشه میل های خوانده نشده رو از طریق pop3 تشخیص داد؟

molana alavi
دوشنبه 21 اسفند 1385, 10:09 صبح
دستت درد نکونه

digi_tal
دوشنبه 29 مهر 1387, 16:45 عصر
لطفا یه سورس بزارین واسه ما مبتدی ها

VB.SOS
سه شنبه 30 مهر 1387, 08:35 صبح
مقاله ی قبلی بنده در مورد ارسال E_Mail در VB با استفاده از پروتوکول SMTP بود که مورد توجه دوستان قرار گرفت.
ميشه لطف كني آدرس اونو بزاري؟
در ضمن از مقالت خيلي خيلي تشكر
موفق باشي

m.yazdian
یک شنبه 12 آبان 1387, 09:08 صبح
دوست عزیز hotmail در حال حاضر سرویس pop3 نمیده برای همین شما نمیتونید بهش وصل بشین.

m.yazdian
یک شنبه 12 آبان 1387, 09:10 صبح
د.ست عزیر سلام
مقاله خوبی رو ارائه کردین.

اگر اطلاعاتی از نحوه parse کردن بدنه و عنوان نامه دریافتی با فرمت Mime رو دارین لطفا ارائه کنید .
با تشکر.:چشمک:

m.yazdian
یک شنبه 12 آبان 1387, 09:11 صبح
دوست عزیز سلام
مقاله خوبی را ارائه کردین
لطفا اگر اطلاعاتی در زمینه Parse کردن بدنه و عنوان نامه در یافتی در فرمت Mine را دارین ارائه کنید.

باتشکر:چشمک:

hashemt4
سه شنبه 19 دی 1391, 13:41 عصر
سلام
ممنون از مقاله خوبتون

فقط هرچی گشتم لینک دانلود مقاله و نمونه کد رو پیدا نکردم

ممنون میشم اگه لینکشو برام بفرستین

Hajizadeh.ir@gmail.com

masoud60
چهارشنبه 20 دی 1391, 10:10 صبح
برای دریافت ایمیل از طریق Mime
http://hpop.sourceforge.net/ از این استفاده کنید برنامه کاملی برای دریافت ایمیل هست.limilabs هم خوبه ولی پولی هست


---------------------------------
http://www.kohan-co.net