邮件发送器
网络信息处理课程设计
#实验
#
邮件发送器
设计与实现
学院:计算机学院
班级:信科09-1
姓名:朱云超
学号:08093526
指导老师:顾军
时间:2012.4—2012.6
1
目录
1. 概 述 ....................................................................................................................... 3 2.邮件发送器的总体设计 .............................................................................................. 4
2.1系统模块结构 .................................................................................................... 4 3.
的研究与分析 ...................................................................................................... 4
3.1 SMTP协议简介及通讯模型 ............................................................................. 4
3.1.1 SMTP协议简介 .................................................................................... 4
3.2 POP3协议简介及工作原理 .............................................................................. 5
3.2.1 POP3协议简介 ........................................................................................ 5
3.2.2 POP工作原理 .......................................................................................... 5 4.本系统使用软件介绍 .................................................................................................. 6 5.本系统的实现 ............................................................................................................. 8
5.1 对话框工程的创建 ........................................................................................... 8
5.2 源程序部分代码 ............................................................................................. 12 6.程序测试 ................................................................................................................... 17
6.1邮件发送器程序主界面,如图6.1所示:..................................................... 17
6.2邮件发送器附件主界面,如图6.2所示:..................................................... 18
6.3邮件发送器SMTP设置主界面,如图6.3所示:......................................... 19
6.5邮件发送器未输入收信人信箱提示,如图6.5所示: ................................. 21
6.6 邮件发送成功,如图6.6所示: ................................................................... 22
6.7 无法连接到服务器,如图6.7所示: ........................................................... 23
7.结束语及
:........................................................................................................ 23
2
邮件发送器设计与实现
1. 概 述
电子邮件(简称E-mai1)又称电子信箱、电子邮政是—种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送,它是—个简易、快速的方法。通过连接全世界的
将邮件送到世界的各个角落。Internet,实现各类信号的传送、接收、存贮等处理,
到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E-mai1不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。
电子邮件的处理有两大部分组成:电子邮件发送程序和电子邮件接收程序。电子邮件发送程序的发送方式有两种:第一种是本地计算机与用户所指定的发送邮件服务器连接,然后通过发送邮件服务器将邮件传送到接收邮件的服务器,邮件中包含有信件主题和内容等一系列信息;第二种是本地计算机直接与接收电子邮件的服务器相连接,并将邮件送入收信者的邮箱中,电子邮件接收程序则只需要处理本地计算机与存在电子邮件的服务器相连接,并通过帐号和口令从服务器中获取电子邮件,邮件中包含有信件主题、内容和发送时间等。由于本人能力有限,此次程序设计只有邮件发送部分。
系统使用VisualC++ 6.0作为开发工具,开发一个功能全面,应用广泛电子邮件应用程序。系统实现的功能主要有创建与更改帐号,发送电子邮件及其附件。
本例发送程序采取了既可与发送邮件服务器连接又可以直接与接收邮件服务器连接的方式来实现电子邮件的发送。用户在“收信人邮箱”所对应的对话框中输入收件人的Email地址,并SMTP设置里面填入相应的服务器、端口号、用户账号及密码和“发信人邮箱”Email地址和姓名等,在POP3服务器设置里的信息会根据SMTP设置相应修改,但还需填入POP3服务器和端口号,编辑信件的主题、正文(本例还可以发送附件,只要填写真确的路径,就可以发送附件),然后单击“发送”按钮,便可完成电子邮件的发送。电子邮件发送成功,程序将弹出一个“发送成功”的消息对话框;若电子邮件发送失败,程序将给出失败的相关信息。
3
2.邮件发送器的总体设计
2.1系统模块结构
发送邮件模块:发送邮件,发送附件,SMTP设置,POP3设置 3.协议的研究与分析
3.1 SMTP协议简介及通讯模型
3.1.1 SMTP协议简介
SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。SMTP协议的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。SMTP协议通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。可大致用下面的图3.1来表示:
图3.1 SMTP通信模型
4
3.2 POP3协议简介及工作原理
3.2.1 POP3协议简介
邮局协议 3 (POP3) 是检索电子邮件的
协议。POP3 协议控制 POP3 电子邮件客户端和存储电子邮件的服务器之间的连接。POP3 服务使用 POP3 协议将电子邮件从邮件服务器检索到 POP3 电子邮件客户端。POP3 协议针对电子邮件服务器与电子邮件客户端之间的连接时具有三种处理状态:身分验证状态、事务处理状态和更新状态。在身份验证状态下,连接到服务器的 POP3 电子邮件客户端必须先接受身份验证,然后用户才能检索电子邮件。如果电子邮件客户端提供的用户名和密码与服务器上的匹配,则用户通过身份验证,然后进入事务处理状态。如果不匹配,用户会收到错误消息,不允许连接和检索电子邮件。为防止对邮件存储区的破坏,客户端通过身份验证后,POP3 服务会锁定用户的邮箱。用户通过身份验证后,由于邮箱已被锁定,除非该连接被终止,否则不能下载提交到邮箱的新电子邮件。同样,每次只允许一个客户端连接到邮箱,其他连接邮箱的请求都会被拒绝。 在事务处理状态下,客户端发送 POP3 命令,同时服务器会根据 POP3 协议接收命令并做出响应。如果服务器接收的任一客户端请求不符合 POP3 协议,就会被忽略,并返回错误消息。更新状态关闭客户端与服务器端之间的连接。这是客户端发送的最后命令。连接关闭后,邮件存储区会更新,以反映用户连接到邮件服务器后的变化情况。例如,除非用户的电子邮件客户端配置成执行其他操作,否则在用户成功检索电子邮件后,已检索的电子邮件将被标记成删除,然后从邮件存储区中删除。 3.2.2 POP工作原理
POP3(Post Office Protocol 3) 是适用于C/S结构的脱机模型的电子邮件协议, 目前已发展到第三版。POP3规定了怎样将个人计算机连接到Internet的邮件服务器并下载电子邮件的规则。POP3是因特网电子邮件的第一个离线协议标准, 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器, 用来接收电子邮件。 POP适用于C/S结构的脱机模型。脱机模型即不能在线操作,不像IMAP4(netscape支持IMAP4)当客户机与服务器连接并查询新电子邮件时,被该客户机指定的所有 将被下载的邮件都将被程序下载到客户机,下载后,电子邮件客户机就可以删除或 修改任意邮件,而无需与电子邮件服务器进一步交互。POP3
5
客户向POP3服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。 服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行以ASCII 文本+OK或-ERR指出相应的操作状态是成功还是失败在POP3协议中有三种状态,认可状态,处理状态,和更新状态。 当客户机与服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可 状态转入处理状态,在完成相应的操作后客户机发出quit命令,则进入更新状态,更新之后最后重返认可状态。如下图3.2所示:
等待连接 身份确认 quit命令
—— |认可|————— |处理|——————|更新|
|__________________________________|
重返认可状态
图 3.2 POP3工作
图
4.本系统使用软件介绍
一般情况下,在Visual C++中,电子邮件程序的编写是利用Windows自带的MAPI以及相关的通信协议SMTP/POP3 等来实现的。但是要利用MAPI和通信协议实现一个功能强大的电子邮件管理程序,需要有很强的相关专业知识。随着现代软件业的发展,软件厂商提供了方便、简易、与服务器无关且稳固的电子邮件处理组件,使我们可以在程序开发语言中调用这些组件,利用很简单的语言实现功能强大的程序。JMail组件便是一个很好的电子邮件程序开发第三方组件。
JMail组件中包含有许多实现电子邮件处理的属性和方法。只需要在Visual C++代码中创建一个JMail组件对象,调用其中的某些功能,就能很快完成程序的开发。JMail常用的基本属性和方法如表4.1所示。
6
JMail常用发送与接收信件的基本属性和方法
方法和属性 功能
Body 邮件内容
Charset 字符集,默认为“US-ASCII” Sendname 发送人姓名
Sender 发送人邮箱地址
SMTP服务器地址,可指定多个,Serveraddress 用分号分开,并可指定端口;为空白
时,JMail会尝试解决远程邮件服务
器,然后直接发送过去即可 Subject 标题
Priority 优先级(1:高优先级3:普通
有限级别5:低优先级 ) AddAttachment(“filename”,[Content添加文件附件 Type])
AddCustomAttachment(“filemane”,da添加自定义附件 ta)
AddURLAttachment 下载并添加一个来自bstrURL(“bstrURL”,”bstrAttachAS”,[bstr的附件,BstrAttachAS指定收到信Auth]) 件的文件名
AddRecipient(“Email-Address”) 增加一个收件人 AddRecipientEX(“Email-Address”,增加一个带名字的收件人 “name”)
AppendBodyFromFile(“Filename”) 将一个追加到正文后 AppendText(Text”) 追加信的正文内容 Execute()方法 执行发送
Close()发送 强制JMail关闭缓冲与邮件服
务器的连接
Date 信件发送日期 MailServer 邮箱所在的服务器 Subject 标题
Timeout 连接服务器的超时限制 Connect()方法 连接服务器,需要参数:帐号、
口令、服务器地址、端口
7
5.本系统的实现
5.1 对话框工程的创建
本次设计中,主要用到对话框资源。对话框(Dialog)是实现应用程序人机交互的重要组成部分。对话框实际上也是一个窗口,它不但可以实现数据流的输入和输出,而且也可以移动和关闭对话框,甚至还可以进行图形的绘制和操作。 主要对话框的设计及控件:
对话框IDD_LCMAILER_DIALOG的控件
资源标识 类型 相关属性及功能说明
IDC_EDIT_MAILTO 默认 收信人信箱
IDC_EDIT_SUBJECT 默认 主题
8
IDC_EDIT_BODY Multiline 正文 IDC_BUTTON_ATTACHMENT 默认 附件
IDC_BUTTON_SEND 默认 发送 IDC_BUTTON_SERVERSETU默认 SMTP设置
P
IDC_BTN_POP3SETUP 默认 POP3设置
IDC_BUTTON_EXIT 默认 退出
对话框IDD_SERVERSETUP_DIALOG的控件
资源标识 类型 相关属性及功能说明 IDC_EDIT_SERVERNAME 默认 服务器
IDC_EDIT_PORT 默认 端口 IDC_CHECK_NEEDAUTH 默认 SMTP 服务器需要身份验
证 IDC_EDIT_ACCOUNT 默认 用户帐号
9
IDC_EDIT_PASSWORD Password 用户密码
IDC_EDIT_FROM 默认 发信人信箱 IDC_EDIT_USERNAME 默认 发信人姓名
对话框IDD_POP3SETUP_DIALOG的控件
资源标识 类型 相关属性及功能说明 IDC_EDIT_USERNAME 默认 用户名 IDC_EDIT_PASSWORD Password 密码 IDC_EDIT_POP3SERVER 默认 POP3服务器 IDC_EDIT_POP3PORTT 默认 POP3端口
10
对话框IDC_BUTTON_ATTACHMEN的控件
资源标识 类型 相关属性及功能说明 IDC_LIST_ATTACHMENT 默认 附件显示 IDC_BUTTON_ADD 默认 添加 IDC_BUTTON_DEL 默认 删除
IDOK 默认 确定
创建对话框资源
创建与对话框资源相关联的对话框类的派生类
创建对话框中的控件的消息响应
创建与对话框中控件相关联的变量
创建对话框类派生类的对象
调用DoModal()显示对话框
11
对话框资源的创建与使用流程
5.2 源程序部分代码
(1) 发送控件代码 CLCMailerDlg::OnButtonSend void CLCMailerDlg::OnButtonSend() {
// TODO: Add your control notification handler code here
CString szBuf;
CSendDlg hSendDlg;
hSendDlg.m_nCopyNumber = 1;
m_ctrlTo.GetWindowText(szBuf);
if(szBuf.IsEmpty())
{
MessageBox("请先填写收信人信箱~", "忘记啦,", MB_OK | MB_ICONHAND);
m_ctrlTo.SetFocus();
return;
}
//“SMTP服务器”:
hSendDlg.m_strSmtpServer = m_szServerName;
//“端口”:
hSendDlg.m_nPort = atoi(m_nPort);
//“用户帐号”:
hSendDlg.m_strAccount = m_szAccount;
//“用户密码”:
hSendDlg.m_strPassword = m_szPassword;
//“发信人”:
hSendDlg.m_strFrom = m_szFrom;
//“用户姓名”:
hSendDlg.m_strUsername = m_szUsername;
//“收信人”:
m_ctrlTo.GetWindowText(szBuf);
12
hSendDlg.m_strTo = szBuf;
//“主题”:
m_ctrlSubject.GetWindowText(szBuf);
hSendDlg.m_strSubject = szBuf;
//“正文”:
m_ctrlBody.GetWindowText(szBuf);
hSendDlg.m_strBody = szBuf;
//附件文件列表:
hSendDlg.m_szFilenames.Copy(m_szFilenames);
//是否需要验证:
hSendDlg.m_bNeedAuth = atoi(m_nNeedAuth);
//正式发送:
hSendDlg.DoModal();
//“清零”:
m_ctrlTo.SetWindowText("");
m_ctrlSubject.SetWindowText("");
m_ctrlBody.SetWindowText("");
m_szFilenames.RemoveAll();
m_ctrlTo.SetFocus();
}
(2)附件控件代码CLCMailerDlg::OnButtonAttachment void CLCMailerDlg::OnButtonAttachment() {
// TODO: Add your control notification handler code here
CAttachment hAttachmentDlg;
hAttachmentDlg.m_pLCMailerDlg = this;
hAttachmentDlg.DoModal();
}
(3) 附件对话框中添加控件代码CAttachment::OnButtonAdd void CAttachment::OnButtonAdd() {
// TODO: Add your control notification handler code here
OPENFILENAME ofn;
CString szFile;
13
//初始化 ofn 的值:
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = this->GetSafeHwnd();
ofn.lpstrFile = szFile.GetBuffer(256);
ofn.nMaxFile = 256;
ofn.lpstrFilter = "所有文件 (*.*)\0*.*\0可执行文件
(*.exe)\0*.exe\0Word文档 (*.doc)\0*.doc\0文本文件 (*.txt)\0*.txt\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = "请选择附件„";
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_LONGNAMES |
OFN_EXPLORER;
//“打开文件”对话框:
if(GetOpenFileName(&ofn) == TRUE)
{
//在列表中添加“文件名”:
int nCount = m_ctrlAttachment.GetItemCount();
m_ctrlAttachment.InsertItem(nCount, szFile);
HANDLE hFile = CreateFile(szFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
//在列表中添加“文件大小”:
DWORD dwFileSize = GetFileSize(hFile, NULL);
CString szTemp;
szTemp.Format("%2.2f KB", (float)dwFileSize / 1024);
m_ctrlAttachment.SetItem(nCount, 1, LVIF_TEXT, szTemp, 0,
LVIS_SELECTED, LVIS_SELECTED, 0);
14
//把“文件名”添加进附件文件列表变量中:
m_pLCMailerDlg->m_szFilenames.Add(szFile);
CloseHandle(hFile);
}
}
szFile.ReleaseBuffer();
}
(4) 附件对话框中删除控件代码 CAttachment::OnButtonDel void CAttachment::OnButtonDel()
{
// TODO: Add your control notification handler code here
//得到当前被选择的 Item 的 Index :
int nItem = -1;
nItem = m_ctrlAttachment.GetNextItem(nItem, LVNI_SELECTED);
//从列表中删除:
m_ctrlAttachment.DeleteItem(nItem);
//从附件文件列表变量中删除:
m_pLCMailerDlg->m_szFilenames.RemoveAt(nItem); }
(5)对话框POP3设置中确定控件代码CPop3Dalog::OnOK void CPop3Dalog::OnOK()
{
// TODO: Add extra validation here
//返回“SMTP服务器”:
CString szBuf;
m_ctrlPop3Server.GetWindowText(szBuf);
m_pLCMailerDlg->m_szPop3Server = szBuf;
m_ctrlUserName.GetWindowText(szBuf);
m_pLCMailerDlg->m_szAccount = szBuf;
m_ctrlPassWord.GetWindowText(szBuf);
m_pLCMailerDlg->m_szPassword = szBuf;
//返回“端口”:
m_ctrlPop3Port.GetWindowText(szBuf);
15
m_pLCMailerDlg->m_nPop3Port = szBuf;
CDialog::OnOK();
}
(6)对话框SMTP设置中确定控件代码CServerSetup::OnOK void CServerSetup::OnOK()
{
// TODO: Add extra validation here
CString szBuf;
//返回“SMTP服务器”:
m_ctrlServerName.GetWindowText(szBuf);
m_pLCMailerDlg->m_szServerName = szBuf;
//返回“端口”:
m_ctrlPort.GetWindowText(szBuf);
m_pLCMailerDlg->m_nPort = szBuf;
//返回“需要验证”:
szBuf.Format("%d", m_ctrlNeedAuth.GetCheck());
m_pLCMailerDlg->m_nNeedAuth = szBuf;
//返回“用户帐号”:
m_ctrlAccount.GetWindowText(szBuf);
m_pLCMailerDlg->m_szAccount = szBuf;
//返回“用户密码”:
m_ctrlPassword.GetWindowText(szBuf);
m_pLCMailerDlg->m_szPassword = szBuf;
//返回“发信人信箱”:
m_ctrlFrom.GetWindowText(szBuf);
m_pLCMailerDlg->m_szFrom = szBuf;
//返回“发信人姓名”:
m_ctrlUsername.GetWindowText(szBuf);
m_pLCMailerDlg->m_szUsername = szBuf;
CDialog::OnOK();
}
16
6.程序测试
6.1邮件发送器程序主界面,如图6.1所示:
图6.1邮件发送器程序主界面
17
6.2邮件发送器附件主界面,如图6.2所示:
图6.2邮件发送器附件主界面
18
6.3邮件发送器SMTP设置主界面,如图6.3所示:
图6.3邮件发送器SMTP设置主界面
19
6.4邮件发送器POP3设置主界面,如图6.4所示:
图6.4邮件发送器POP3设置主界面
20
6.5邮件发送器未输入收信人信箱提示,如图6.5所示:
图6.5邮件发送器未输入收信人信箱提示
21
6.6 邮件发送成功,如图6.6所示:
图6.6邮件发送成功
22
6.7 无法连接到服务器,如图6.7所示:
图6.7无法连接到服务器
7.结束语及心得:
经过几个星期的不懈努力,终于设计出一个邮件发送器并调试通过,最后整理出设计报告。通过编写邮件发送器,对于MFC编程有了更深一步的了解,里面的功能也基本能够熟练运用,还发现利用组件JMail和Visual C++联合能很轻松得开发出功能强大却十分简洁的软件,且不需要太多的专业知识。
目前系统还不够完整,还存在着很多的不足和不完善的地方:系统功能趋于简单,只是实现了邮件发送功能,对于邮件接收功能还没有实现。而且真正的邮件系
23
统包括很多方面的信息,比如邮件导入、邮件导出、文本编辑(查找与撤消)、通讯簿、通讯规则等等功能。
参考文献:
《Visual C++网络编程经典案例详解》 梁伟 清华大学出版社 《Visual C++网络通信开发入门与编程实践》 李媛媛 电子工业出版社 《Visual C++开发典型模块大全》 明日科技 刘锐宁 宋坤 人民邮电出版社
24