1、实现SMTP协议的类dsmtp.cls.php:

<?php
          
// 通过socket实现SMTP协议的功能
// version: 1.1
// author : DCC
// create : 2014-01-17 23:38:24
// modify : 2014-01-18 16:59:04
// more   : http://www.thinkful.cn/archives/389.html
          
class Dmail_smtp{
              
    var $socket;
    var $host;
    var $user;
    var $pwd;
    var $port;
    var $nickname;
    var $weburl;
              
    // 初始化
    function__construct($host, $user, $pwd, $port=25, $webname='大超超在思考', $weburl="www.thinkful.cn"){
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        $this->host = $host;
        $this->user = $user;
        $this->pwd  = $pwd;
        $this->port = $port;
        $this->nickname = $webname;
        $this->weburl = $weburl;
    }
              
    // 发邮件
    function smtp($to, $from, $subject, $body){
        $conn = socket_connect($this->socket, $this->host, $this->port);
        if( $conn ){
            // 接收连接成功的消息
            $msg  = "succeed connect to ".$this->host.":".$this->port."\n";
            $msg .= $this->_r();
            // 开始认证过程
            $this->_w("HELO ".$this->weburl."\r\n");
            $msg .= $this->_r();
            $this->_w("AUTH LOGIN ".base64_encode($this->user)."\r\n");
            $msg .= $this->_r();
            $this->_w(base64_encode($this->pwd)."\r\n");
            $msg .= $this->_r();
                      
            // 认证成功
            if( stripos($msg, '235 Authentication successful')!==FALSE ){
                $this->_w("MAIL FROM:<{$from}>\r\n");
                $msg .= $this->_r();
                          
                $this->_w("RCPT TO:<{$to}>\r\n");
                $msg .= $this->_r();
                          
                $this->_w("DATA\r\n");
                $msg .= $this->_r();
                          
                // 发送头和正文
                $data = $this->_genHeader($to, $from, $subject)
                    ."\r\n".$this->_genBody($body);
                $this->_w($data);
                          
                $this->_w("\r\n.\r\n");
                $msg .= $this->_r();
                          
                $this->_w("QUIT\r\n");
                $msg .= $this->_r();
            }
        }
        return $msg;
    }
              
    // 生成头部
    private function _genHeader($to, $from, $subject){
        $header  = "MIME-Version:1.0\r\n";
        $header .= "Content-Type: text/plain; charset=\"utf-8\"\r\n";
        $header .= "Subject: =?utf-8?B?".base64_encode($subject)."?=\r\n";
        $header .= "From: ".$this->nickname." <".$from.">\r\n";
        $header .= "To: ".$to."\r\n";
        $header .= "Date: ".date("r")."\r\n";
        list($msec, $sec) = explode(" ", microtime());
        $header .= "Message-ID: <DCC_".date("YmdHis").".".($msec*1000000).".".$from.">\r\n";
        return $header;
    }
              
    // 生成正文
    private function _genBody($body){
        $body = preg_replace("/(^|(\r\n))(\.)/", "\1.\3", $body);
        return $body;
    }
              
    // @发送控制流
    // var: 控制代码
    private function _w($s){
        socket_write($this->socket, $s);
    }
    // @读取返回的数据
    private function _r(){
        return socket_read($this->socket, 1024);
    }
}

2、实现POP3协议的类dpop3.cls.php:

<?php
         
// 通过socket实现pop3协议的功能
// version: 1.2
// author : DCC
// create : 2014-01-18 11:26:53
// modify : 2014-01-18 22:57:26
// more   : http://www.thinkful.cn/archives/389.html
         
class Dmail_pop3{
             
    var $socket;
    var $host;
    var $user;
    var $pwd;
    var $port;
    var $content;
             
    // 初始化
    function __construct($host, $user, $pwd, $port=110){
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        $this->host = $host;
        $this->user = $user;
        $this->pwd  = $pwd;
        $this->port = $port;
    }
             
    // 收邮件
    function pop3(){
        $conn = socket_connect($this->socket, $this->host, $this->port);
        if( $conn ){
            // 接收连接成功的消息
            $msg  = "DCC: succeed connect to ".$this->host.":".$this->port."\n";
            $msg .= $this->_r();
            // 开始认证过程
            $this->_w("USER ".$this->user."\r\n");
            $msg .= $this->_r();
            $this->_w("PASS ".$this->pwd."\r\n");
            $msg .= $this->_r();
                     
            // 认证成功
            if( substr_count($msg, '+OK')>=3 ){
                //向服务器发送请求邮箱信息
                $this->_w("STAT\r\n");
                $mail_info = $this->_r();
                $msg .= $mail_info;
                preg_match('/\+OK\s(\d+)\s(\d+)/', $mail_info, $m);
                $mail_num = $m[1];
                $mail_len = $m[2];
                         
                //向服务器发送邮件i信息的请求
                $this->content = '';
                for( $i=1; $i<=$mail_num; $i++ ){
                    // 查看该邮件的信息
                    $this->_w("LIST {$i}\r\n");
                    usleep(160000);// waiting 0.16s
                    $mail_info = $this->_r();
                    $msg .= $mail_info;
                    preg_match('/\+OK\s(\d+)\s(\d+)/', $mail_info, $m);
                    //接收服务器返回的信息
                    $this->_w("RETR {$i}\r\n");
                    $msg.= 'DCC: reading mail(id='.$m[1].')\'s content(length='.$m[2].'byte):'."\n";
                    $data = '';
                    while( strlen($data)<$m[2] ){
                        $msg .= '. ';
                        $data .= socket_read($this->socket, 4096);
                    }
                    $this->content .= $data;
                    $msg.= "\nDCC: mail(id=".$m[1].')\'s content(length='.$m[2].'byte) read complete.'."\n";
                }
                         
            }
        }
        return $msg;
    }
             
    // 返回收取邮件内容
    function getContent(){
        return $this->content;
    }
             
    // @发送控制流
    // var: 控制代码
    private function _w($s){
        socket_write($this->socket, $s);
    }
    // @读取返回的数据
    // var: 数据长度
    private function _r($len=1024){
        return socket_read($this->socket, $len);
    }
}

3、界面——代码就不贴出来了,看基本调用方法:

// 调用SMTP时
require_once 'dsmtp.cls.php';
$host = "smtp.qq.com";
// 使用QQ邮箱和密码
$user = '*******@qq.com';
$pwd  = '*******';
$dmail = new Dmail_smtp($host, $user, $pwd);
$msg = $dmail->smtp($to, $from, $subject, $body);
       
       
// ********************************
// ********************************
// 调用POP3时(后续处理复杂一点)
require_once 'dpop3.cls.php';
$host = "pop.qq.com";
$dmail = new Dmail_pop3($host, $user, $pwd);
$msg = $dmail->pop3();
$ret = $msg;
        
if( strpos($msg, 'read complete')!==FALSE ){
    $ct = $dmail->getContent();
    $mail_list_arr = explode('X-QQ-SSF: ', $ct);
    array_shift($mail_list_arr);// 去除第一个
    $mail_list_arr = array_reverse($mail_list_arr);
    foreach( $mail_list_arr as $v ){
        // 中文标题的处理
        if( preg_match('/Subject: =\?([^?]+)\?B\?([^?]+)\?=/i', $v, $subject) ){
            $tmp_s = base64_decode($subject[2]);
            $tmp_s = $subject[1]=='gbk'||$subject[1]=='gb2312'? iconv('gbk', 'utf-8', $tmp_s) : $tmp_s;
        }
        // 英文标题
        else if( preg_match('/Subject: (.*?)\r\n/i', $v, $subject) ){
            $tmp_s = $subject[1];
        }
        else{
            $tmp_s = '邮件标题';
        }
        preg_match('/From: [^<]+<(.*?)>/i', $v, $from);
        preg_match('/Date: (.*?)\r\n/i', $v, $date);
                
        $mail_list .= $tmp_s.'|#DCC_LIST_INNER#|'
            .$from[1].'|#DCC_LIST_INNER#|'
            .$date[1].'|#DCC_MAIL_LIST_SEP#|';
    }
    $ret .= '|#DCC_POP3_DATA_SEP#|'.$mail_list;
}
echo $ret;
die();

转载于:https://www.cnblogs.com/qhorse/p/4594683.html

PHP+socket+SMTP、POP3协议发送、接收邮件相关推荐

  1. python编写赛车_python udp 协议发送接收秒速赛车平台搭建数据

    python udp 协议发送接收秒速赛车平台搭建数据 Socket socket 简称套接字, 秒速赛车平台搭建 [企鹅 217-1793-408] 是进程间通信的一种方式. 与其他的方式的进程间的 ...

  2. PHP使用POP3协议类收取邮件

    POP3协议类收取邮件 此测试代码需要到服务器邮箱开通pop协议,获取客户端授权密码(详见163内部获取): <?php//此处查看链接状态header("Content-type:t ...

  3. python3:利用SMTP协议发送QQ邮件+附件

    转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...

  4. SMTP/POP3协议

    SMTP发件,pop3收件 SMTP工作原理 一.电子邮件从客户机传输到服务器:二从某一个服务器传输到另一个服务器.SMTP也是个请求/相应协议,命令和相应都是基于ASCII文本,并以CR和LF符结束 ...

  5. cmd 发送接收邮件

    接收邮件: 1:访问 输入 " telnet pop3.sina.com 110 " 若可以访问则会出现这个消息: +OK pop3 proxy server ready 输入: ...

  6. 扫描发送显示检查服务器,扫描仪通过SMTP中继服务器发送通知邮件失败(示例代码)...

    现象描述: 前2天有客户给我打电话说有1个办公地点的扫描仪扫描的文件多的话,收件人是无法收到通知邮件的,扫描仪上未显示任何错误:如果扫描的数量比较少如几张的话收件人就可以正常收到扫描通知邮件(客户的环 ...

  7. 计网实验c/c++ 电子邮件客户端程序实现发送接收邮件

    参照教材 6.5 节原理,设计一个电子邮件客户端程序. 可实现发送与接受. 如果发送邮件出去接受不到请把代码中的输出注释取消,运行确定错误地点 不懂的评论问 base64在线转码: https://b ...

  8. C++中的Socket编程使用协议发送图片

    使用: (1)首先运行服务端,待服务端运行起来: (2)最后运行客户端,输入要传输文件到哪个目标机器的IP地址: (3)输入传输文件的路径及文件(完成的路径),其中包含文件的类型,也就是后缀需要包含( ...

  9. html消息发送接收,在html页面中 如何应用mqtt协议发送/接收消息

    经过前面几篇文章的介绍,在很多场景下利用NodeMCU加持mqtt协议来控制几乎所有需要传感器监控的行业都能极大地简化物联的成本.在这样一个基础上,还能拓展出很多好玩的.实际运用的甚至能够作为商业化运 ...

最新文章

  1. HDU 2955 Robberies
  2. Linux Shell常用技巧(目录)
  3. python多边形裁剪
  4. RIS镜像中添加网卡和RAID卡驱动方法及实践经验总结
  5. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
  6. tomcat(17)启动tomcat
  7. ajax post 传参数加引号和不加引号的区别
  8. STM32烧录HEX、BIN文件,使用ST-LINK
  9. 开源正在蚕食 500 亿美元的数据库行业!
  10. python监听键盘输入 linux_Linux下使用Python捕获键盘输入
  11. ping端口的方法 - win下
  12. CAD等分不显示等分点
  13. win10 电脑蓝牙无法使用无法连接问题的一种神奇解决办法
  14. 【RocketMQ】从零搭建一套RocketMQ监控(rocketmq-exporter + Prometheus + Grafana)
  15. 鸿蒙 OS 的到来,能为我们改变什么?
  16. Vue3 优雅的模态框封装方案
  17. Mac苹果系列的安全基线(包括主机和操作系统等)+checklist
  18. 当科学家决定搞点“花里胡哨”的东西
  19. 【socket】从计算机网络基础到socket编程——Windows Linux C语言 + Python实现(TCP+UDP)
  20. Object.keys(obj)与Object.values(obj)的用法

热门文章

  1. yolov3(三:算法框架解析)
  2. awk命令中执行多条shell命令
  3. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入
  4. C++/C++11中std::priority_queue的使用
  5. linux驱动:音频驱动(二)ASoc
  6. java微信菜单获取openid_微信二次开发点击菜单openId的获取
  7. java分代技术_JVM调优总结(六):分代垃圾回收详述2
  8. 艺考可以报考清华的计算机系吗,考中传的人太多?艺考生或许可以考虑一下清华、浙大...
  9. 傻瓜式动画制作软件_一个傻瓜版的动画制作软件——万彩动画大师
  10. Java项目:控制台商城系统(java+打印控制台)