返回顶部

收藏

php使用smtp,pop3协议收发邮件代码

更多
<?php 
if ($EMAIL_INC) return; 
$EMAIL_INC=  "defined"; 
define( "SmtpPort",25); 

class Pop3 { 
    var $subject;                          // 邮件主题  
    var $from_email;                       // 发件人地址
    var $from_name;                        // 发件人姓名
    var $to_email;                         // 收件人地址
    var $to_name;                          // 收件人姓名
    var $body;                             // 邮件内容
    var $filename;                         // 文件名
    var $socket;                 // 当前的 socket 
    var $Line; 
    var $Status; 

    function pop3_open($server, $port)   
    { 

        $this->Socket = fsockopen($server, $port); 
        if ($this->Socket <= 0){ 
            return false; 
        } 
    $this->Line = fgets($this->Socket, 1024); 
    $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
    $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

    if ($this->Status[ "LASTRESULT"] <>  "+") return false; 
    return true; 
    } 

    function pop3_user($user) 
    { 

        if ($this->Socket < 0){ 
          return false; 
        } 
        fputs($this->Socket,  "USER $this->user\r\n"); 
        $this->Line = fgets($this->Socket, 1024); 
        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "+") return false; 

        return true; 
    } 

    function pop3_pass( $pass) 
    { 

        fputs($this->Socket,  "PASS $pass\r\n"); 
        $this->Line = fgets($this->Socket, 1024); 
        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "+") return 0; 

        return 1; 
    } 

    function pop3_stat() 
    { 

        fputs($this->Socket,  "STAT\r\n"); 
        $this->Line = fgets($this->Socket, 1024); 
        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "+") return 0; 

        if (!eregi( "+OK (.*) (.*)", $this->Line, $regs))  
            return 0; 

        return $regs[1]; 
    } 

    function pop3_list() 
    { 
        fputs($this->Socket,  "LIST\r\n"); 
        $this->Line = fgets($this->Socket, 1024); 
        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "+") return 0; 

        $i = 0; 
        while  (substr($this->Line  =  fgets($this->Socket, 1024),  0,  1)  <>   ".") 
        { 
            $articles[$i] = $this->Line; 
            $i++; 
        } 
        $articles[ "count"] = $i; 

        return $articles; 
    } 

    function pop3_retr($nr) 
    { 

        fputs($this->Socket,  "RETR $nr\r\n"); 
        $this->Line = fgets($this->Socket, 1024); 
        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "+") return 0; 

        while  (substr($this->Line  =  fgets($this->Socket, 1024),  0,  1)  <>   ".") 
        { 
            $data[$i] = $this->Line; 
            $i++; 
        } 
        $data[ "count"] = $i; 

        return $data; 
    } 

    function pop3_dele( $nr) 
    { 

        fputs($this->Socket,  "DELE $nr\r\n"); 
        $this->Line = fgets($this->Socket, 1024); 
        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "+") return 0; 
        return 1; 
    } 

    function pop3_quit() 
    { 

        fputs($this->Socket,  "QUIT\r\n"); 
        $this->Line = fgets($this->Socket, 1024); 
        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "+") return 0; 

        return 1; 
    } 
} 

class Smtp { 

    var $Subject;              // string the email's subject  
    var $FromName;                 // string sender's name (opt)  
    var $ToName;                   // string recipient's name (opt)  
    var $Body;                     // string body copy  
    var $Attachment;         // attachment (optional) 
    var $AttachmentType; 
    var $Socket; 
    var $Line; 
    var $Status; 

    function Smtp($Server =  "localhost",$Port = SmtpPort) 
    {     
        return $this->Open($Server, $Port); 
    } 

    function SmtpMail($FromEmail, $FromName, $ToEmail, $ToName, $Subject, $Body, $Attachment=null, $AttachmentType= "TEXT") 
    { 
        $this->Subject   = $Subject; 
        $this->ToName    = $ToName; 

        $this->FromName    = $FromName; 
        $this->Body      = $Body; 

        $this->Attachment = $Attachment; 
        $this->AttachmentType = $AttachmentType; 

        if ($this->Helo() == false){ 
            return false; 
        } 
        if ($this->MailFrom($FromEmail) == false){ 
            return false; 
        } 
        if ($this->RcptTo($ToEmail) == false){ 
            return false; 
        } 
        if ($this->Body() == false){ 
            return false; 
        } 
        if ($this->Quit() == false){ 
            return false; 
        } 
    } 

    function Open($Server, $Port) 
    { 

     $this->Socket = fsockopen($Server, $Port); 
     if ($this->Socket < 0) return false; 

     $this->Line = fgets($this->Socket, 1024); 

     $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
     $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

     if ($this->Status[ "LASTRESULT"] <>  "2") return false; 

     return true; 
    } 

    function Helo() 
    { 
        if (fputs($this->Socket,  "helo\r\n") < 0 ){ 
            return false; 
        } 
        $this->Line = fgets($this->Socket, 1024); 

        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "2") return false; 

        return true;   
    } 

    function Ehlo() 
    { 

         /* Well, let's use "helo" for now.. Until we need the 
        extra func's   [Unk] 
        */ 
        if(fputs($this->Socket,  "helo localhost\r\n")<0){ 
            return false; 
        } 
        $this->Line = fgets($this->Socket, 1024); 

        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "2") return false; 

        return true; 
    } 

    function MailFrom($FromEmail) 
    { 

        if (fputs($this->Socket,  "MAIL FROM: <$FromEmail>\r\n")<0){ 
            return false; 
        } 

        $this->Line = fgets($this->Socket, 1024); 

        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "2") return false; 

        return true; 
    } 

    function RcptTo($ToEmail) 
    { 

        if(fputs($this->Socket,  "RCPT TO: <$ToEmail>\r\n")<0){ 
            return false; 
        } 
        $this->Line = fgets($this->Socket, 1024); 

        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "2") return false; 
            return true; 
    } 

    function Body() 
    { 
        $FileSize = 0; 
        $Attachment = null; 
        $fp = null; 

        $buffer = sprintf( "From: %s\r\nTo:%s\r\nSubject:%s\r\n", $this->FromName, $this->ToName, $this->Subject); 

        if(fputs($this->Socket,  "DATA\r\n")<0){ 
            return false; 
        } 
        $this->Line = fgets($this->Socket, 1024); 

        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "3") return false; 

        if(fputs($this->Socket, $buffer)<0){ 
            return false; 
        } 

        if ($this->Attachment == null){ 

            if(fputs($this->Socket,  "MIME-Version: 1.0\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Transfer-Encoding: 7bit\r\n\r\n")<0){ 
                return false; 
            } 
            if(fputs($this->Socket,  "$this->Body\r\n\r\n")<0){ 
                return false; 
            } 

            if(fputs($this->Socket,  ".\r\n")<0){ 
                return false; 
            } 

            $this->Line = fgets($this->Socket, 1024); 
            if (substr($this->Line, 0, 1) <>  "2"){ 
                return false;  
            }else{ 
                return true; 
            } 
        }else{ 
            if(fputs($this->Socket, "MIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"----=_NextPart_000_01BCFA61.A3697360\"\r\n". 
                 "Content-Transfer-Encoding: 7bit\r\n\r\n". 
                 "This is a multi-part message in MIME format.\r\n". 
                 "\r\n------=_NextPart_000_01BCFA61.A3697360\r\n". 
                 "Content-Type: text/plain; charset=ISO-8859-1\r\n". 
                 "Content-Transfer-Encoding: 7bit\r\n". 
                 "\r\n")<0){ 
                return false; 
            } 

             /* 输出邮件内容 */ 
            if(fputs($this->Socket,  "$this->Body\r\n\r\n")<0){ 
                return false; 
            } 

            if ( fputs($this->Socket, "\r\n------=_NextPart_000_01BCFA61.A3697360\r\n")<0){ 
                return false; 
            } 
            $FileSize = filesize($this->Attachment); 
            if ($FileSize == false){ 
                return false; 
            } 
            if (($fp = fopen($this->Attachment, "r"))== false) { 
                return false; 
            }else{ 
                $Attachment = fread($fp,$FileSize);     
            } 

             // 如果没有附件的目录 
            if (($AttachName = strrchr($this->Attachment, '/')) == false){ 

                $AttachName = $this->Attachment; 
            } 

            if( fputs($this->Socket, 
                 "Content-Type: application/octet-stream; \r\nname=\"$AttachName\"\r\n". 
                 "Content-Transfer-Encoding: quoted-printable\r\n". 
                 "Content-Description: $AttachName\r\n". 
                 "Content-Disposition: attachment; \r\n\tfilename=\"$AttachName\"\r\n". 
                 "\r\n")<0){ 
                return false; 
            } 

             /* 输出附件*/ 
            if( fputs($this->Socket, $Attachment)<0){ 
                return false; 
            } 
            if ( fputs($this->Socket, "\r\n\r\n------=_NextPart_000_01BCFA61.A3697360--\r\n")<0){ 
                return false; 
            } 

            if( fputs($this->Socket, ".\r\n")<0){ 
                return false; 
            } 

            $this->Line = fgets($this->Socket, 1024); 
            if (substr($this->Line, 0, 1) <>  "2") 
                return false;  

            return true; 

        } 
    } 

    function Quit() 
    { 

        if(fputs($this->Socket,  "QUIT\r\n")<0){ 
            return false; 
        } 
        $this->Line = fgets($this->Socket, 1024); 

        $this->Status[ "LASTRESULT"] = substr($this->Line, 0, 1); 
        $this->Status[ "LASTRESULTTXT"] = substr($this->Line, 0, 1024); 

        if ($this->Status[ "LASTRESULT"] <>  "2") return 0; 

        return 1; 
    }  
    function Close() 
    { 
        fclose($this->Socket); 
    } 
} 
/* 

怎样使用这个程序的一个示例 

$MailTo = new Smtp(); 
$MailTo->SmtpMail("Dave@micro-automation.net","Dave Cramer", 
           "Dave@micro-automation.net","David", 
           "Test Mail",$MailMessage,"service.tab",0); 
$MailTo->Close(); 
$MailTo=null; 

*/ 
/* 
 $pop3 = pop3_open("localhost", "110"); 
 if (!$pop3) { 
                printf("[ERROR] Failed to connect to localhost<BR>\n"); 
                return 0; 
 } 

 if (!pop3_user($pop3, "unk")) { 
                printf("[ERROR] Username failed!<BR>\n"); 
                return 0; 
 } 

 if (!pop3_pass($pop3, "secret")) { 
                printf("[ERROR] PASS failed!<BR>\n"); 
                return 0; 
 } 

 $articles = pop3_list($pop3); 
 if (!$articles) { 
                printf("[ERROR] LIST failed!<BR>\n"); 
                return 0; 
 } 

 for ($i = 1; $i < $articles ["count"] + 1; $i++) 
 { 
                printf("i=$i<BR>\n"); 
                $data = pop3_retr($pop3,$i); 
                if (!$data) { 
                                printf("data goes wrong on '$i'<BR>\n"); 
                                return 0; 
                } 

                for ($j = 0; $j < $data["count"]; $j++) 
                { 
                                printf("$data[$j]<BR>\n"); 
                } 
 } 
*/ 
?> 

标签:php,Email,POP3,SMTP

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. 博主 发表 2016-12-23 15:27:15 邮件协议SMTP|POP3|IMAP详解
  2. 博主 发表 2018-08-02 14:08:14 邮件协议SMTP|POP3|IMAP详解
  3. 博主 发表 2017-02-07 08:25:54 理解邮件服务流程——SMTP、IMAP、POP3协议
  4. 博主 发表 2018-04-17 23:18:00 rails - 发送邮件的几点注意 ( using smtp sending email)
  5. ning 发表 2015-06-28 11:07:59 阿里云邮企业邮箱的POP3、SMTP、IMAP设置
  6. 博主 发表 2017-04-03 00:00:00 POP3/IMAP/SMTP 常用命令总结
  7. Christopher Pitt 发表 2016-04-22 16:00:00 What is SparkPost?
  8. lixiphp 发表 2013-10-06 08:45:34 PHPMailer中配置SMTP注意事项
  9. Joy Chao 发表 2012-10-13 05:03:12 简单的PHP邮件发送类
  10. Kinval 发表 2012-08-11 08:05:46 PHP发送邮件SMTP Error: Could not connect to SMTP host.
  11. Li Xi 发表 2014-07-14 13:52:09 使用 PHP mailgun 发送邮件
  12. Christopher Pitt 发表 2016-04-22 16:00:00 What is SparkPost?