文章收藏-FAQ 位置:电脑学习网

邮件代理服务器及其实现

    邮件代理服务器
    代理服务器是一种中转机构,它将来自客户端的请求转至远程服务器,同时将服务器的应答返回到客户端。其目的有二:一是使不可达路径变为可达,即路由型;二是对通信过程实施预定的监控,即应用型。
    邮件代理服务器专用于电子邮件的收发传递,其中用于邮件发送的称为SMTP代理,用于邮件接收的称为POP3代理。电子邮件的收发分别采用SMTP和POP3协议,邮件客户端程序和邮件服务器之间通过一系列约定的命令序列和相应的应答信息,完成邮件收发。应用型邮件代理对邮件收发过程实施监控,必须对邮件的协议、编码等进行具体处理;而路由型代理只负责邮件请求和回应的中转,实现较为简单。本文给出一个路由型代理示例,在此基础上,通过截获和深入分析了解邮件收发过程全部信息,可以按需要进行应用型邮件代理的设计。本文程序中,SMTP和POP3都基于TCP/IP协议,编程接口为SOCKET,采用比较简明的面向对象设计方法,用VB语言实现。
    SMTP代理服务器的实现
    在FORM中设计两个SOCKET控件SktClient和SktServer,前者作为服务器方与邮件客户程序通信,后者作为客户方与远程邮件服务器通信。设计两个TEXT控件TxtClient和TxtServer,用于显示邮件客户端发送的命令请求及邮件服务器回应信息,置其属性为多行可滚动。在Form_Load()过程中填充以下语句,使SMTP代理运行后处于监听状态:
    ’SMTP缺省端口号
    SktClient.LocalPort = 25
    ’监听邮件客户端连接请求
    SktClient.Listen
    监听到邮件客户端连接请求后,SMTP代理服务器立即连接远程邮件服务器,在SktClient_Connection Request()中加入:
    ’关闭监听,进行处理
    If SktClient.State 〈〉 sckClosed Then SktClient.Close
    ’取得连接的ID号,连接远程邮件服务器
    SktClient.Accept requestID
    ’远程邮件服务器地址
    SktServer.RemoteHost = “10.120.15.205“
    ’端口号25=SMTP
    SktServer.RemotePort = 25
    ’连接
    SktServer.Connect
    SktServer收到应答后在文本框TxtServer中显示数据,并转发给邮件客户端:
    Private Sub SktServer_DataArrival(ByVal bytesTotal As Long)
    Dim strdata As String
    ’取出数据
    SktServer.GetData strdata
    ’取出数据
    TxtServer.Text=TxtServer.Text+vbCrLf+strdata
    TxtServer.Refresh
    ’服务器回应并转发到客户端
    SktClient.SendData strdata
    SktClient收到客户端数据后,取出数据在文本框TxtClient中显示,并将数据发送给远程邮件服务器:
    SktClient_DataArrival(ByVal bytesTotal As Long)
    Dim strdata As String
    ’取出数据,放在字符串strdata中
    SktClient.GetData strdata
    ’在文本框中分行显示
    TxtClient.Text=TxtClient.Text+vbCrLf+strdata
    TxtClient.Refresh
    ’邮件客户端请求转发到远程服务器
    SktServer.SendData strdata
    在TCP/IP通信中,断开与连接一样由客户方发起,服务器方接收CLOSE消息,因此在SktClient_Close()中进行下列处理:
    ’关闭与邮件客户端的连接
    SktClient.Close
    ’关闭与远程邮件服务器的连接
    SktServer.Close
    ’继续监听下一次连接请求
    SktClient.Listen
    通过分析两个文本框中的信息,可以了解邮件发送整个过程的操作。由此根据SMTP协议可分离出发信人、收信人、主题、信件编码与内容、附件编码与内容等关键信息,使之扩展为应用型代理,对邮件发送进行监控。
    POP3代理服务器的实现
    POP3代理的难点在于要支持多信箱取件,因邮件客户端程序一般支持多个POP3信箱,所以设计前要了解邮件收取的过程。邮件客户程序首先向服务器发送连接请求,服务器应答后,客户端发送USER命令传递POP3用户名,服务器确认后,客户端发送用户口令,服务器再次确认,之后进入取信操作。多个POP3信箱下,远程邮件服务器是不确定的,故POP3代理要连接的对象不定。使用POP3代理时,通常在邮件客户程序的服务器处填上代理地址,再在用户名之后加隔离符注明实际POP3服务器地址(如hzh/10.120.15.205)。下面给出其实现代码,该控件设置与SMTP代理相同。在Form_Load()中添加如下代码:
    ’全局变量,1表示客户端已发出连接请求
    First = 0
    ’POP3 端口号
    SktClient.LocalPort = 110
    ’监听邮件客户端收取信件的连接请求
    SktClient.Listen
    SktClient收到邮件客户端请求时,远程POP3服务器地址还是未知的,不能进行连接,为使邮件客户程序继续进行操作,POP3代理必须向其发送伪应答信息:
    Sub SktClient_ConnectionRequest()
    ’关闭监听,处理连接
    If SktClient.State 〈〉 sckClosed Then SktClient.Close
    ’取得连接标识
    SktClient.Accept requestID
    ’设置全局标志
    First = 1
    ’向邮件客户端发送伪应答信号
    SktClient.SendData “+OK POP3 server ready“ + vbCrLf
    邮件客户端收到伪应答后,接着向POP3代理发送USER命令,其中带有远程邮件服务器地址。POP3代理分离出邮件服务器地址,进行实际连接:
    Sub SktClient_DataArrival(ByVal bytesTotal As Long)
    Dim strdata,RemotePOP3Srv As String
    Dim Pos As Integer
    ’取得邮件客户端发来数据
    SktClient.GetData strdata
    ’分行显示
    TxtClient.Text=TxtClient.Text+vbCrLf+strdata
    TxtClient.Refresh
    ’邮件客户端发送USER命令时,POP3代理服务器解析远程服务器地址,并进行实际连接
    If Left(strdata, 4) = “USER“ Then
    ’找到字符“/“在串中的位置
    Pos=InStr(strdata,“/“)
    ’用户名,为全局变量
    UserInfo = Left(strdata,Pos)
    ’远程POP3服务器地址
    RemotePOP3Srv=Right(strdata,len(strdata)-Pos)
    SktServer.RemoteHost = RemotePOP3Srv
    ’pop3端口号
    SktServer.RemotePort = 110
    ’连接远程POP3服务器
    SktServer.Connect
    ’其他情况下向服务器转发
    Else
    SktServer.SendData strdata
    End If
    远程POP3服务器收到代理的连接请求后,回送应答信息,该信息不再回传客户端。由于此时邮件客户端已经发出USER命令,POP3代理再立即将此命令补发给远程POP3服务器:
    Sub SktServer_DataArrival()
    Dim strdata As String
    ’取服务器信息
    SktServer.GetData strdata
    ’显示应答信息
    TxtServer.Text =TxtServer.Text + vbCr + strdata
    TxtServer.Refresh
    ’第一次应答
    If First = 1 Then
    ’复位标志
    First = 0
    ’补发USER命令
    SktServer.SendData userinfo + vbCrLf
    ’非第一次应答
    Else
    ’转发到邮件客户端
    SktClient.SendData strdata
    End If
    其他情况下POP3代理只做信息中转并记录,通过分析两个文本框中的内容,可以了解电子邮件收取全过程的所有信息。根据POP3协议,可以分离出发信人、收信人、主题、信件编码与内容、附件编码与内容等关键信息,为实现收信监控奠定基础。
    邮件代理服务器的应用
    邮件代理服务器可分为单用户和多用户两种版本。单用户版本在某一时间只支持一个用户操作。如本文的例子,它安装在邮件客户机器上,邮件程序中服务器地址可简单设为127.0.0.1或localhost。多用户版本可同时为多个邮件客户端做代理,其思想是由父线程专门负责侦听,侦听到连接后创建一个子线程具体处理该路通信,它通常安装在服务器上,在邮件客户程序中将服务器地址指向此机器。
    要实现邮件代理服务器的应用,必须理解邮件编码格式。PC机上电子邮件的编码分两类,即UUENCODE格式和MIME格式。前者起源于UNIX系统,后者为一种多目标扩展,应用越来越广。MIME格式中,BASE64主要用于附件的编码,信件主体多使用QP、UTF-8(UNICODE)、UTF-7和HZ格式。它们具有明显的标志,判明编码格式后进行解码得到明文,处理完毕再编码转发或换码转发。应用型邮件代理服务器在实际中有十分广泛的应用,如邮件在线加密/解密、邮件过滤和病毒在线检查等。

     [文章来源:“十万个为什么”电脑学习网]
     [网络地址:http://why100000.com]
     [版权声明:除本站部分特别声明禁止转载的专稿外,其他的文章可以自由转载,但请务必注明出处和原始作者。本站文章版权归文章原作者所有。如果本站转载的文章有版权问题请联系本站,我们会尽快予以更正。]
 

【字体:[大] [中] [小] 【加入收藏】 【发表评论】 【关闭本窗口】

Copyright © “十万个为什么”电脑学习网 2000-2007 陕ICP备06007929号
站务联系:MSN & Email:zhangking2008@gmail.com  QQ:9365822