基于ESMTP的电子邮件发送程序的设计与实现

时间:2021-03-06 10:49:14 研究生论文 我要投稿

基于ESMTP的电子邮件发送程序的设计与实现

  摘 要:本文以VB.NET为开发平台,利用Socket套接宇编程,实现了基于ESMTP的邮件发送程序。文中深入讲解了ESMTP的原理及电子邮件发送程序的设计与实现方法。

基于ESMTP的电子邮件发送程序的设计与实现

  关键词:ESMTP,电子邮件,发送程序,VB.NET,Socke

  一、引言

  随着Intemet/Intranet的迅猛发展,电子邮件(E—Mail)已成为因特网上非常流行、非常方便的通信方式。但是,随之而来的是大量的广告邮件和垃圾邮件的泛滥,为应对这种情况,许多E—Mail服务商和ISP将它们的SMTP系统升级成了ESMTP系统。

  本文采用微软最新的。NET技术,以VB.NET为开发平台,利用Socket套接字编程,开发了基于ESMTP协议的邮件发送程序,这里将对相关原理及具体设计进行讨论。

  二、邮件传输协议

  1.ESMTP简介所谓ESMTP(Extended SMTP),即扩展的简单邮件传输协议,是邮件服务器系统为了限制非本系统的用户利用本系统散发垃圾邮件等不当行为而开设的一项安全认证服务。在ESMTP服务器上,发送邮件需要对用户的身份进行验证。它与传统的SMTP方式相比,多了一道用户身份验证手续,此外,其邮件发送过程与传统的SMTP方式一致。

  2.ESMTP的运行过程ESMTP的运行,首先要发送命令建立一个可靠的有序数据流传输通道(TCP连接),然后客户机向服务器发送其它命令,然后根据服务器回送的响应决定下一步操作,并最终实现邮件的传送。整个邮件发送过程就是两者之间进行信息交换的过程。

  一般地,邮件发送过程将依次发送如下命令并得到响应(如表1)(以163为例):

  三、程序实现我们以VB.NET为平台,通过Socket套接字编程序来实现邮件发送功能。

  1.命名空间本文中主要使用了2个命名空间及2个类。

  (1)System.Net.Sockets命名空间System.Net.Sockets命名空间为需要严密控制同络访问的开发人员提供了Windows Sockets接口的托管实现。其中,定义了Socket类可用于实现发送邮件。该类的常用成员有。:

  ① 构造函数 Socket构造函数:用于初始化Socket类的`新实例。

  ⑦ 方法

  (2)System.Net命名空间System.Net命名空间为多种协议提供了编程接口。

  (3)其他类System.Convet类:用于数据类型转换;System.Text.Encoding类:表示数据编码:

  2.程序设计为减少程序书写量,可在窗口类之前使用以下语句导人命名空间及其中的类:

  Imports System Net.SocketsImports System.NetImports System.Text.EncodingImports System.Convert这样,就可以直接弓I用其中的成员了。

  另外,窗口类中还要初始化Socket类:

  Public MySocket As New Socket一(Add ressFam y.InterNetwork,一SocketType.Stream.ProtocolType.Tcp)L 程序界面设计其中,7个文本框的Name属性从上到下依次为:SMTPServ.

  el“ UserAccount UserPassword SenderAddress、ReceiverAddress EMailSubject、EmailContent。2个按钮的Name属性依次为:Send-Mail、QuitForm。

  (2)发送电子邮件程序程序中,首先把要发送的数据(包括邮件内容和命令)存储在变量SendData中,然后调用自定义的MySender函数发送出去:

  . rivate Sub SendMall_』=lick(ByVal sender As System.

  Object,ByVal e As System.EventArgs)Handles Send-Mall ClickDIm SendData As String, HostEndPoint As IPEndPoint,HostAddress As I PAdd ressTryHostAddress=Dns.Resolve(SMTPServer,Text)。AddressList(0)HOstEndPOint = New I PEndPoint(HostAddress,25)连接服务器MySocket.Connect(HostEndPoint)Catch ex As ExceptionMsgBox( 连接失败 ):GoTo QuitSendEnd TryIf Not W ait( 220 )Then GoTo QuitSend建立会话连接SendData = SMTPServer.TextSendData = SendData.Substring(SendData Index0f( . ) + 1)SendData = EHLO + SendData + vbC rLfMySende r(SendData 1If Not Wait( 250 )Then GoTo QuitSend要求身份验证SendData = AUTH LOGIN + vbCrLfMySender(SendData) .

  If Not W ait( 334 )Then GoTo QuitSend验证用户帐号SendData = TOBase64Strinq(ASCIIGetBytes(UserAccount.Text))+vbCrLfMySender(SendData)If Not W ait( 334 )Then GoTo QuitSend验证用户密码SendData = TOBase64Strinq(ASCI1.

  GetBytes(Use rPassword.Text))+vbC rLfMySender(SendData)If Not W ait( 235 )Then GoTo QuitSend发件人地址SendData = MAlL FROM: +SenderAdd ress.Text + vbCrLfMySender(SendData)If Not W ait( 250 )Then GoTo QuitSend收件人地址SendData = RCPT TO: +ReceiverAdd ress.Text + vbC rLfMySender(SendData)If Not Wait《 250 )Then GoTo QuitSend请求发送数据SendData = DATA vbCrLfMySender(SendData)If Not Wait《 354 )Then GoTo QuitSend显示发件人地址SendData = F rOm: +SenderAddress.Text + vbCrLf加上收件人地址SendData = SendData + To: +ReceiverAdd ress.Text + vbCrLf加上主题SendData =SendData + Subject: +EMailSubject.Text 4-vbCrLf加上邮件正文SendData = SendData + EMailContent Text加上邮件结束符SendData=vbCrLf+SendData + . + vbCrLfMySender《SendData)If Not W ait《 250 )Then GoTo QuitSend退出会话连接SendData = QUIT vbCrLfMySender(SendData)If Not W aitl 221 )Then GoTo QuitSendQuitSend: 关闭MySocket.Shutdown(SocketShutdown.

  Receive)MySocket.Close(】

  End Sub(3)自定义函数①数据发送程序程序会等待,直到Socket处于可写状态时,则将数据发送出去。

  Public Function MySender《ByVaI Data As String)Dim MyW riteBufer As Byte 1)MyW riteBuffer= ASC GetBytes《Data)lf MySocket.Poll(一1,SelectMode.

  SelectW rite)ThenMySocket.Send《MyW riteBuffer)End Function②等待应答函数程序最多等待5O秒,直到Socket处于可读状态时,则读取数据,并与期待的应答码相比较。

  Public Function W ait l ByVal ResDOnseCOde As String) AsBooleanDim MyReadBufer(1 024)As ByteDim TotalStr As StringDim PreThreeW ord As StringMySocket.Receive《MyReadBuffer)If MySocket.Poll《50000,一SelectMode.SelectRead)ThenMySocket.Receive《MvReadBuffer)TotaIStr= ASCI1.GetString lMyReadBufer)PreTh reeWord=TotalStr.Substring(0 3)If PreThreeW ord <> ResDOnseCOde ThenRetu rn FalseRetu rn TrueEnd Function

  四、几点说明(1)关于ESMTP中继服务器设置目前,绝大多数邮件服务器都支持ESMTP,但是有些服务器仅支持通过Web页面发送邮件,而不支持这种客户端程序发送邮件。本文程序在smtp.163.eom测试发送成功。

  (2)关于程序的完整性本文利用Socket编程实现基于ESMTP的邮件发送功能,重在讲解ESMTP的原理、运行过程,以及Socket的程序设计方法 因此,程序力求精简。故尚有须补充之处:

  ①错误处理。比如:未对邮件地址输入错误进行处理。

  ②提示信息。比如:缺乏邮件发送进度提示。

  在实用程序中,这些都是必需的,但由于篇幅所限,故在本文的邮件发送程序中将这部分省去,读者可自行补充完整。

  五、结束语

  随着电子邮件的普及,垃圾邮件等危害服务器正常运转的行为也日益增多,因此,绝大多数服务器均采用ESMTP进行用户身份认证。同时,也就需要客户端软件能够完成身份认证工作。本文在VB.NET中利用套接字编程实现了此功能。

【基于ESMTP的电子邮件发送程序的设计与实现】相关文章:

基于Perl的DoS工具设计与实现09-09

基于Vxworks实时操作系统的串口通信程序设计与实现10-06

浅谈基于RFID 的会议签到系统设计与实现论文07-09

基于LED的光通信系统的设计与实现论文12-02

浅谈基于Openstack 的网络攻防实验平台设计与实现论文07-11

基于J2EE在线考试系统的设计与实现09-27

一种基于网络的监控软件设计与实现08-20

基于OpenGL的邦宝模型积木分析系统设计与实现10-05

基于PowerPC+DSP总线通信软件的设计与实现论文12-02