pop3Word文档格式.docx
《pop3Word文档格式.docx》由会员分享,可在线阅读,更多相关《pop3Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
//存储信件的文本
intmsgSize;
//信件的大小
intretrSize;
//信件实际下载的大小,在下载过程中动态变化
}MESSAGEPROP;
然后为套接字类定义了一个向量型的成员变量,相当于一个数组,其成员是上述的结构。
vector<
MESSAGEPROP>
msgs;
在pop会话中,一次性地将信箱中所有信件的信息转入这个向量,然后可以查阅,存储到文件中,或者进行其他处理。
10.6.2创建应用程序的过程
1.使用MFCAppWizard创建应用程序框架
工程名是pop3,应用程序的类型是基于对话框的,对话框的标题是“接收电子邮件客户端程序”,需要WindowsSockets的支持,其它部分接受系统的默认设置就可以。
向导自动为应用程序创建了两个类:
应用程序类:
CPop3App,基类是CWinApp,对应的文件是pop3.h和pop3.cpp。
对话框类:
CPop3Dlg,基类是CDialog,对应的文件是pop3Dlg.h和pop3Dlg.cpp。
2.为对话框添加控件
在程序的主对话框界面中按照图10-9添加相应的可视控件对象,并按照表10-10修改控件的属性。
表10-10对话框中的控件属性
控件类型
控件ID
Caption
静态文本statictext
IDC_STATIC
pop3服务器地址
用户名
口令
编辑框editbox
IDC_EDIT_SERVER
IDC_EDIT_USER
IDC_EDIT_PASS
复选框CheckBox
IDC_CHECK_DEL
删除邮箱中的邮件
多文本框RichEditBox
IDC_RICH_INFO
组合选择框ComboBox
IDC_COMB_LIST
(DropList型)
命令按钮button
IDC_BTN_CONN
连接
IDC_BTN_DISC
断开
IDCANCAL
取消
IDC_BTN_VIEW
查看邮件
IDC_BTN_SAVE
存储
3.定义控件的成员变量
按照表10-11,用类向导(ClassWizard)为对话框中的控件对象定义相应的成员变量。
表10-11控件对象的成员变量
ControlIDs
变量名称
MemberVariableName
变量类别
Category
变量类型
VariableType
m_strServer
Value
CString
m_strUser
m_strPass
m_bolDel
BOOL
m_ctrList
Control
CComboBox
m_Info
m_ctrlnfo
CRichEditCtrl
4.为对话框中的控件对象添加事件响应函数
按照表10-12,用类向导(ClassWizard)为对话框中的控件对象添加事件响应函数。
表10-12对话框控件的事件响应函数
对象标识ObjectID
消息Message
函数Memberfunctions
命令按钮
BN_CLICKED
OnBtnConn
OnBtnDisc
OnBtnView
OnBtnSave
5.为Cpop3Dlg类添加其它的成员
voidDisp(LONGflag);
//在不同的会话阶段显示不同的信息
mySockpop3Socket;
//套接字类对象实例
6.创建从CAsyncSocket类继承的派生类
为了能够捕获并响应socket事件,应创建用户自己的套接字类,可利用类向导添加。
ClassType选择MFCClass,类名为mySock,基类是CAsyncSocket类,创建后对应的文件是mysock.h和mysock.cpp。
在利用类向导为mysock类添加OnConnect,OnClose和OnReceive三个事件处理函数,并为它添加一般的成员函数和变量。
可参看下一小节的程序代码。
7.手工添加包含语句以及事件函数和成员函数的代码
8.分阶段编译执行,进行测试
10.6.3程序清单
1.CPop3App应用程序类对应的文件
pop3.h不动,在pop3.cpp的InitInstance()函数中添加一句初始化多文本框控件的函数。
BOOLCPop3App:
InitInstance()
if(!
AfxSocketInit())
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
returnFALSE;
}
AfxEnableControlContainer();
//MFC自动创建的代码
AfxInitRichEdit();
//用户添加的
...............
2.CPop3Dlg对话框类对应的文件
(1)pop3Dlg.h包含文件
.........
#include"
mySock.h"
//添加套接字类的包含文件
classCPop3Dlg:
publicCDialog
//Construction
public:
CPop3Dlg(CWnd*pParent=NULL);
//standardconstructor
...........
(2)pop3Dlg.cpp实现文件
stdafx.h"
pop3.h"
pop3Dlg.h"
//手工添加的包含语句
...................
BOOLCPop3Dlg:
OnInitDialog()
.............
//TODO:
Addextrainitializationhere
//用户在这里添加控件成员变量的初始化代码
m_strServer=_T("
"
);
//POP3服务器地址
m_strUser=_T("
example"
//邮箱的用户名
m_strPass=_T("
123456"
//口令
m_bolDel=FALSE;
//下载邮件后不删除
m_Info=_T("
//多文本框清空
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
.................
//以下是事件处理函数和其他成员函数的代码
//当用户点击"
连接"
按钮时,执行此函数
voidCPop3Dlg:
OnBtnConn()
//设定pop3类的对话框指针变量,使之指向本对话框,以便传递信息
pop3Socket.SetParent(this);
UpdateData(TRUE);
//取来用户在对话框中输入的数据
pop3Socket.Create();
//创建套接字对象的底层套接字
pop3Socket.Connect((LPCSTR)m_strServer,110);
//连接pop3服务器
m_Info="
;
//多文本列表框清空
UpdateData(FALSE);
//更新用户界面
断开"
OnBtnDisc()
pop3Socket.Close();
查看邮件"
OnBtnView()
inti;
i=m_ctrList.GetCurSel();
//获得用户在组合框中的选择
//获得并显示指定信件的基本属性及信件内容
m_Info+=pop3Socket.GetMsgStuff(i);
m_Info+=pop3Socket.GetMsgBody(i);
//在不同的情况下,向用户显示不同的信息
Disp(LONGflag)
CStrings;
switch(flag)
caseS_CONNECT:
//已连接到服务器,显示信息
s="
已连接到"
+m_strServer+"
...\r\n"
m_Info+=s;
//禁用连接按钮
GetDlgItem(IDC_BTN_CONN)->
EnableWindow(FALSE);
//启用断开按钮
GetDlgItem(IDC_BTN_DISC)->
EnableWindow(TRUE);
//禁用查看邮件按钮
GetDlgItem(IDC_BTN_VIEW)->
break;
caseS_RECEIVE:
//收到服务器发来的响应,显示它的内容
m_Info+=pop3Socket.lastMsg;
caseS_CLOSE:
//显示关闭连接的信息
m_Info+=pop3Socket.error;
连接已经关闭\r\n"
//启用连接按钮
//禁用断开按钮
caseS_GETNUM:
//已经知道了邮箱中信件的总数
s.Format("
邮箱中共有%d封信\r\n"
pop3Socket.numMsg);
caseS_GETSIZE:
//显示信件的大小
信箱中信件大小为:
%d字节\r\n"
pop3Socket.sizeMsg);
caseS_ENDRETR:
//所有信件已下载完毕,显示信息
共下载了%d封信件\r\n"
pop3Socket.msgs.size());
//如果有信件下载,启用查看邮件按钮
if((pop3Socket.msgs.size())>
0)
//当点击“存储”按钮时,执行此函数。
OnBtnSave()
//获得指定信件的基本属性及信件内容
s=pop3Socket.GetMsgStuff(i);
s+=pop3Socket.GetMsgBody(i);
CFileDialogdlg(FALSE);
if(dlg.DoModal()==IDOK)
CFilefile(dlg.GetPathName(),
CFile:
modeCreate|CFile:
modeWrite|CFile:
typeBinary);
file.Write((LPCSTR)s,s.GetLength());
file.Close();
3.mySock套接字类对应的文件
(1)mysock.h包含文件
............
#include<
vector>
strstream>
string>
usingnamespacestd;
classCPop3Dlg;
//显示不同信息的标志
#defineS_CLOSE1//当关闭连接时,显示关闭信息
#defineS_CONNECT2//当连接成功时,显示连接信息
#defineS_RECEIVE3//当收到服务器发来的信息时,显示该信息
#defineS_GETNUM4//当所有信件下载完毕后,显示信箱中的信件总数
#defineS_GETSIZE5//当所有信件下载完毕后,显示信箱中的信件总大小
#defineS_ENDRETR6//当所有信件下载完毕后,显示相关信息
//描述pop3会话状态的枚举类型
//用来缓存一封信件信息的结构
//自己的套接字类
classmySock:
publicCAsyncSocket
//Attributes
CStringlastMsg;
CStringerror;
intnumMsg,sizeMsg,retrMsg;
//盛放信件信息的向量
//Operations
//获得基本的邮件信头字段:
From,To,Date,Subject,Body
CStringGetMsgStuff(inti);
CStringGetMsgBody(inti);
//获得信件体
CStringGetMsgSubject(inti);
//获得信件标题
CStringGetMsg(inti);
//获得整封信的内容
voidClose();
//退出服务器
voidSetParent(CPop3Dlg*pDlg);
mySock();
virtual~mySock();
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(mySock)
virtualvoidOnConnect(intnErrorCode);
virtualvoidOnClose(intnErrorCode);
virtualvoidOnReceive(intnErrorCode);
//}}AFX_VIRTUAL
//Generatedmessagemapfunctions
//{{AFX_MSG(mySock)
//NOTE-theClassWizardwilladdandremovememberfunctionshere.
//}}AFX_MSG
//Implementation
protected:
private:
voidReadLn(intindex,CStringsrc,CString&
dst);
voidAnalyzeMsg();
CPop3Dlg*m_pDlg;
intdelMsg;
};
..............
(2)mysock.cpp实现文件
//自己添加的包含语句
................
#defineMAX_BUFF20000
//构造函数,对某些成员变量初始化
mySock:
mySock()
m_pDlg=NULL;
state=FIRST;
error="
Notconnectedtoserver\r\n"
~mySock()
//如果连接成功,执行此函数。
//接到此消息仅仅显示了一句话,开关了一些按钮连接成功后,服务器发来响应,因此
//又立即收到了OnReceive消息,后来的会话过程中,一来一往,程序总是收到
//OnReceive消息,所以真正的事情在那里作。
voidmySock:
OnConnect(intnErrorCode)
if(nErrorCode==0)m_pDlg->
Disp(S_CONNECT);
//服务器端关闭连接,才会收到此消息。
OnClose(intnErrorCode)
Disp(S_CLOSE);
//套接字收到服务器发来的数据时,执行此函数
OnReceive(intnErrorCode)
if(nErrorCode==0)
charbuff[MAX_BUFF];
//接收缓冲区
intrec=Receive(buff,MAX_BUFF);
//接收服务器发来的数据
buff[rec]=NULL;
//结尾置为NULL。
lastMsg=buff;
AnalyzeMsg();
//分析收到的数据,作不同的处理
}else{
在接收数据时发送了错误!
\r\n"
m_pDlg->
//显示信息
//设置套接字类的对话框指针变量
SetParent(CPop3Dlg*pDlg)
m_pDlg=pDlg;
//获得第i封信件的标题信息
CStringmySock:
GetMsgStuff(inti)
CStringret;
intwhere=msgs[i].text.Find("
From:
ReadLn(where,msgs[i].text,ret);
ret+="
where=msgs[i].text.Find("
To:
if(where!
=-1)
Date:
ret+=GetMsgSubject(i);
returnret;
//获得第i封信件的信件体
GetMsgBody(inti)
\r\n\r\n"
if(where!
=-1)where+