`
liboxlu
  • 浏览: 64289 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

php通过socket编程模范smtp协议

阅读更多
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

-------------------------------------------------->
分享到:
评论

相关推荐

    java socket 实现SMTP协议 发送邮件.docx

    通过使用 Java Socket,可以实现 SMTP 协议来发送邮件。在这里,我们介绍了 Java Socket 的基本使用方法,并实现了一个简单的 SMTP 客户端。通过这个示例,我们可以了解 Java Socket 的使用方法,并学习如何实现 ...

    使用socket编程模拟滑动窗口协议

    本项目通过socket编程实现了1bit滑动窗口协议,这将帮助我们深入理解该协议的工作原理。 1. **滑动窗口协议基础**: - 滑动窗口协议允许发送方在等待确认之前发送一定数量的数据,这个数量由窗口大小决定。 - ...

    socket编程基础编写基于GUI界面的SMTP客户端

    基于GUI界面的SMTP客户端,实现GUI界面发送电子邮件,实时反馈发送过程中有关信息

    socket网络(UDP协议编程)

    "socket网络(UDP协议编程)"这个标题明确指出了我们要讨论的核心内容——使用套接字(socket)进行网络编程,并且聚焦在用户数据报协议(UDP)上。UDP是一种无连接的、不可靠的传输层协议,与TCP(传输控制协议)...

    Socket编程实验报告.docx

    在这个实验报告中,我们主要探讨了如何使用Java的Socket和ServerSocket类进行TCP协议的客户端和服务器端编程。 实验目标是掌握Socket编程的基本方法,理解客户端与服务器端的区别,并熟练使用Socket类与...

    Java Socket 实现SMTP邮件发送,支持SSL/TSL

    2. **SMTP协议**:SMTP规定了邮件发送的格式和步骤,包括建立连接、身份验证、提交邮件等操作。在Java中,通常需要自定义SMTP通信的逻辑,例如使用`OutputStream`发送SMTP命令,处理服务器的响应。 3. **SMTP认证**...

    基于TCP/IP的socket编程

    Socket编程允许应用程序通过网络发送和接收数据,它是互联网上不同计算机之间交互的核心机制。 在给定的描述中,我们看到一个创新的设计,即客户端和服务器功能的融合。通常情况下,网络通信分为两部分:服务器端,...

    C#raw Socket编程

    C#raw Socket编程是一种高效、可靠、强大且广泛应用的网络编程技术,广泛应用于网络封包监视、网络流量控制、网络安全监控和网络协议分析等领域。但是,需要深入了解网络协议和套接字编程,掌握C#语言和Windows ...

    利用Winsock实现SMTP协议

    【SMTP协议基础】 SMTP(Simple Mail Transfer Protocol)是...以上就是利用Winsock实现SMTP协议的基本原理和C#编程实现的关键点。通过深入理解和实践,你可以创建自己的邮件发送程序,灵活适应各种邮件发送需求。

    实验一_SOCKET编程实验

    在计算机网络领域,Socket编程是一种基本的通信方式,它允许两个应用程序通过网络进行数据交换。本实验旨在帮助学生深入理解SOCKET编程的概念、原理及其实现过程,以便于掌握网络通信的核心技术。 **1. SOCKET编程...

    用Socket编程实现电子邮件的发送

    2. **SMTP协议**:遵循标准的SMTP协议规范,确保与不同的邮件服务器兼容。 3. **错误处理**:实现异常处理机制,如超时、断开连接等情况下的重连策略。 4. **多线程管理**:优化服务器端的线程池,避免资源浪费和...

    smtp_socket_test

    总的来说,这个项目提供了实践C语言socket编程和理解SMTP协议的机会。通过编写这样一个用户代理,开发者可以深入理解网络通信的底层原理,同时提高处理实际网络问题的能力。在Linux环境中,这是一项宝贵的技能,对于...

    php_socket基础编程

    这本教程旨在帮助初学者快速入门 PHP Socket 编程,并通过实例和讲解来加深理解。 #### 标签:PHP Socket 该标签明确了本教程的主题是关于 PHP 语言中的 Socket 编程技术。 #### 部分内容知识点详解: ##### ...

    基于TCP/IP协议的Socket编程

    基于TCP/IP协议的Socket编程 TCP/IP协议是网络通信协议的基础,它规定了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据传输格式以及传送方式。TCP/IP协议的基本传输单位是数据包(datagram),TCP...

    简单的php —— socket 编程

    Socket编程允许开发者直接操作TCP/IP协议栈,实现更灵活、高效的网络应用程序,如聊天应用、游戏服务器、数据传输等。 首先,我们要理解什么是socket。在计算机网络中,socket是进程间通信的一种方式,它提供了一种...

    socket编程,停止等待协议

    在这个主题中,我们将深入探讨Socket编程与停止等待协议的相关知识。 首先,让我们了解一下Socket编程。Socket是操作系统提供的一种进程间通信(IPC,Inter-Process Communication)机制,特别适用于网络通信。在...

    网络编程1Socket编程

    Socket编程是实现网络通信的基础,是连接应用程序与网络协议的关键接口。在这个主题中,我们将深入探讨Socket编程的基本概念、工作原理以及如何在实际应用中使用它。 **Socket**,也称为套接字,是网络通信中的一个...

    总结java_socket编程.doc

    在Java中,Socket编程主要是基于TCP/IP协议的网络编程。 网络编程的两个主要问题 在网络编程中,有两个主要的问题需要解决:一是如何准确地定位网络上的一台或多台主机,二是找到主机后如何可靠高效地进行数据传输...

    socket网络编程 TCP传输协议实现

    **TCP网络编程与Socket实现** ...TCP socket练习文件可能包含了一系列的练习示例,涵盖了上述各种情况,包括基本的TCP通信、多线程/进程处理、异常处理等,通过实践这些例子,可以更深入地理解和掌握TCP Socket编程。

Global site tag (gtag.js) - Google Analytics