#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(); } } |
所有的属性中新邮件数目属性是最重要的一个,它调用了本类的各个方法,完成了连接服务器,向服务器发送各种命令并取得有关新邮件数目的信息,最后断开与服务器的连接。同时还处理了一些异常情况。这样,在程序的主界面类中我们只要读取该类的对象的新邮件数目属性就可以获取邮箱中的新邮件数目,而不必去考虑如何实现服务器的连接、通讯和断开连接等操作了,这正体现出了面向对象设计的优势所在。
这样我们就完成了整个程序的设计和编码工作,接下来让我们测试一下自己的成果吧。运行程序如下: