SMTP协议

2024-09-25

SMTP协议(精选3篇)

SMTP协议 篇1

摘要:详细介绍了在Windows下, 利用C#语言实现SMTP协议进行邮件发送、联系人管理功能的设计步骤及编程。

关键词:C#,WinSock,SMTP

1 引言

Windows Sockets规范是一套开放的、支持多种协议的Windows下的网络编程接口。目前Windows操作系统下的绝大多数网络应用都是使用的Windows Socket接口。文中在简单介绍网络编程方面的基础知识和SMTP (简单邮件传输协议) 的原理和机制的基础上, 详细地阐述了如何使用C#语言来实现一个使用SMTP协议进行电子邮件发送的实例程序。该实例系统的主要功能包括:利用SMTP协议进行电子邮件的撰写、单人和群发邮件及联系人管理更新与保存功能。

2 相关知识

套接字 (Socket) 是一种网络编程接口, 其本质是对通信端点的一种抽象, 提供了一种发送和接收数据的机制。WindowsSocket简称WinSock, 是运行在Windows平台之上的基于Socket模型的API。应用程序调用Windows Socket的API实现通信, 而WinSock则利用下层的网络通信协议功能和操作系统调用来实现真正的通信。

WinSock有两流式套接字 (StreamSockets) 和数据报套接字 (DatagramSockets) 两种形式。流式套接字提供了双向的、有序的、无重复并且记录边界的面向连接的数据流服务, 而数据报套接字尽管也支持双向的数据流, 却是无连接的, 并不保证可靠、有序和无重复。

简单邮件传输协议 (SMTP) 的目标是可靠高效地传输电子邮件, 它独立于传送子系统且仅要求一条可以保证传送数据单元的通道。SMTP的一个重要特点是它能够在传送中接力传送邮件。传送服务提供了进程间通信环境 (IPCE) , 此环境可以包括一个网络, 几个网络, 或者一个网络的子网。进程可能直接和其他进程通过已知的IPCE通信。邮件实际上就是一个进程间通信, 它可以连接在不同IPCE上的进程跨网络进行邮件传送而且邮件可以通过不同网络上的主机以接力方式传送。针对用户的邮件请求, 发送SMTP与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP请求命令由发送SMTP发出, 由接收SMTP接收, 而应答命令则反向发送。一旦传送通道建立, SMTP发送者发送MAIL命令指明邮件发送者。如果接收SMTP可以接收邮件则返回OK应答, 代号为220。发送SMTP使用RCPT TO命令向接收SMTP指明邮件接收人。如果接收SMTP接收, 则返回OK应答, 如果不能接收到, 则发出拒绝接收应答, 但不终止整个邮件操作。双方将如此多次。

3 功能分析及系统设计

3.1 系统功能及流程

由于SMTP基于面向连接的TCP协议, 因此, 需要使用流式套接字来实现本系统。

使用面向连接的流式套接字编程的时序和机理如图1所示。

如果接收方与发送方连接在同一个传送服务器下时, 邮件可以直接由发送方主机发送到接收方主机;当两者不在同一个传送服务下时, 通过中继SMTP服务器进行传送。

根据SMTP协议规范, 本系统需要实现SMTP的如下命令和操作 (如表1所示) 。

基于上述命令和操作, 利用SMTP协议进行邮件发送有如下3个步骤:

(1) MAILFROM:

此请求命令告诉SMTP接收者新的邮件发送操作已经开始, 复位所有状态和缓冲区。若请求被接收, 接收方返回250OK应答。

(2) RCTPTO:

此请求命令告诉接收SMTP, 邮件的接收者。此过程可能会重复若干次。

(3) DATA

此请求命令被接收后, 接收方返回354 Intermediate, 接收者将以下的各行内容视为信件内容。

3.2 编码实现

Winsock在常见的Windows平台上Winsock1和WinSock2两种版本。编写与WinSock1兼容的程序你需要引用头文件WINSOCK.H, 而编写使用WinSock2的程序则需要引用WINSOCK2.H。此外还有一个MSWSOCK.H头文件, 它是专门用来支持在Windows平台上高性能网络程序扩展功能的。使用WINSOCK.H头文件时, 同时需要库文件WSOCK32.LIB, 使用WINSOCK2.H时, 则需要WS2_32.LIB, 如果使用MSWSOCK.H中的扩展API, 则需要MSWSOCK.LIB。本系统是利用微软的.NET系统, 使用C#语言来实现的, 所使用的版本是Winsock2。在.NET系统中, System.Net.Sockets这个命名空间包含的类通常与较低级的网络操作有关。其中的Socket类是一个非常基础且功能强大的WinSock实现, 可以利用它实现几乎所有的TCP/IP操作, 也可以使用在Socket类基础上构造的TcpClient、TcpListenter等TCP、UDP实现。下面详细地解析整个系统的编码实现过程。

(1) 界面设计

新建“Windows窗体应用程序”类型的项目, 命名为“SMTPMail”, 在“解决方案”下拉列表中选择“创建新解决方案”, 然后单击“确定”按钮。

利用Windows窗体界面设计, 实现本系统的操作界面如图2所示。

程序界面主要控件名称和类型、属性、值如表2所示。

(2) 构建编程环境

为了编程中的方便, 首先引入如下的命名空间:

(3) “导入联系人”功能

在SMTPMail窗体打开时从文件中读入用户当前的所有联系人, 并将联系人在ListBox中进行显示。初始读入联系人功能代码如下:

(4) 联系人管理功能

为方便用户对联系人的管理, 提供用户对联系人进行删除和保存功能, 每当用户发送有件时, 若在“收件人”中的的电子邮件地址在联系人列表中不存在时, 程序将自动将其保存到“联系人列表”中。功能代码如下:

(5) 联系人选择功能

用户在发送邮件时, 若接收邮件的联系人在右面的“联系人列表”中, 用户只需点击该联系人, 就会自动添加到“收件人”TextBox中。在用户向“收件人”中添加联系人邮件地址时, 若“收件人”TextBox中存在该联系人, 程序弹出联系人已存在对话框, 对该联系人邮件地址不予添加。操作界面如图3所示。

功能代码如下:

(6) 验证用户的输入信息

用户点击“发送邮件”按钮后, 程序将开始对发送邮件所需要的用户信息进行验证。若信息不完整将不进行邮件发送, 弹出提示对话框要求用户填写缺漏的信息。验证输入信息的操作界面及其测试用例之一如图4所示。

功能代码如下:

(7) 邮件发送功能

用户在SMTPMail程序界面按提示填写完所需要信息时, 就可以点击“发送邮件”按钮进行邮件发送。发送邮件时, 首先使用TcpClient对象建立一个与SMTP的服务器连接Socket:

将建立好的TcpClient建立NetWorkStream Socket流机制, 使用Read、ReadByte, Write等方法十分方便地操作Socket进行数据发送和接收。

为简化对NetworkStream的读操作, 再创建一个StreamReader对象来进行NetWorkStream的读操作。

用户点击“发送邮件”按钮后, 程序就开始和SMTP服务器创建连接, 并使用SMTP的常用命令进行电子邮件的发送。功能代码为:

至此, SMTPMail实例程序已经设计和编码完毕, 编译并运行程序将弹出如图5所示界面。

按照界面的提示填写完所需要的信息, 点击“发送邮件”按钮, 就可完成邮件的单独发送或群发。邮件发送成功后的运行记录如图6所示。

4 结语

简单邮件传输协议SMTP是现在网络中传输电子邮件的标准。文中在介绍Socket、WinSock以及SMTP的基础上, 详细地解析了利用C#语言实现的SMTP邮件发送的实例程序, 适合初级编程人员学习和参考。

参考文献

[1]黄承安, 谢文东, 许聪.网络应用案例导航[M].北京:中国铁道出版社, 2003.

[2]黄嘉辉.网络程序设计[M].北京:科学出版社, 2004.

[3]http://www.yesky.com/80/195580.shtml.

[4]http://www.itwen.com/07prog/03vcvb/vcvb20060527/44978.html.

SMTP协议 篇2

简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一种电子邮件协议,它既具有客户端(发送方)发送邮件的功能,又具有服务器(接收方)接收邮件的功能。SMTP协议允许将电子邮件从一个计算机邮件服务器发送到另一个计算机邮件服务器,并且SMTP服务器接收本地用户发送的邮件,以便将其传输到互联网中其他邮件服务器上。

在互联网中,大多数计算机系统通过本地邮件系统服务器在本地按路径发送电子邮件。SMTP发送程序从输出邮件队列中得到邮件报文,通过多个TCP连接将邮件报文传输到目标主机的25号端口上。在发送过程中,SMTP接收程序必须能够证实本地邮件目的地址,并处理各种差错,包括传输差错以及没有足够接收空间等。

SMTP发送程序对报文的作用直到SMTP接收程序指示传输完成才结束,因此SMTP协议的作用范围仅限于SMTP发送程序和SMTP接收程序之间的对话过程。SMTP协议的主要功能是传送报文,为了保证正确传送报文,SMTP协议规定了14条命令和21种响应信息。其中,每条命令由一行文本组和四个字母的命令组成;而每一种响应信息由一个三位数据代码和简单的文字说明组成。下面介绍SMTP协议通信过程中,各阶段主要用到的命令和响应信息。

1.建立连接

邮件发送方将需要发送的邮件发送到邮件缓存中,SMTP发送程序将每隔一定时间对邮件缓存进行扫描。如果缓存有未发送的电子邮件,则使用SMTP程序端口号与目的计算机的SMTP服务器建立连接。

建立连接后,发送方将发送“220 Service ready(服务就绪)”的信息,并向SMTP服务器发送用来标识自己的HELLO命令。当接收方的SMTP程序接收到发送方所发送的信息后,则返回响应信息“250 OK(一切正常)”,以便接收发送方SMTP发送程序的身份标识。如果接收方的邮件服务器不可用,则返回响应信息“421 Service not available(服务不可用)”。

2.传输邮件

当连接建立成功后,SMTP发送程序将向SMTP接收程序发送邮件报文信息。邮件报文传送包括以下三个逻辑阶段:

 用一个EAIL命令标识出邮件报文的发送方。例如,MAIL FROM:

 用一个或者多个RCPT命令标识该邮件报文的接收方。例如,RCPT TO: <收信人电子邮箱地址>。

 用一个DATA命令标识该邮件报文的内容。

发送MAIL命令后,如果SMTP服务器已经做好接收邮件的准备,则返回响应信息“250 OK(一切正常)”。否则,返回有关无法接收邮件原因的响应信息,例如451(处理时出错)、452(存储空间不够)、500(命令无法识别)等。

RCPT命令标识邮件接收方的电子邮箱地址,多次使用该命令能够为邮件指定多个接收者,并且每个RCPT命令都会返回一个单独的响应信息。例如“550 No such user here(无此用户)”,即不存在此电子邮箱地址。RCPT命令的作用是:先检测SMTP接收服务器是否做好接收邮件的准备,然后在进行邮件传输。

3.关闭连接

SMTP协议 篇3

这种以电子邮件服务器为基础的远程存储系统采用C/S模式, 分为客户机和服务器两个层次, 客户机为用户使用的个人计算机, 只需具备互联网连接能力, 服务器无需专门配置, 利用互联网络中任何可正常通过SMTP和POP3协议访问的邮件服务器作为系统服务器。系统整体结构如图1所示, 客户端主要包括数据的上传下载、邮箱管理、数据管理、数据传输等, 服务器端由多个邮件服务器联合组成。

系统的工作过程主要分上传和下载两个过程。上传过程中, 客户端首先获得本地要上传的录文件列表, 将该列表加入到远程虚拟目录结构中, 然后对本地每个文件分割为小数据块, 并记录下其在虚拟目录结构中的对应位置。随后数据块通过SMTP线程上传至服务器, 为加快数据传输速度, 需要同时启动多个发送线程连接服务器, 最终文件就以多个邮件的形式存储在远程邮件服务器中。下载过程, 客户端软件需要搜索服务器上的邮件信息列表, 根据邮件主题或特定标志, 对照参考本地已经下载的数据块, 确定要下载的邮件, 启动多个下载线程, 获取邮件, 然后从邮件中提取出数据块。下载同时要对已下载的数据块检测, 如某个文件所有数据块均已经下载完毕, 则需要将其合并重组, 还原为文件, 存入本地目录结构中。

系统采用多线程方式工作, 由一个主线程, 多个发送线程和接受线程。主线程负责用户交互、邮箱管理、数据分割重组等;接受线程通过POP3协议与POP3服务器建立连接, 接受邮件, 提取数据块;发送线程通过SMTP协议将包含有数据块的邮件发送到指定的邮箱。

上传线程需要与SMTP服务器建立连接, 随后使用AUTH命令进行身份验证, 验证后对邮件施行MIME编码, 编码后的邮件可以发往一个可以被POP的邮箱。如此循环发送全部待上传的数据块, 如果用户终止、连接错误、上传错误或者待上传数据块没有符合本线程邮箱规则的数据块时, 本线程终止。数据块一旦以邮件形式存储在远程邮件服务器中, 就被服务器加上UID, UID是一个邮箱中每封邮件的唯一标识, 用于标记本邮箱里的不同邮件。

下载线程工作原理如下:首先客户端与POP3服务器建立POP3连接, 通过User和Pass命令认证后, 使用LIST获取邮箱内邮件数量;使用RETR和UIDL遍历所有的邮件头和UID, 根据UID和邮件头里的信息把每封邮件与数据块对应起来;随后把对文件的操作 (下载、删除等) 映射为数据块的操作, 把服务器中邮件的UID与数据块链表每个数据块UID比较, 找到对应邮件号, 根据该数据块确定当前操作是下载还是删除, 如果该UID不在数据块链表中, 则说明是新的数据块, 下载邮件头部分, 根据邮件头有系统无标志性字符串, 决定是否追加到数据块链表中。接收邮件使用POP3命令RETR接收, 删除用DELE移除服务器上的相应邮件, 同时更新数据块链表。下载线程通过主程序创建, 每个邮箱可以创建3到5个线程, 合理线程数量既能保证较快的下载速度, 又不至于占用太多的内存和CPU资源。

按照本文研究的方法设计的系统可以做到屏蔽各个邮件服务器的差异, 使用户像操作本地硬盘一样简单的对远程存储服务器上的数据文件进行管理、维护, 文件的传输可以做到透明化, 系统仅需要一个客户端就可以实现可靠的数据远程备份, 成本极低。但是系统传输速度上由于受到复杂的用户网络环境的影响, 与用高速硬件构建的远程存储系统相比还有一定差距, 但是能够满足小型部门或个人的需要。本文只是就远程存储系统的基本功能做了探讨, 对譬如数据安全、数据冗余等问题还需要进一步的丰富和改进。

摘要:随着信息化进程的推进, 通过远程存储、备份、共享数据的需求不断增长, 越来越多的用户希望远程存储系统能够价廉、易用、快捷。本文提出了一种通过SMTP和POP3协议, 以多个远程电子邮件服务器作为存储服务器的远程存储系统, 并讨论其实现的方法。按照该方法设计实现的系统将能够提供数据的远程存储备份和数据共享能力, 支持绝大多数的邮件服务器。通过数据分割重组、数据压缩、多线程传输等方式可以实现数据快速传输存储备份。

关键词:远程存储,SMTP,POP3,多线程

参考文献

[1]王月, 贾卓生.网络存储技术的研究与应用[J].计算机技术与发展, 2006 (6) :2-3.

[2]张振宇, 胡文锦.常见存储方式介绍及比较[J].产品与技术, 2006 (9) :1-2.

上一篇:泪道阻塞下一篇:项目档案管理