logo资料库

计算机网络计算机网络邮件收发.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
收发无附件的邮件
一、设计要求及设计内容
1.1课设概述
2.2设计思路
2.2.1熟悉SMTP和POP3协议:
三、具体程序及主要代码
邮件发送核心代码:
void CSample37View::OnSendMail()
{// 找到要调用的MAPI函数地址
(FARPROC&) lpfnMAPISendMail = GetProcAddress(m
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hMAPI
(FARPROC&) lpfnMAPILogoff =GetProcAddress(m_hMAP
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_
// 生成信报结构指针
m_pMessage = new(MapiMessage);
memset(m_pMessage, 0, sizeof(MapiMessage)); // 下
UpdateData(TRUE); // 把
m_pMessage->ulReserved = 0; // 设
char subject[512];
::strcpy(subject, m_strSubject);
m_pMessage->lpszSubject = subject; //
char text[20000];
::strcpy(text, m_strContent);
m_pMessage->lpszNoteText = text; // 设置
m_pMessage->lpszMessageType = NULL; // 指向接收这个消息
CTime time = CTime::GetCurrentTime();
CString str = time.Format("%Y//%m//%d//%H");
char t[50];
::strcpy(t, str);
m_pMessage->lpszDateReceived = t;// 指向标识消息所属会话线
m_pMessage->lpszConversationID = NULL;// 设置flFla
m_pMessage->flFlags = MAPI_SENT;
// 用一个指向MapiRecipDesc结构的指针设置发送者信息
m_pMessage->lpOriginator = NULL;// 设置接收者数目
m_pMessage->nRecipCount = 1;// 接收者信息
str = m_strAddress.Left(m_strAddress.Find('@'));
char address1[100];
char address2[100];
::strcpy(address1, str);
str = "SMTP:"+m_strAddress;
::strcpy(address2, str);
MapiRecipDesc recipient = {0, MAPI_TO, address1,
m_pMessage->lpRecips = &recipient;// 设置附件数量
m_pMessage->nFileCount = 0;// 设置附件信息
m_pMessage->lpFiles = NULL;// 建立会话
LHANDLE lhSession;
ULONG lResult = lpfnMAPILogon(0, NULL, NULL, 0, 0
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("发送失败");
return;
}// 进行信报的发送
lResult = lpfnMAPISendMail(0, 0, m_pMessage, 0, 0
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("发送失败");
return;
}// 释放信报结构的内存空间
lpfnMAPIFreeBuffer(m_pMessage);// 结束会话
lResult=lpfnMAPILogoff(lhSession, 0, 0, 0);
m_strSubject = "邮件已成功发送给" + m_strAddress;
m_strAddress = "cpf84802@163.com";
m_strContent = "";
UpdateData(FALSE);
}
邮件接收核心代码:
void CRecvView::OnRecvMail()
{
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hMAPI
(FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hMAP
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(m_hM
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hM
count++;// 建立会话
ULONGlResult = lpfnMAPILogon(0, NULL, NULL, MAPI
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("建立会话失败");
return;
}// 定位到第一个邮件
char pMessageID[513];
lResult = lpfnMAPIFindNext(m_lhSession, NULL, NUL
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("错误:请确认收件箱不为空!");
return;
}// 分配信报结构的内存空间
m_pMessage = new(MapiMessage);
memset(m_pMessage, 0, sizeof(MapiMessage));// 读取第
lResult = lpfnMAPIReadMail(m_lhSession, NULL, pMe
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("错误:读取信报出错!");
return;
}// 处理读取结果,在窗口中显示得到的信报
m_strSubject = (CString)m_pMessage->lpszSubject;
m_strAddress = (CString)m_pMessage->lpOriginator-
m_strTime = (CString)m_pMessage->lpszDateReceived
m_strContent = (CString)m_pMessage->lpszNoteText;
UpdateData(FALSE);// 在访问另一条信件以前释放内存
lpfnMAPIFreeBuffer(m_pMessage);// 结束会话
lResult=lpfnMAPILogoff(m_lhSession, 0, 0, 0);
return;
}
四、调试及运行结果
4.1调试工具
《计算机网络》课程设计报告书 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位:计算机科学与技术学院 题 目: 收发无附件的邮件 初始条件:本门课程设计的目的旨在使学生进一步巩固课堂上所学的理论知识, 深化理解和灵活掌握教学内容,培养学生解决实际问题的动手能力。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体 要求)要求学生在上机前应认真做好各种准备工作,熟悉每个题目涉及的网络相关知识, 熟悉机器的操作系统、语言的集成环境和设计工具,独立完成算法编制和程序代码的编 写;上机时应随带有关的教材或指导书;要学会程序的调试与测试。 课程设计时间为一周。周五交报告,报告的内容应包括:(1)任务书;(2)简要的 设计目的和预期结果;(3)程序清单,程序分析说明与测试结果;(4)收获与体会。 时间安排: 周一:收集与查阅相关文献,熟悉题目。 周二:需求分析与功能设计。 周三:编码,完成初步功能模块。 周四:代码测试并逐步完善。 周五:撰写报告,课程设计验收。 小组成员可互相讨论,但严禁抄袭。 指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日 1
《计算机网络》课程设计报告书 收发无附件的邮件 一、 设计要求及设计内容 1.1 课设概述 该课程设计主要任务是实现收发无附件的邮件。在上机前应认真做好各种准备工作, 熟悉每个题目涉及的网络相关知识,熟悉机器的操作系统、语言的集成环境和设计工具。 在实验过程中,通过一个实际网络协议或网络应用系统的分析与总体设计,综合运用所 学知识,加深对网络知识理解和掌握。同时培养自己的分析问题和解决问题的能力,以 及软件文档的制作能力。 1.2 电子邮件的工作原理: (1) 电子邮件系统是一种新型的信息系统,是通信技术和计算机技术结合的产物。 电子邮件的传输是通过电子邮件简单传输协议(Simple Mail Transfer Protocol,简称 SMTP) 这一系统软件来完成的,它是 Internet 下的一种电子邮件通信协议。 (2) 电子邮件的基本原理,是在通信网上设立“电子信箱系统”,它实际上是一个 计算机系统。系统的硬件是一个高性能、大容量的计算机。硬盘作为信箱的存储介质, 在硬盘上为用户分一定的存储空间作为用户的“信箱”,每位用户都有属于自己的—个 电子信箱。并确定—个用户名和用户可以自己随意修改的口令。存储空间包含存放所收 信件、编辑信件以及信件存盘三部分空间,用户使用口令开启自己的信箱,并进行发信、 读信、编辑、转发、存档等各种操作。系统功能主要由软件实现。 (3) 电子邮件的通信是在信箱之间进行的。用户首先开启自己的信箱,然后通过 键入命令的方式将需要发送的邮件发到对方的信箱中。邮件在信箱之间进行传递和交换, 也可以与另—个邮件系统进行传递和交换。收方在取信时,使用特定账号从信箱提取。 1.3 电子邮件的实现 E-mail 通信过成时给予 TCP/IP 协议的。在本次实验中,主要使用的是 SMTP 及 POP 两个协议,它们在 windows 里都是通过 Winsock 来实现通信。 (1)SMTP 模型描述:采用 C/S(客户端/服务器)模式。常用的 SMTP 服务器运行在 远程站点上,它是邮件的中间传递机构。发送邮件的客户端不用了解如何把邮件发送到 目的信箱的服务器上,只要告诉具有传递机制的 SMTP 服务器一些必要的信息即可以实 现简单邮件传输功能。 (2)POP 模型描述:它是一个简单协议,可以用来从邮件服务器上下载邮件。通过 POP,可以从 Internet 提供商的服务器下载邮件,并通过邮件程序来阅读邮件,或者处 2
《计算机网络》课程设计报告书 理邮件。如:接收邮件、下载邮件、删除邮件等。 二、 软件设计描述 2.1 需求分析 在本次实验中,代码主要完成的功能是实现邮件的收发,因此需要利用基于 SMTP 的简单邮件传输协议和基于 POP 的接收下载邮件协议。因此在本实验中,需设计 5 大模 块: 1.主函数模块,可设定菜单栏,有用户自行选择要对邮箱进行哪项操作; 2.对于输入的邮箱用户进行连接与身份认证; 3.基于 SMTP 协议下实现邮件发送功能,可实现一对一的邮件发送; 4.基于 POP 协议下实现邮件接收功能,即能读取邮件信息; 5.基于 POP 协议下实现邮件下载功能,即存储邮件; 2.2 设计思路 2.2.1 熟悉 SMTP 和 POP3 协议: 由于要开发的是邮件客户端程序,就不得不用到 SMTP 协议和 POP 协议。邮件发 送功能的实现,必然会涉及到 SMTP(Simple Mail Transfer Protocol)协议。SMTP 被用 来在因特网上发送邮件,该协议规定了一些基本的命令和方法使客户端与服务器进行交 互,以达到发送邮件的目的。 (1)、SMTP 协议 SMTP 协议(简单邮件传输协议)是 TCP/IP 协议族中的一员,主要对如何将电子 邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。针对用户的邮件 请求,发送 SMTP 建立与接收 SMTP 之间建立一个双向传送通道。接收 SMTP 可以是最终接收者 也可以是中间传送者。SMTP 命令由发送 SMTP 发出,由接收 SMTP 接收,而应答则反方面传送。 SMTP 协议的通信过程比较简单,可以通过下图来理解: 用户 文件 系统 SMTP 命令及邮件内容 发送端 SMTP 协 议软件 接收端 SMTP 协 议软件 文件 系统 接受端的应答 由于 SMTP 协议是基于 TCP 协议的,且是建立连接的,因此在发送邮件之前,需 要利用 TCP 协议在发送端与接收端之间建立一条连接。然后,发送端通过 SMTP 命令 3
《计算机网络》课程设计报告书 将邮件内容发送到接收端,接收端将接收到的命令和内容处理后,将应答返回给发送 端。就这样,完成邮件发送的过程。 (2)、POP3 协议 POP3 协议(邮局协议第三版)适用于 C/S 结构,其通信也是建立 TCP 连接的。通 信过程中,POP3 客户端向 POP3 服务器发送命令并等待响应。POP3 命令同 SMTP 命令 一样,均采用命令行形式,用 ASCII 码表示。 2.2.2 运用 SMTP 和 POP3 协议发送接收邮件: (1)、用 SMTP 命令发送邮件 SMTP 命令 命令说明 HELLO <domain> <CRLF> 识别发送方到接收 SMTP 的一个 HELLO 命令 MAIL FROM: < reverse-path > < CRLF> RCPT TO:<forward-path><CRLF > DATA <CRLF> REST <CRLF> NOOP <CRLF> QUIT <CRLF> VRFY <string> <CRLF> EXPN <string> <CRLF> <reverse-path>为发送者地址。此命令告诉接 收方一个新邮件发送的开始,并对所有的状态和 缓冲区进行初始化。此命令开始一个邮件传输处 理,最终完成将邮件数据传送到一个或多个邮箱 中。 <forward-path>标识各个邮件接收者的地址 接收 SMTP 将把其后的行为看作邮件数据去处理, 以<CRLF>.<CRLF>标识数据的结尾。 退出/复位当前的邮件传输 要求接收 SMTP 仅做 OK 应答。(用于测试) 要求接收 SMTP 返回一个 OK 应答并关闭传输。 验证指定的邮箱是否存在,由于安全因素,服务 器多禁止此命令。 验证给定的邮箱列表是否存在,扩充邮箱列表, 也常禁止使用。 HELP <CRLF> 查询服务器支持什么命令 利用上述命令,可以与 smtp.163.com.cn 服务器建立连接并发送邮件。 以下为程序参考流程: 4
《计算机网络》课程设计报告书 开始 生成初始用户名、密 码、发信邮箱地址 选择或输入服 务器名称 输入用户名、密码、发 信邮箱、收信邮箱等信 从文件中读取 E-mail 地址及类型代码 提示读取 失败 息 提示信息 填写不完 整 读取成功? N Y 选择客户类型并从 info.txt 文件 中读取出该类型的邮件内容 N 信息填写是 否完整? Y 开始发送邮件 N 邮件发送是 否成功? Y 提示邮件发送成功 在状态框中提 示失败的环节 结束 5
《计算机网络》课程设计报告书 (2)用 POP3 命令接收邮件 POP3 命令 USER 命令说明 用户名,此命令与下面的 pass 命令若成功,将导致状态转 换。 PASS 密码。 APOP Digest 是 MD5 消息摘要。 STAT 查看统计,执行后,POP3 服务器会响应一个正确应答,它以 UIDL LIST RETR DELE RSET TOP NOOP QUIT “+OK”开头,接着是两个数字,第一个是邮件数目,第二个 是邮件的大小。 返回邮件的唯一标识符,POP3 会话的每个标识符都将是唯 一的。 返回邮件数量和每个邮件的大小。 返回由参数标识的邮件的全部文本。 服务器将由参数标识的邮件标记为删除,由 quit 命令执行。 服务器将重置所有标记为删除的邮件,用于撤消 DELE 命令。 服务器将返回由参数标识的邮件前 n 行内容,n 必须是正整 数。 服务器返回一个肯定的响应。 命令发出后,telnet 断开与 POP3 服务器的连接,系统进入 更新状态。 POP3 协议要求先登录邮箱,再查看邮件。登录需要用户名和密码,在这里用户名 和密码不需要进行 BASE64 编码的加密,方便在命令行下登录,但由于用户名和密码 都是用明文传输给服务器的,因此安全性比较低。当登录成功后,就可以查看邮箱状 态、查看邮件和管理邮件了。 以下为邮件接收程序参考流程: 6
《计算机网络》课程设计报告书 开始 生成初始用户名、 密码 提示信息 不完整 选择或输入 服务器名称 更改或输入用 户名及密码 N 信息填写是 否完整? Y 登录邮箱 登录邮箱是 否成功? Y N 选择邮件序号 并打开该邮件 提示登录出错 的环节 N 是否保存邮 件? Y 将邮件保存到文件 rec_info.txt 中 结束 三、 具体程序及主要代码 邮件发送核心代码: void CSample37View::OnSendMail() { // 找到要调用的 MAPI 函数地址 (FARPROC&) lpfnMAPISendMail = GetProcAddress(m_hMAPILib, "MAPISendMail"); 7
《计算机网络》课程设计报告书 // 设置信件内容: // 设置信息类型指针 // 指向接收这个消息的时间的指针 // 下面设置信报结构的各个域 // 把 ulReserved 设置为 0: // 设置信件标题(lpszSubject): (FARPROC&) lpfnMAPILogon = GetProcAddress(m_hMAPILib, "MAPILogon"); (FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hMAPILib, "MAPILogoff"); (FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_hMAPILib, "MAPIFreeBuffer"); // 生成信报结构指针 m_pMessage = new(MapiMessage); memset(m_pMessage, 0, sizeof(MapiMessage)); UpdateData(TRUE); m_pMessage->ulReserved = 0; char subject[512]; ::strcpy(subject, m_strSubject); m_pMessage->lpszSubject = subject; char text[20000]; ::strcpy(text, m_strContent); m_pMessage->lpszNoteText = text; m_pMessage->lpszMessageType = NULL; CTime time = CTime::GetCurrentTime(); CString str = time.Format("%Y//%m//%d//%H"); char t[50]; ::strcpy(t, str); m_pMessage->lpszDateReceived = t; m_pMessage->lpszConversationID = NULL; m_pMessage->flFlags = MAPI_SENT; // 用一个指向 MapiRecipDesc 结构的指针设置发送者信息 m_pMessage->lpOriginator = NULL; m_pMessage->nRecipCount = 1; str = m_strAddress.Left(m_strAddress.Find('@')); char address1[100]; char address2[100]; ::strcpy(address1, str); str = "SMTP:"+m_strAddress; ::strcpy(address2, str); MapiRecipDesc recipient = {0, MAPI_TO, address1, address2, 0, NULL}; m_pMessage->lpRecips = &recipient; m_pMessage->nFileCount = 0; m_pMessage->lpFiles = NULL; LHANDLE lhSession; ULONG lResult = lpfnMAPILogon(0, NULL, NULL, 0, 0, &lhSession); if (lResult != SUCCESS_SUCCESS) { // 指向标识消息所属会话线程的串的指针 // 设置 flFlags 标识 // 设置接收者数目 // 接收者信息 // 设置附件数量 // 设置附件信息 // 建立会话 AfxMessageBox("发送失败"); return; } lResult = lpfnMAPISendMail(0, 0, m_pMessage, 0, 0); if (lResult != SUCCESS_SUCCESS) // 进行信报的发送 8
分享到:
收藏