、实现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=, $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*).".".$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, );
    }
}
、实现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=){
        $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')>= ){
                //向服务器发送请求邮箱信息
                $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[];
                $mail_len = $m[];
                         
                //向服务器发送邮件i信息的请求
                $this->content = '';
                for( $i=; $i<=$mail_num; $i++ ){
                    // 查看该邮件的信息
                    $this->_w("LIST {$i}\r\n");
                    usleep();// 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[].')\'s content(length='.$m[].'byte):'."\n";
                    $data = '';
                    while( strlen($data)<$m[] ){
                        $msg .= '. ';
                        $data .= socket_read($this->socket, );
                    }
                    $this->content .= $data;
                    $msg.= "\nDCC: mail(id=".$m[].')\'s content(length='.$m[].'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=){
        return socket_read($this->socket, $len);
    }
}
、界面——代码就不贴出来了,看基本调用方法:
// 调用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[]);
            $tmp_s = $subject[]=='gbk'||$subject[]=='gb2312'? iconv('gbk', 'utf-8', $tmp_s) : $tmp_s;
        }
        // 英文标题
        else if( preg_match('/Subject: (.*?)\r\n/i', $v, $subject) ){
            $tmp_s = $subject[];
        }
        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[].'|#DCC_LIST_INNER#|'
            .$date[].'|#DCC_MAIL_LIST_SEP#|';
    }
    $ret .= '|#DCC_POP3_DATA_SEP#|'.$mail_list;
}
echo $ret;
die();

PHP+socket+SMTP、POP3协议发送、接收邮件的更多相关文章

  1. 网络编程--使用TCP协议发送接收数据

    package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...

  2. outlook 2016 for windows 每次刷新发送接收邮件会弹出登陆界面

    Q: outlook2016 for windows 每次刷新发送接收邮件会弹出登陆界面,office365 ProPlus 都是正常激活了,Word 和Excel都不存在此类问题 A: 排除用户的o ...

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

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

  4. SMTP协议及POP3协议-邮件发送和接收原理(转)

    本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...

  5. 邮件实现详解(二)------手工体验smtp和pop3协议

    上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍.我们知道电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行传递必须 ...

  6. SMTP协议解读以及如何使用SMTP协议发送电子邮件

    电子邮件协议中POP3协议用于接收邮件,SMTP协议用于发送邮件.SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议,字如其名.   相较于POP3而言 ...

  7. 使用python发送和接收邮件

    关于电子邮件 大学之前,基本不用邮箱,所以基本感觉不到它的存在,也不知道有什么用:然而大学之后,随着认识的人越来越多,知识越来越广泛,邮箱已然成为很重要的通讯工具,大学一些课程作业需要有邮箱发给老师, ...

  8. Java发送QQ邮件

    面试的时候被问到这个问题,别人问我用Java发过邮件没有,被问得一脸懵逼.然后就研究了一下,不是很难,按照网上的方法折腾了几天就搞出来了. 首先,使用QQ邮箱发送邮件之前需要在邮箱里面配置,开启pop ...

  9. 通过Java发送邮件和接收邮件的工具类

    一.第一种 使用SMTP协议发送电子邮件 第一步:加入mail.jar包 (1)简单类型 package com.souvc.mail; import java.util.Date; import j ...

随机推荐

  1. 三大框架ssh

    一.hibernate a.实体类+映射 b.lib  hibernate包+oracle包(oracle安装里找) 映射:从类入手class+属性 a.映射的头文件在:hibernate3.jar- ...

  2. Java并发编程笔记—基础知识—实用案例

    如何正确停止一个线程 1)共享变量的使用 中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务.线程必须周期性的核查这一变量(尤其在 ...

  3. POJ 1837 Balance

    Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9240 Accepted: 5670 Description G ...

  4. 0day漏洞是什么意思啊?

    在报纸上看到xx又爆出0day漏洞是什么意思? day漏洞,是已经发现但是官方还没发布补丁的漏洞. 信息安全意义上的0Day是指在安全补丁发布前而被了解和掌握的漏洞信息. http://baike.b ...

  5. [Effective JavaScript 笔记]第34条:在原型中存储方法

    js中完全有可能不借助原型进行编程.不用在其原型中定义任何的方法. 创建对象 构造函数法 所有属性和方法都在构造函数中定义 function User(name,pwd){ this.name=nam ...

  6. postgresql 函数demo

    create or replace function refresh_product_usage() returns void as $$ declare rec record; sub_rec re ...

  7. BZOJ 1455

    STL的基本用法 (居然能空间卡过去= =!!!) #include <cstdio> #include <ext/pb_ds/priority_queue.hpp> #inc ...

  8. Binary Tree Right Side View

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  9. Cocos2d 初学基本知识

    1. 纹理(Texture) 游戏角色的图像文件在使用前必须解压缩,并转换成 iPhone 和 iPad 的 GPU 可以理解的 格式,同时要加载进 RAM(随机存储器),这样的图像称为纹理.GPU ...

  10. 转关于垂直切分Vertical Sharding的粒度

    垂直切分的粒度指的是在做垂直切分时允许几级的关联表放在一个shard里.这个问题对应用程序和sharding实现有着很大的影响. 关联打断地越多,则受影响的join操作越多,应用程序为此做出的妥协就越 ...