摘要:本文介绍了一种采用SMTP协议规范并通过直接使用SMTP协议命令而在程序中实现电子邮件传送的方法 。并在VC开发环境下给出了部分要害的实现代码 。
前言
电子邮件服务作为Internet上应用最多和最广的服务项目得到了非常广泛的应用 , 在网络应用中也起到非常重要的作用 。如同其他的网络服务 , 电子邮件系统也有其使用的传输协议 , 包括SMTP(SimpleMailTransferProtocol , 简单邮件传输协议)、POP(PostOfficeProtocol , 邮局协议)和IMAP(InternetMessageAccessProtocal , 消息访问协议)等 , 这些协议应用于电子邮件的发送和接收 。一些邮件处理软件如OutlookEXPress和FoxMail等就是按照SMTP和POP3协议结合WindowsSockets套接字进行设计来收发邮件的 。本文以SMTP协议为研究对象 , 在VisualC6.0编程环境下按照SMTP协议通过套接字发送SMTP命令 , 接收并处理邮件服务器的反馈信息 , 从而实现对电子邮件的发送 。
SMTP协议的通讯模型和会话流程
SMTP协议通讯模型
SMTP协议是TCP/IP协议族中的一员 , 主要对如何将电子邮件从发送方地址传送到接收方地址 , 也即是对传输的规则做了规定 。SMTP协议的通信模型并不复杂 , 主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求 , 由发送SMTP建立一条连接到接收SMTP的双工通讯链路 , 这里的接收SMTP是相对于发送SMTP而言的 , 实际上它既可以是最终的接收者也可以是中间传送者 。发送SMTP负责向接收SMTP发送SMTP命令 , 而接收SMTP则负责接收并反馈应答 。可大致用下面的通讯模型示意图来表示:
【VC SMTP协议电子邮件传送剖析】
SMTP协议的命令和应答
从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的 。在通讯链路建立后 , 发送SMTP发送MAIL命令指令邮件发送者 , 若接收SMTP此时可以接收邮件则作出OK的应答 , 然后发送SMTP继续发出RCPT命令以确认邮件是否收到 , 假如接收到就作出OK的应答 , 否则就发出拒绝接收应答 , 但这并不会对整个邮件操作造成影响 。双方如此反复多次 , 直至邮件处理完毕 。SMTP协议共包含10个SMTP命令 , 列表如下:
SMTP命令命令说明
HELLO<domain><CRLF>识别发送方到接收SMTP的一个HELLO命令
MAILFROM:<reverse-path><CRLF><reverse-path>为发送者地址 。此命令告诉接收方一个新邮件发送的开始 , 并对所有的状态和缓冲区进行初始化 。此命令开始一个邮件传输处理 , 最终完成将邮件数据传送到一个或多个邮箱中 。
RCPTTO:<forward-path><CRLF><forward-path>标识各个邮件接收者的地址
DATA<CRLF>
接收SMTP将把其后的行为看作邮件数据去处理 , 以<CRLF>.<CRLF>标识数据的结尾 。
REST<CRLF>退出/复位当前的邮件传输
NOOP<CRLF>要求接收SMTP仅做OK应答 。(用于测试)
QUIT<CRLF>要求接收SMTP返回一个OK应答并关闭传输 。
VRFY<string><CRLF>验证指定的邮箱是否存在 , 由于安全因素 , 服务器多禁止此命令 。
EXPN<string><CRLF>验证给定的邮箱列表是否存在 , 扩充邮箱列表 , 也常禁止使用 。
HELP<CRLF>查询服务器支持什么命令
注:<CRLF>为回车、换行 , ASCII码分别为13、10(十进制) 。
SMTP协议的每一个命令都会返回一个应答码 , 应答码的每一个数字都是有特定含义的 , 如第一位数字为2时表示命令成功;为5表失败;3表没有完成 。一些较复杂的邮件程序利用该特点 , 首先检查应答码的首数字 , 并根据其值来决定下一步的动作 。下面将SMTP的应答码列表如下:
应答码说明
501参数格式错误
502命令不可实现
503错误的命令序列
504命令参数不可实现
211系统状态或系统帮助响应
214帮助信息
220<domain>服务就绪
221<domain>服务关闭
421<domain>服务未就绪 , 关闭传输信道
250要求的邮件操作完成
251用户非本地 , 将转发向<forward-path>
450要求的邮件操作未完成 , 邮箱不可用
550要求的邮件操作未完成 , 邮箱不可用
451放弃要求的操作;处理过程中出错
551用户非本地 , 请尝试<forward-path>
452系统存储不足 , 要求的操作未执行
552过量的存储分配 , 要求的操作未执行
553邮箱名不可用 , 要求的操作未执行
354开始邮件输入 , 以"."结束
554操作失败
- 协议和合同的区别及法律效力
- 法律规定婚前协议财产独立有效吗
- 双方协议离婚要些什么证件
- 房屋补充协议怎么写才有效
- 补办协议离婚书需要什么手续
- 兼职协议和劳动合同的区别是什么
- 如何订协议
- 夫妻财产分割协议书范本怎么写
- 法院的离婚协议书丢了怎么补办
- 已经签了协议不入职可以吗
