电子邮件发送程序的设计与实现.docx
《电子邮件发送程序的设计与实现.docx》由会员分享,可在线阅读,更多相关《电子邮件发送程序的设计与实现.docx(16页珍藏版)》请在冰豆网上搜索。
![电子邮件发送程序的设计与实现.docx](https://file1.bdocx.com/fileroot1/2023-1/30/730634c0-8a22-469e-9c3c-e8576a888c77/730634c0-8a22-469e-9c3c-e8576a888c771.gif)
电子邮件发送程序的设计与实现
电子邮件发送程序的设计与实现
摘要电子邮件(简称E-mai1)又称电子信箱、电子邮政,它是-种用电子手段提供信息交换的通信方式。
电子邮件软件的最基本功能就是实现邮件的发送与接收,本课程设计完成电子邮件的发送功能实现。
本程序是在了解RFC底层协议的SMTP协议和POP协议基础上,以VS2005为开发平台,使用WebBrowser控件并使用C#编程语言从SMTP协议规定的底层命令做起一步步的与服务器进行交互操作,最终实现发送邮件功能,其发送功能包括:
简单邮件的发送、带附件的邮件的发送、发送次数的设置。
文中深入讲解了SMTP的原理及电子邮件发送程序的设计与实现方法。
关键词电子邮件;SMTP;VS;C#编程;邮件发送
1前沿
1。
1课题背景
随着Internet的迅猛发展,电了邮件(E—Mall)已成为凼特网上非常流行、非常方便的通信方式。
电子邮件(简称E-mai1)又称电子信箱、电子邮政,它是—种用电子手段提供信息交换的通信方式。
它是全球多种网络上使用最普遍的一项服务。
这种非交互式的通信,加速了信息的交流及数据传送,它是—个简易、快速的
方法。
通过连接全世界的Internet,实现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。
到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E—mai1不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息.
电子邮件发送程序的发送方式有两种:
第一种是本地计算机与用户所指定的发送邮件服务器连接,然后通过发送邮件服务器将邮件传送到接收邮件的服务器,邮件中包含有信件主题和内容等一系列信息;第二种是本地计算机直接与接收电子邮件的服务器相连接,并将邮件送入收信者的邮箱中,电子邮件接收程序则只需要处理本地计算机与存在电子邮件的服务器相连接,并通过帐号和口令从服务器中获取电子邮件,邮件中包含有信件主题、内容和发送时间等。
电子邮件不是一种“终端到终端"的服务,是被称为“存贮转发式”服务。
这正是电子信箱系统的核心,利用存贮转发可进行非实时通信,属异步通信方式。
即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件立刻送到对方的信箱内,且存储在对方的电子邮箱中。
接收者可在他认为方便的时候读取信件,不受时空限制.在这里,“发送”邮件意味着将邮件放到收件人的信箱中,而“接收”邮件则意味着从自己的信箱中读取信件,信箱实际上是由文件管理系统支持的—个实体。
1.2课程设计目的
本课程设计的目的主要是学习在VS平台下围绕着电子邮件发送的编程与开发,应用软件工程的开发过程,详细论述了SMTP的分析、设计及代码实现,最终实现一个具有能发送简单邮件,发送带附件的邮件的邮件发送器。
1。
3课程设计基本任务
(1)了解C#编程环境。
(2)了解SMTP协议的通信原理。
(3)功能模块的实现。
包括发送简单邮件的实现、发送带附件的邮件的实现、设置发送次数的实现及各种错误提示的实现.
(4)系统的实现与测试。
包括编译后的C#程序和运行测试功能需求的实现.
2设计平台简介
C#编程环境简介:
20世纪80年代以来,C/C++语言一直是使用最广泛的商业化开发语言。
但在带来强大控制能力和高度灵敏性的同时,其代价是相对较长的学习周期和较低下的开发效率,同时对控制能力的滥用也给程序的安全性带来了潜在的威胁。
C++语言过度的功能扩张也破坏了面向对象的设计理念。
因此,软件行业迫切需要一种全新的现代程序设计语言,他能够在控制能力与生产效率之间达到良好的平衡,特别是将高端应用开发与底层平台访问紧密结合在一起,并与Web标准保持同步,C#(读作C—Sharp)语言就是这一使命的承担着。
C#语言是从C/C++语言发展而来的,他汲取了包括C++、Java、Delphi在内的多种语言精华,是一种简单易学、类型安全和完全面向对象的高级程序设计语言。
它的设计目标就是在继承C/C++强大功能的用时,兼有RAD(快速应用程序开发)语言的高效性。
作为。
NET的核心编程语言,c#充分享受了CLR所提供的优势,能够与其他应用程序方便的集成和交互。
下面是对它几个突出特点的描述:
语法简洁:
C#取消了指针、也不定义繁琐的伪关键字;它使用有限地指令、修饰符合操作符,语法上几乎不存在任何冗余,整个语言结构十分清晰。
与Web紧密结合:
借助Web服务框架,C#使得网络开发和本地开发几乎一样简单.开发人员无需了解网络的细节,可以用统一的方式来处理本地的和远程的C#对象,而C#组件能够方便的转为Web服务,并被其他平台上的各种编程语言调用。
目标软件的安全性:
C#符合通用类型系统的类型安全性要求,并用CLR所提供的代码访问安全特性,从而能够在程序中方便的配置安全等级和用户权限。
此外,垃圾收集机制自动管理对象的生命周期,这是的开发人员无需再负担内存管理的任务,应用程序的可靠性进一步得到提高。
灵活性与兼容性:
C#中允许使用非托管代码来与其他程序(包括COM组件、WIN32API等)进行集成和交互。
它还可以通过委托(delegate)来模拟织针的功能,通过接口来模拟多继承的实现。
3设计原理
3。
1软件总体架构
软件通过Form1、Program、Resources、Settings、class1类来实现电子邮件发送的各种功能,如发送简单邮件、发送带附近的邮件、设置发送次数、发送邮箱的类型……用户通过主界面来选择这些功能,软件为用户提供相应的服务。
总体架构如图3.1:
图3。
1软件总架构
3。
2程序功能框架图
电子以邮件发送软件向用户提供了各种功能,其中主功能为:
简单邮件的发送和带有附件的邮件的发送,附加功能有:
设置邮件自动发送的次数。
另外,此程序中还有各种错误的提示,如发件人、收件人、主题格式不合法的提示,附件路径是否正确的提示,网络不正常的提示等等。
如图3。
3所示:
图3。
2程序功能框架
3.3SMTP协议研究与分析
简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。
SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。
理解到传送系统(或IPCE)不是一对一的是很重要的.进程可能直接和其它进程通过已知的IPCE通信。
邮件是一个应用程序或进程间通信。
邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。
更特别的是,邮件可以通过不同网络上的主机接力式传送。
SMTP基于以下通信模型:
针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。
接收SMTP可以是最终接收者也可以是中间传送者。
SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送.
一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者.如果SMTP接收者可以接收邮件则返回OK应答。
SMTP发送者再发出RCPT命令确认邮件是否接收到。
如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。
当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。
SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继SMTP服务器传送。
为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。
SMTP命令
邮件内容
应答
图3。
3SMTP通信模型
3.4环境说明
WindowsXP操作系统;MicrosoftVisualStudio2005
4详细设计
4.1窗体界面控件设计
本次窗口设计中,主要用到工具箱资源,工具箱中包含了可重用的控件。
窗口是实现应用程序人机交互的重要组成部分,它不但可以实现数据流的输入和输出,而且也可以移动和关闭对话框。
使用可视化的方法编程时,可在窗体中拖放控件,绘制出应用程序界面.尤其在设计对话框时,使用工具箱中的可视化控件无疑使开发变得十分方便。
要在应用程序中操作对话框资源,首先需要创建它。
本实验在vs2005中对程序界面设计的对话框如图4.1所示
图4.1电子邮件发送程序界面
其中,6个文本框的Name属性从上到下依次为:
From,To,Subject,Attach,Pass,Body。
2个按钮的Name属性为Send,Exit。
4。
2程序实现
本课程设计中主要是用到了sendmail命名空间,此空间的包含的类为Form1、Program、Resources、Settings、class1,其中class1类用于检测发件人、收件人和主题是否合法。
这5个类中最核心的类为Form1。
下面将对Form1类分四部分进行说明:
1)构造电子邮件
此部分主要有以下属性和方法
From
发件人的地址
To
以分号分隔的收件人的地址列表
Subject
电子邮件的主题
Body
电子邮件的正文
BodyFormat
电子邮件的正文内容类型
Attachments
电子邮件附件集合
在本次课程设计中,From文本框用于填写发件人的地址、To文本框用于填写收件人的地址、Subject文本框用于填写信件主题、Attach文本框用于手动添加附件、Pass文本框用于填写邮箱密码、Body文本框用于写入信件正文,双击各文本框时,文本框的内容自动清除后即可完成文本框内容的输入,程序中初始化一些信息.具体代码如下所示:
//双击发件人监听方法
privatevoidtextBox_from_DoubleClick(objectsender,EventArgse)
{
//设置发送文本为空
textBox_from。
Text=null;
}
//双击收件人文本框的监听方法
privatevoidtextBox_to_DoubleClick(objectsender,EventArgse)
{
//设置接收人文本为空
textBox_to。
Text=null;
}
//双击主题文本框的监听方法
privatevoidtextBox_subject_DoubleClick(objectsender,EventArgse)
{
//设置主题文本框为空
textBox_subject.Text=null;
}
//双击附件文本框
privatevoidtextBox_attach_DoubleClick(objectsender,EventArgse)
{
//情况附件内容
textBox_attach。
Text=null;
}
//密码框双击监听方法
privatevoidtextBox_pass_DoubleClick(objectsender,EventArgse)
{
//清空密码框
textBox_pass.Text=null;
}
//邮件体双击监听方法
privatevoidtextBox_body_DoubleClick(objectsender,EventArgse)
{
//清空邮件体文本框
textBox_body。
Text=null;
}
//初始化一些信息
privatevoidForm1_Load(objectsender,EventArgse)
{
//发送次数
textBox_time.Text="1";
//发件人地址
textBox_from。
Text=”xuna134700@”;
//收件人地址
textBox_to.Text="xuna134700@";
//邮件标题
textBox_subject.Text="我的邮件”;
//邮件主体内容
textBox_body.Text="发送成功”;
//邮箱密码
textBox_pass.Text=”271853927";
//发送次数文本框默认为不可修改
textBox_time。
Enabled=false;
//自动发送复选按钮默认为未选中状态
checkBox1.Checked=false;
}
2)构造电子邮件附件
Attachment用来构造电子邮件附件。
用此类构造了电子邮件附件然后添加到MailMessage对象的Attachments集合即可。
在本次课程设计中,通过单击添加附件和删除附件按钮实现附件的添加和删除,添加附件成功后添加到message对象中,具体实现代码如下:
//添加附件按钮触发函数
privatevoidbutton1_Click(objectsender,EventArgse)
{
openFileDialog1。
ShowDialog();
textBox_attach.Text=openFileDialog1。
FileName;
}
//删除附件按钮触发函数
privatevoidbutton2_Click(objectsender,EventArgse)
{
textBox_attach.Text=””;
}
//判断是否有附件添加有的话就添加到message对象中
if(textBox_attach.Text。
Contains(”:
\\"))
{
//添加附件到message对象
message.Attachments。
Add(newAttachment(textBox_attach。
Text));
}
3)发送电子邮件及其附件,这是这个类中的核心函数
在本次课程设计中,通过单击单击发送按钮和复选按钮来实现邮件的发送和发送次数的设置,通过退出按钮进行退出。
邮件发送时,发送按钮的文本将自动改为“正在发送”,此时,程序将对发件人和收件人地址进行封装、设置主题和内容的编码格式、并创建一个MailMessage对象用于传递邮件、最后构造smtp客户端对象后便可实现邮件的发送.邮件发送成功后,会自动跳出“发送成功"的对话文本框.具体代码如下所示:
//发送邮件按钮
privatevoidbutton3_Click(objectsender,EventArgse)
{
//取得发送次数
inti=Convert。
ToInt32(textBox_time。
Text);
//按发送次数循环发送
for(intx=1;x<=i;x++)
{
button_send.Text=”发送”;
//线程睡1秒
Thread.Sleep(1000);
//如果自动发送的复选按钮为选中状态则执行这里
if(checkBox1.Checked==true)
{
//将发送信息写入主题文本框
textBox_subject.Text=”test"+count。
ToString();
//发送次数加1
count+=1;
}
//将发送按钮的文本改为“正在发送"
button_send.Text=”正在发送”;
//将发送按钮设置为不可点击状态
button_send.Enabled=false;
try
{
//封装发件人地址
MailAddressfrom=newMailAddress(textBox_from。
Text.Trim());
//封装收件人地址
MailAddressto=newMailAddress(textBox_to。
Text.Trim());
//创建一个MailMessage对象用于传递邮件
MailMessagemessage=newMailMessage(from,to);
//设置主题
message.Subject=textBox_subject。
Text;
//设置邮件体信息
message.Body=textBox_body。
Text;
//将邮件体部分设置为html格式
message.IsBodyHtml=true;
//判断是否有附件添加有的话就添加到message对象中
if(textBox_attach。
Text.Contains(”:
\\”))
{
//添加附件到message对象
message。
Attachments.Add(new
Attachment(textBox_attach.Text));
}
//设置主题部分的编码为默认
message。
SubjectEncoding=System。
Text.Encoding。
Default;
//设置邮件体部分的编码为默认
message.BodyEncoding=System。
Text.Encoding.Default;
//构造smtp客户端对象
SmtpClientclient=newSmtpClient("smtp。
”+textBox_from。
Text。
Split('@')[1]);
//构造NetworkCredential对象用于封装邮件
System。
Net.NetworkCredentialsmtpuserinfo=newSystem.Net。
NetworkCredential();
//写入用户名和密码
smtpuserinfo。
UserName=textBox_from。
Text。
Split('@')[0];
smtpuserinfo。
Password=textBox_pass。
Text;
//将smtpuserinfo对象设置为smtp客户端的Credentials
client。
Credentials=smtpuserinfo;
//发送邮件。
。
。
client。
Send(message);
}
//到这里说明发送成功了
if(checkBox1.Checked==false)
{
MessageBox。
Show(”发送成功","提示");
}
//恢复发送按钮为可点击状态
button_send.Enabled=true;
//恢复发送按钮文本为“发送"
button_send。
Text=”发送";
}
if(checkBox1。
Checked==true)
//提示本次发送成功了
MessageBox。
Show(textBox_time。
Text+"次发送完毕",”提示”);
button_send。
Text="发送";
}
//点击复选按钮的处理方法
privatevoidcheckBox1_CheckedChanged(objectsender,EventArgse)
{
//复选框为选中状态
if(checkBox1.Checked==true)
{
//发送次数变为可编辑状态
textBox_time.Enabled=true;
}
//不是的话设置发送次数框为不可编辑状态
elsetextBox_time.Enabled=false;
}
//退出按钮
privatevoidbutton1_Click_1(objectsender,EventArgse)
{
//应用程序退出
Application.Exit();
}
4)各种异常处理方法
在本程序中,各种异常包括:
文本框格式异常、附近路径异常、smtp异常和未预料的其他类型异常。
具体实现代码如下:
//捕获格式错误异常
catch(FormatException)
{
myclass。
check(textBox_from.Text,textBox_to.Text,textBox_subject。
Text);
return;
}
//捕获异常
catch(UnauthorizedAccessException)
{
if(checkBox1.Checked==false)
MessageBox。
Show("请输入正确的附件路径”);
return;
}
//捕获smtp异常
catch(SmtpException)
{
if(checkBox1。
Checked==false)
MessageBox.Show(”请检查网络是否正常”,"提示");
elsecontinue;
}
//捕获未预料到的其他类型异常
catch
{
if(checkBox1。
Checked==false)
{
MessageBox.Show("发生不可预料的错误,请仔细检查以上选项是不有错!
",”提示");
checkBox1。
Checked=false;
}
elsecontinue;
}
5系统的实现与测试
5.1发送电子邮件程序主界面(带附件)
在对话框输入信息后,单击发送按钮实现邮件的发送,可以添加附件也可以不添加附件,单击复选框也可以设置邮件的发送次数。
下图为添加附件不设置发送次数的邮件发送运行结果。
如图5.1所示:
5.1发送电子邮件程序主界面(加载附件)
5。
2接收界面(带附件)
邮件发送出去之后,用IE浏览器跟踪接收之后,证明邮件正常接收,具体的的接收界面如图5。
2所示:
图5.2验证邮件和附件的发送是否成功
6结束语
通过这次的课程设计,在谢晓巍老师悉心专业指导之下,经历了2星期的虚心学习与不耻下问,终于完成了本次课程设计。
通过这次课程设计使我对网络编程有了一个很好的认识和锻炼,更加巩固了对计算机网路技术的认识,例如TCP协议,服务器相关知识,SMTP协议等,也使我对CSharp这一语言的有一定的了解,明白到C#作为一门新兴语言继承c和c++强大功能基础上发展出来,在编程方面上具有高效易编语法简单等优势。
在编程的同时也巩固了对c和c++语言的认识,为以后更加深入学习巩固了基础。
在此次课程设计当中更加重要的是提升了自身的学习能力与解决问题的能力。
在此之前CSharp这门语言对我来讲是一门陌生语言通过自学CSharp令我明白到遇到问题要从多个方面入手解决问题总有解决问题的办法,锻炼了自身独立解决问题的能力,更加明白到自身知识水平的不足。
同时令我明白到在团队同学老师当中互相学习互相请教互相帮组的重要性。
总之这次课程设计令我受益匪浅,深有感触,从从课题选择、方案论证到具体设计和调试,都是凝结了老师跟同学们的智慧和汗水,没有你们的无私帮组就没有我这课程设计的完成,深深感谢老师同学们无私的帮助,和学校提供良好的学下环境和充分的学习资料。
参考文献
[1]SimonRobinso