《VisualC网络编程案例实战之邮件接收和发送客户端》由会员分享,可在线阅读,更多相关《VisualC网络编程案例实战之邮件接收和发送客户端(111页珍藏版)》请在金锄头文库上搜索。
1、第8章 邮件接收和发送客户端 邮件接收和发送客户端的作用是在本地计算机 和远程计算机之间传送电子信件以及接收电子 信件。用户平时所用的Foxmail就是一种邮件 接收和发送客户端。通常情况下,Foxmail由 发送者将电子信件发送到邮件服务器(SMTP )中,再由SMTP服务器将该邮件发送到POP3 (接收邮件)服务器中,邮件接收者通过账户 和口令再从POP3服务器中获取信件。在本章 中,将向用户介绍邮件接收和发送客户端的原 理以及开发过程。8.1 调用Windows自带的邮件发送 程序 一般情况下,用户所使用的Windows操作系统 中都带有默认的邮件发送程序。通过该邮件发 送程序,用户可以
2、将邮件发送到任何目的地 址。这种方法比较简单适用,所以很受大部分 用户欢迎。用户可以在操作系统中,使用操作 系统命令打开邮件程序。如果用户需要在自己 的程序中调用系统自带的邮件程序,那么需要 使用函数CreateProcess()或者ShellExecute()进 行调用。下面将分别介绍这两种方法。8.1.1 调用Windows自带程序 在Windows操作系统中,所有的程序都是以进 程为单位运行。本节中所讲述的调用邮件发送 程序就是通过调用相应的Windows进程实现 的。调用该Windows进程所使用的命令是 “mailto:+string”,其中,string表示邮件发送的 目的地址。例
3、如,用户需要将邮件发送到邮件 地址为的邮箱中,使用的命令 是“mailto:”。 首先,在Windows系统界面下选择“开始”|“运 行”命令,弹出“运行”对话框,如图8.1所示。图8.1 “运行”对话框 然后,在运行对话框中输入命令 “mailto:”,可以打开Windows 自带的邮件发送程序进行邮件发送,如图8.2 所示。图8.2 Windows邮件收发器 以上过程是用户通过Windows命令调用邮件收 发器必须做的。实际上,除了这种方法,用户 还可以在程序中通过函数调用Windows邮件收 发器。此种方法将在8.1.2节中进行讲解。8.1.2 CreateProcess()函数 在VC
4、中编程,MFC类库已经提供了几个库函 数用于调用Windows的外部程序,包括邮件收 发程序。在本节中,将向用户介绍其中的两个 函数CreateProcess()和ShellExecute()。1使用CreateProcess()函数CreateProcess()函数可以创建Windows进程,同时也可以调用已 经存在的进程。该函数的原型如下:BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTR
5、IBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); 该函数创建进程成功则返回true,否则返回false。其 参数意义如下: 参数lpApplicationName表示可执行文件的名字。用户 指定该参数后,该函数会在当前路径下搜索可执行文 件,但不会按照系统
6、的搜索路径进行搜索。 注意:使用该参数时,需要加上扩展名,因为系统 不会自动为其添加“.exe”后缀名。 参数lpCommandLine表示将要传递到新进程的命令行 字符串。使用该参数时,该函数会自动为其添加后缀 名“.exe”。如果参数字符串没有指定所在路径,那么 该函数则会按照系统的搜索路径进行搜索文件。 参数bInheritHandles表示该进程创建的子进程是否能 继承父进程的对象句柄。 参数lpStartupInfo指向结构体STARTUPINFO的指针变 量。该结构体的声明如下:typedef struct _STARTUPINFO DWORD cb;/表示该结构体的大小 LPTS
7、TR lpReserved;/保留,必须将该参数初始化为NULL LPTSTR lpDesktop; LPTSTR lpTitle; /设置控制台程序的名称 DWORD dwX; /设置应用程序窗口的X坐标 DWORD dwY; /设置应用程序窗口的Y坐标 DWORD dwXSize; /设置应用程序窗口的横向大小 DWORD dwYSize; /设置应用程序窗口的纵向大小 DWORD dwXCountChars; /以字符为单位设置应用程序窗口的X坐标 DWORD dwYCountChars; /以字符为单位设置应用程序窗口的Y坐标 DWORD dwFillAttribute; /设置应用程
8、序窗口所使用的背景色等 DWORD dwFlags; /表示创建窗口的标志 WORD wShowWindow; /是否显示应用程序窗口 WORD cbReserved2; /保留,将该参数必须设置为0 LPBYTE lpReserved2;/保留,将该参数必须设置为0 HANDLE hStdInput; /设置控制台程序的输入输出缓存句柄 HANDLE hStdOutput; HANDLE hStdError; /错误输出句柄 STARTUPINFO, *LPSTARTUPINFO; 该结构体主要用于保存新创建进程的窗口信息 ,如窗口的大小或窗口的显示方式等。其中, 参数dwFlags标识了窗
9、口创建成功以后,在显 示之前以何种方式进行显示。其取值如表8.1 所示。表8.1 程序窗口显示标志取值注意:在表8.1中所示的程序窗口显示标志的作用仅仅是为了控制相应的成员变量是 否有效而已。例如,用户在程序中,需要使用到该结构体中的dwFillAttribute成员。那 么,用户必须将参数dwFlags取值为STARTF_USEFILLATTRIBUTE。否则,该成员变 量将无效。 参数lpProcessInformation是指向结构体PROCESS_INFORMATION的指针变量。该结 构体声明如下:typedef struct _PROCESS_INFORMATION HANDLE
10、hProcess; /进程句柄 HANDLE hThread; / 线程句柄 DWORD dwProcessId; /进程ID DWORD dwThreadId; /线程ID PROCESS_INFORMATION;取 值含 义 STARTF_USESIZE使用dwXSize和dwYSize成员员 STARTF_USESHOWWINDOW使用wShowWindow成员员 STARTF_USEPOSITION使用dwX和dwY成员员 STARTF_USECOUNTCHARS使用dwXCountChars和dwYCountChars成员员 STARTF_USEFILLATTRIBUTE使用dwFi
11、llAttribute成员员 STARTF_USESTDHANDLES使用hStdInput、hStdOutput、hStdError成员员STARTF_RUN_FULLSCREEN以全屏方式启动程序该结构体主要用于保存进程的相关信息。其他参数均可以默认设 置为NULL。例如,调用操作系统的记事本程序。代码如下:01. /省略部分代码 02STARTUPINFO si=sizeof(si); /定义结构体变量 03PROCESS_INFORMATION pi; /定义结构体对象 04CString *str=“notepad”; /记事本名称 05 CreateProcess(NULL,str
12、,NULL,NULL,false,NULL,NULL,NU LL, 06/调用函数打开记事本程序 07. /省略部分代码同样的道理,用户在本例中,也可以使用函数 CreateProcess()调用邮件收发程序。代码如下:01. /省略部分代码 02STARTUPINFO si=sizeof(si); /定义结构体变量 03PROCESS_INFORMATION pi;04CString *str=“mailto:“; /打开邮件程序的系统命令 05 CreateProcess(NULL,str,NULL,NULL,false,NULL,NUL L,NULL, 06/调用函数打开记事本程序 07
13、. /省略部分代码2使用ShellExecute()函数在MFC编程中,除了函数CreateProcess()以外,还可以调用函数ShellExecute()实现相 同的功能。该函数原型如下:HINSTANCE ShellExecute( HWND hwnd, /父窗口句柄 LPCTSTR lpOperation, /将要进行的操作形式 LPCTSTR lpFile, /目录文件名称或文件路径 LPCTSTR lpParameters, /传递的参数 LPCTSTR lpDirectory, /一般为NULL INT nShowCmd /显示方式 ); 该函数执行成功会返回调用程序的应用程序指
14、针,否则返回错误代码。部分错误代码 如表8.2所示。表8.2 部分错误代码错 误 代 码意 义ERROR_FILE_NOT_FOUND找不到相应应文件ERROR_PATH_NOT_FOUND找不到所需路径ERROR_BAD_FORMAT无效的.exe文件SE_ERR_ASSOCINCOMPLETE无效的文件名0 操作系统的内存溢出 该函数各个参数的说明已在函数原型中标出。使 用该函数调用操作系统自带的邮件发送程序,代 码如下: 以上代码是使用C语言编写,并且使用命令行窗 口界面,目的是为了让用户了解整个调用过程。 在随书光盘的第8章中附有代码,请用户自行参 考。此段代码在VC中编译后的结果,如
15、图8.3所 示。用户在运行界面1中输入字符Y或y,然后按 下Enter键。程序提示邮件程序正在打开,当邮件 程序打开以后,实例程序会提示已经打开邮件程 序,如图8.4所示。图8.3 运行界面1图8.4 运行界面2 注意:在程序中为了模拟计算机的工作,所以 笔者使用了while循环产生时间差,仅仅是为了让 用户重复了解该调用过程。在实际编程中,不提 倡使用该方法产生时间差,因为这种方法很危险 ,容易造成系统的崩溃。通常,使用多线程编程 的方法比较安全,也是笔者极力推荐的一种方 法。该类方法将在后面的相关章节中讲述。8.2 SMTP会话过程 SMTP是发送邮件协议,与前面所讲的FTP、 HTTP等协议一样被用作某种行为的规范标 准。本节的主要内容就是向用户讲解邮件客户 端怎么连接SMTP服务器以及向SMTP服务器 发送信件等操作。8.2.1 怎么连接服务