![]() |
#using using namespace System::Windows::Forms; |
public __gc class MainForm : public Form { private: Label *label1; Label *label2; Label *label3; TextBox *ServerAdd; TextBox *Username; TextBox *Password; Button *btnChecker; CPOP3Client *pPOP3Client; void btn_Click( Object *sender, System::EventArgs *e ); int MailChecker(); public: MainForm(); }; |
![]() |
void MainForm::btn_Click( Object *sender, System::EventArgs *e ) { if( sender->Equals( this->btnChecker ) ) { if( this->ServerAdd->Text != "" && this->Username->Text != "" && this->Password->Text != "" ) { int number = this->MailChecker(); if( number > 0 ) { String *info = new String( "你有" ); info->Concat( number.ToString() ); info->Concat( S"封新郵件!" ); MessageBox::Show( info->ToString(), "InfoBox", MessageBoxButtons::OK, MessageBoxIcon::Information ); } else if( number == 0 ) { MessageBox::Show( "不好意思,你暫時還沒有新郵件。", "InfoBox", MessageBoxButtons::OK, MessageBoxIcon::Information ); } } } |
int MainForm::MailChecker() { int numberOfMails; // 創建一個POP3Client對象 pPOP3Client = new CPOP3Client(); // 設置各項屬性 pPOP3Client->POP3HostName = this->ServerAdd->Text->ToString(); pPOP3Client->UserName = this->Username->Text->ToString(); pPOP3Client->Password = this->Password->Text->ToString(); // 獲得新郵件數目 numberOfMails = pPOP3Client->NumberOfMessages; if( numberOfMails < 0 ) MessageBox::Show( "發生錯誤?。?!", "InfoBox",MessageBoxButtons::OK, MessageBoxIcon::Error ); return numberOfMails; } |
//********************************************************** // 連接到POP3服務器 file:// // 返回值:成功為true,失敗為false file://********************************************************** bool ConnectToServer() { String *strReadBuffer; StreamReader *streamRead; // 關閉已存在的連接 Close(); // 和服務器建立一個連接 m_Client = new TcpClient(m_strPOP3HostName, 110); // 創建一個讀取流 streamRead = new StreamReader(m_Client->GetStream(), Encoding::ASCII ); strReadBuffer = streamRead->ReadLine(); // 忽略buffer中的多余部分 streamRead->DiscardBufferedData(); // 回復是否以+OK開頭,是則成功,否則失敗. if(strReadBuffer->StartsWith("+OK")) return true; else { Close(); return false; } } |
//********************************************************** // 將命令發送到服務器,并從服務器獲得相應的回復 file:// // 參數:strCommand - 發送到服務器的命令,pstrOutput - 從服務器獲得的回復 file:// // 返回值:成功為true,失敗為false file://********************************************************** bool SendCommand(String *strCommand, String** pstrOutput) { Byte outbuffer __gc[]; StreamReader *streamRead; NetworkStream *streamWrite; String *strRequest; if (m_Client == NULL) return false; // 給每個命令添加結束符 strRequest = String::Concat(strCommand, S"\r\n"); // 創建一個從套接字讀寫數據的流 streamWrite = m_Client->GetStream(); streamRead = new StreamReader(streamWrite, Encoding::ASCII); // 將字符串轉化為字節流并將它寫入套接字中 outbuffer = Encoding::ASCII->GetBytes(strRequest); streamWrite->Write(outbuffer, 0, outbuffer->Length); // 從套接字讀取回復 *pstrOutput = streamRead->ReadLine(); // 忽略buffer中的多余部分 streamRead->DiscardBufferedData(); return (*pstrOutput)->StartsWith(S"+OK") ? true : false; } |
//********************************************************** // 斷開與POP3服務器的連接 file://********************************************************** void DisconnectFromServer() { String *strResponse = String::Empty; SendCommand("QUIT", &strResponse); Close(); } |
using namespace System::Net::Sockets; using namespace System::IO; using namespace System::Text; |
// POP3服務器地址 __property String* get_POP3HostName() { return m_strPOP3HostName; } __property void set_POP3HostName(String* strPOP3HostName) { m_strPOP3HostName = strPOP3HostName; } // 用戶名 __property String* get_UserName() { return m_strUserName; } __property void set_UserName(String *strUserName) { m_strUserName = strUserName; } // 密碼 __property String* get_Password() { return m_strPassword; } __property void set_Password(String *strPassword) { m_strPassword = strPassword; } // 狀態 __property String* get_Status() { return m_strStatus; } // 新郵件數目 __property int get_NumberOfMessages() { String *strResponse = String::Empty; String *strNrOfMessages; Char separator __gc[] = new Char __gc[1]; separator[0] = ' '; try { if(!ConnectToServer()) return -1; if(!SendCommand(String::Concat(S"USER ", m_strUserName), &strResponse)) { return -1; } if(!SendCommand(String::Concat(S"PASS ", m_strPassword), &strResponse)) { return -1; } if(!SendCommand(S"STAT", &strResponse)) { return -1; } // 從回復信息中獲得新郵件的數目 strNrOfMessages = strResponse->Split(separator)[1]; return Convert::ToInt32(strNrOfMessages); } catch(Exception* e) { m_strStatus = String::Concat(S"Error: ", e->Message); return -1; } __finally { DisconnectFromServer(); } } |
所有的屬性中新郵件數目屬性是最重要的一個,它調用了本類的各個方法,完成了連接服務器,向服務器發送各種命令并取得有關新郵件數目的信息,最后斷開與服務器的連接。同時還處理了一些異常情況。這樣,在程序的主界面類中我們只要讀取該類的對象的新郵件數目屬性就可以獲取郵箱中的新郵件數目,而不必去考慮如何實現服務器的連接、通訊和斷開連接等操作了,這正體現出了面向對象設計的優勢所在。
這樣我們就完成了整個程序的設計和編碼工作,接下來讓我們測試一下自己的成果吧。運行程序如下:
![]() |
![]() |
原文轉自:http://www.anti-gravitydesign.com