php通过socket编程模范smtp协议
SMTP的基础
基于TCP/IP的因特网协议一般的命令格式都是通过请求/ 应答方式实现的,采用的都是文本信息,所以
处理起来要容易一些。SMTP是简单邮件传输协议的简称,它可以实现客户端向服务器发送邮件的功能。所以
下面所讲的命令是指客户端向服务器发出请求指令,而响应则是指服务器返回给客户端的信息。
SMTP分为命令头和信息体两部分。命令头主要完成客户端与服务器的连接,验证等。整个过程由多条命
令组成。每个命令发到服务器后,由服务器给出响应信息,一般为3 位数字的响应码和响应文本。不同的服
务器返回的响应码是遵守协议的,但是响应正文本则不必。每个命令及响应的最后都有一个回车符,这样使
用fputs()和fgets()就可以进行命令与响应的处理了。SMTP的命令及响应信息都是单行的。信息体则是邮件
的正文部分,最后的结束行应以单独的"."作为结束行。
客户端一些常用的SMTP指令为:
HELO hostname: 与服务器打招呼并告知客户端使用的机器名字,可以随便填写
MAIL FROM: sender_id : 告诉服务器发信人的地址
RCPT TO: receiver_id : 告诉服务器收信人的地址
DATA : 下面开始传输信件内容,且最后要以只含有.的特殊行结束
RESET: 取消刚才的指令,从新开始
VERIFY userid: 校验帐号是否存在(此指令为可选指令,服务器可能不支持)
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
NOOP 无操作,服务器应响应OK
QUIT : 退出连接,结束
RSET 重置会话,当前传输被取消
服务器返回的响应信息为(格式为:响应码+空格+解释):
220 服务就绪(在socket连接成功时,会返回此信息)
221 正在处理
250 请求邮件动作正确,完成(HELO,MAIL FROM,RCPT TO,QUIT指令执行成功会返回此信息)
354 开始发送数据,结束以 .(DATA指令执行成功会返回此信息,客户端应发送信息)
500 语法错误,命令不能识别
550 命令不能执行,邮箱无效
552 中断处理:用户超出文件空间
下面给出一个简单的命令头(这是在打开socket之后做的),是我向stmp.263.net发邮件的测试结果:
HELO limodou
250 smtp.263.net
MAIL FROM: chatme@263.net
250 Ok
RCPT TO: chatme@263.net
250 Ok
DATA
354 End data with .
To: chatme@263.net
From: chatme@263.net
Subject: test
From: chatme@263.net
test
.
QUIT
250 Ok: queued as C46411C5097E0
邮件发送函数定义如下:
<?php
function sendMail( $str_smtp, $int_port, $str_name, $str_ps, $str_aimAddress, $str_title, $str_doc, $str_cc = '' )
{
$_str_result = '';
$_arr_mailContent = array();
$_arr_ccs = '';
$_obj_socket = fsockopen( $str_smtp, $int_port, $errno, $errstr, 60 );
if( !$_obj_socket ) exit( "stmp server connect error! errNo:{$errno}; errMsg:{$errstr}" );
else $_str_result .= 'stmp connect info:'.fgets( $_obj_socket, 512 )."<br/>";
if( !empty( $str_cc ) )
$_arr_ccs = explode( ',', $str_cc );
$_arr_mailContent[] = "HELO Alone\r\n";
$_arr_mailContent[] = "AUTH LOGIN\r\n";
$_arr_mailContent[] = base64_encode( $str_name )."\r\n";
$_arr_mailContent[] = base64_encode( $str_ps )."\r\n";
$_arr_mailContent[] = "MAIL FROM:<{$str_name}>\r\n";
$_arr_mailContent[] = "RCPT TO:<{$str_aimAddress}>\r\n";
if( !empty( $_arr_ccs ) )
{
foreach ( $_arr_ccs as $_str_thisAimAddress )
{
$_str_thisAimAddress = trim( $_str_thisAimAddress );
$_arr_mailContent[] = "RCPT TO:<{$_str_thisAimAddress}>\r\n";
}//end foreach
}//if
$_arr_mailContent[] = "DATA\r\n".
"MIME-Version: 1.0\r\n".
"Content-Type: text/html\r\n".
"To: {$str_aimAddress}\r\n".
( empty( $str_cc ) ? '' : "Cc:{$str_cc}\r\n" ).
"From: {$str_name}\r\n".
"Subject: {$str_title}\r\n".
"X-Mailer:By Redhat (PHP/".phpversion().")\r\n".
"Message-ID: <".md5( time() )."{$str_aimAddress}>\r\n".
"\r\n{$str_doc}\r\n"; //MAIL CONTENT
$_arr_mailContent[] = ".\r\n";
$_arr_mailContent[] = "QUIT\r\n";
foreach ( $_arr_mailContent as $_str_mailContent )
{
fputs( $_obj_socket, $_str_mailContent );
$_str_result .= "<b>{$_str_mailContent}</b>:";
$_str_result .= fgets( $_obj_socket, 512 )."<br/>";
}//end foreach
fclose( $_obj_socket );
return $_str_result;
}//end function sendMail
// echo sendMail( 'ssl://smtp.gmail.com', 465, 'XXXXXXXXXXX', 'XXXX', 'alonedistian@gmail.com', 'testMail', '<h1>Hello MySelf</h1>', 'distian.alone@gmail.com, distian@eyou.com' );
?>
测试输出结果
<--------------------------------------
stmp connect info:220 mx.google.com ESMTP u12sm1786092tia.3
HELO Alone :250 mx.google.com at your service
AUTH LOGIN :334 VXNlcm5hbWU6
YWxvbmVkaXN0aWFu :334 UGFzc3dvcmQ6
Z20zenl5Mmwx :235 2.7.0 Accepted
MAIL FROM: :250 2.1.0 OK u12sm1786092tia.3
RCPT TO: :250 2.1.5 OK u12sm1786092tia.3
RCPT TO: :250 2.1.5 OK u12sm1786092tia.3
RCPT TO: :250 2.1.5 OK u12sm1786092tia.3
DATA MIME-Version: 1.0 Content-Type: text/html; charset="UTF-8" To: alonedistian@gmail.com Cc:distian.alone@gmail.com, distian@eyou.com From: alonedistian Subject: testMail X-Mailer:By Redhat (PHP/5.2.6) Message-ID: <4efac36563652155aee47b103e6125b5alonedistian@gmail.com>
Hello MySelf
:354 Go ahead u12sm1786092tia.3
. :250 2.0.0 OK 1225875877 u12sm1786092tia.3
QUIT :221 2.0.0 closing connection u12sm1786092tia.3
-------------------------------------------------->
分享到:
相关推荐
基于GUI界面的SMTP客户端,实现GUI界面发送电子邮件,实时反馈发送过程中有关信息
理解数据链路层的滑动窗口协议,完整实现滑动窗口协议中的1bit滑动窗口协议,通过socket实现TCP连接来进行模拟
C# 基于SMTP协议和SOCKET发送邮件及附件。 在WIN7的VS2010环境下编译测试OK。
java socket 实现SMTP协议 发送邮件.docx
文件时简单的UDP服务器程序和UDP客户端程序的例子,这两个程序都是Win32应用程序,在本地机器上的8888端口进行通信
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯...
实验一_SOCKET编程实验(计算机网络SOCKET编程实验)
计算机网络实验SMTP邮件发送系统socket编程 (2).docx计算机网络实验SMTP邮件发送系统socket编程 (2).docx计算机网络实验SMTP邮件发送系统socket编程 (2).docx计算机网络实验SMTP邮件发送系统socket编程 (2).docx...
socket编程socket编程socket编程socket编程
网络编程1Socket编程 网络编程1Socket编程 网络编程1Socket编程
Socket编程利用TCP协议的实验报告.doc
一个小型的基于IP UDP协议的socket编程程序
socket 网络编程 TCP协议 UDP协议 服务器和客户端之间的传输
socket编程、socket编程 socket编程 socket编程 socket编程
TCP socket编程,服务器和客户端传输
调研http协议、TCP协议、UDP协议及socket编程相关知识;根据课程设计要求,选择合适的操作系统、开发环境及测试环境 必需有界面窗口,客户端可以实现网址的录入,协议的选择(TCP或返回信息的显示。服务器端要有...
Socket编程面试题
socket编程 套接字编程socket编程socket编程TCP协议 TCP协议TCP协议
《Java TCP/IP Socket编程(原书第2版)》基于TCP/IP Socket相关原理,对如何在Java中进行Socket编程作了深入浅出的介绍。《Java TCP/IP Socket编程(原书第2版)》内容简明扼要,条理清晰,并在讲解相应的概念或编程...
Socket编程 Socket编程 Socket编程