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:
مقاله ی قبلی بنده در مورد ارسال 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: