PHPメール送信クラス、添付ファイルを追加

24054 ワード

純粋なテキストメールとHTML形式のメールを送信することをサポートし、マルチ受信者、マルチコピー、マルチ秘密コピー、添付ファイル付きメールを送信することができます.
setServer("XXXXX", "XXXXX@XXXXX", "XXXXX");   smtp   
* $mail->setFrom("XXXXX");      
* $mail->setReceiver("XXXXX");      ,     ,    
* $mail->setCc("XXXX");     ,    ,    
* $mail->setBcc("XXXXX");       ,      ,    
* $mail->setMailInfo("test", "test");       、  
* $mail->sendMail();   
*/
class MySendMail {
    /**
    * @var string          
    * @access private
    */
    private $_userName;
 
    /**
    * @var string         
    * @access private
    */
    private $_password;
 
    /**
    * @var string            
    * @access protected
    */
    protected $_sendServer;
 
    /**
    * @var int            
    * @access protected
    */
    protected $_port=25;
 
    /**
    * @var string    
    * @access protected
    */
    protected $_from;
 
    /**
    * @var string    
    * @access protected
    */
    protected $_to;
 
    /**
    * @var string   
    * @access protected
    */
    protected $_cc;
 
    /**
    * @var string     
    * @access protected
    */
    protected $_bcc;
 
    /**
    * @var string   
    * @access protected
    */
    protected $_subject;
 
    /**
    * @var string     
    * @access protected
    */
    protected $_body;
 
    /**
    * @var string   
    * @access protected
    */
    protected $_attachment;
 
    /**
    * @var reource socket  
    * @access protected
    */
    protected $_socket;
 
    /**
    * @var string     
    * @access protected
    */
    protected $_errorMessage;
 
 
    /**
    *         ,                ,             
    * @access public
    * @param string $server       ip    
    * @param string $username     
    * @param string $password     
    * @param int $port         ,smtp  25   
    * @return boolean
    */
    public function setServer($server, $username="", $password="", $port=25) {
        $this->_sendServer = $server;
        $this->_port = $port;
        if(!empty($username)) {
            $this->_userName = base64_encode($username);
        }
        if(!empty($password)) {
            $this->_password = base64_encode($password);
        }
        return true;
    }
 
    /**
    *      
    * @access public
    * @param string $from      
    * @return boolean
    */
    public function setFrom($from) {
        $this->_from = $from;
        return true;
    }
 
    /**
    *      ,     ,      .
    * @access public
    * @param string $to      
    * @return boolean
    */
    public function setReceiver($to) {
        if(isset($this->_to)) {
            if(is_string($this->_to)) {
                $this->_to = array($this->_to);
                $this->_to[] = $to;
                return true;
            }
            elseif(is_array($this->_to)) {
                $this->_to[] = $to;
                return true;
            }
            else {
                return false;
            }
        }
        else {
            $this->_to = $to;
            return true;
        }
    }
 
    /**
    *     ,    ,      .
    * @access public
    * @param string $cc     
    * @return boolean
    */
    public function setCc($cc) {
        if(isset($this->_cc)) {
            if(is_string($this->_cc)) {
                $this->_cc = array($this->_cc);
                $this->_cc[] = $cc;
                return true;
            }
            elseif(is_array($this->_cc)) {
                $this->_cc[] = $cc;
                return true;
            }
            else {
                return false;
            }
        }
        else {
            $this->_cc = $cc;
            return true;
        }
    }
 
    /**
    *       ,      ,      
    * @access public
    * @param string $bcc       
    * @return boolean
    */
    public function setBcc($bcc) {
        if(isset($this->_bcc)) {
            if(is_string($this->_bcc)) {
                $this->_bcc = array($this->_bcc);
                $this->_bcc[] = $bcc;
                return true;
            }
            elseif(is_array($this->_bcc)) {
                $this->_bcc[] = $bcc;
                return true;
            }
            else {
                return false;
            }
        }
        else {
            $this->_bcc = $bcc;
            return true;
        }
    }
 
    /**
    *       
    * @access public
    * @param string $body     
    * @param string $subject       ,      ,    HTML  
    * @param string $attachment   ,    
    * @return boolean
    */
    public function setMailInfo($subject, $body, $attachment="") {
        $this->_subject = $subject;
        $this->_body = base64_encode($body);
        if(!empty($attachment)) {
            $this->_attachment = $attachment;
        }
        return true;
    }
 
    /**
    *     
    * @access public
    * @return boolean
    */
    public function sendMail() {
        $command = $this->getCommand();
        $this->socket();
         
        foreach ($command as $value) {
            if($this->sendCommand($value[0], $value[1])) {
                continue;
            }
            else{
                return false;
            }
        }
         
        //          ,smtp  :QUIT    ,         ,   socket       
        $this->close(); 
        echo 'Mail OK!';
        return true;
    }
 
    /**
    *       
    * @return string
    */
    public function error(){
        if(!isset($this->_errorMessage)) {
            $this->_errorMessage = "";
        }
        return $this->_errorMessage;
    }
 
    /**
    *   mail  
    * @access protected
    * @return array
    */
    protected function getCommand() {
        $command = array(
                array("HELO sendmail\r
", 250) ); if(!empty($this->_userName)){ $command[] = array("AUTH LOGIN\r
", 334); $command[] = array($this->_userName . "\r
", 334); $command[] = array($this->_password . "\r
", 235); } $command[] = array("MAIL FROM:_from . ">\r
", 250); $separator = "----=_Part_" . md5($this->_from . time()) . uniqid(); // // $header = "FROM: test_from . ">\r
"; // if(is_array($this->_to)) { $count = count($this->_to); for($i=0; $i_to[$i] . ">\r
", 250); if($i == 0){ $header .= "TO: _to[$i] .">"; } elseif($i + 1 == $count){ $header .= ",_to[$i] .">\r
"; } else{ $header .= ",_to[$i] .">"; } } } else{ $command[] = array("RCPT TO: _to . ">\r
", 250); $header .= "TO: _to . ">\r
"; } // if(isset($this->_cc)) { if(is_array($this->_cc)) { $count = count($this->_cc); for($i=0; $i_cc[$i] . ">\r
", 250); if($i == 0){ $header .= "CC: _cc[$i] .">"; } elseif($i + 1 == $count){ $header .= ",_cc[$i] .">\r
"; } else{ $header .= ",_cc[$i] .">"; } } } else{ $command[] = array("RCPT TO: _cc . ">\r
", 250); $header .= "CC: _cc . ">\r
"; } } // if(isset($this->_bcc)) { if(is_array($this->_bcc)) { $count = count($this->_bcc); for($i=0; $i_bcc[$i] . ">\r
", 250); if($i == 0){ $header .= "BCC: _bcc[$i] .">"; } elseif($i + 1 == $count){ $header .= ",_bcc[$i] .">\r
"; } else{ $header .= ",_bcc[$i] .">"; } } } else{ $command[] = array("RCPT TO: _bcc . ">\r
", 250); $header .= "BCC: _bcc . ">\r
"; } } $header .= "Subject: " . $this->_subject ."\r
"; if(isset($this->_attachment)) { // $header .= "Content-Type: multipart/mixed;\r
"; } elseif(false){ // $header .= "Content-Type: multipart/related;\r
"; } else{ //html $header .= "Content-Type: multipart/alternative;\r
"; } // $header .= "\t" . 'boundary="' . $separator . '"'; $header .= "\r
MIME-Version: 1.0\r
"; $header .= "\r
--" . $separator . "\r
"; $header .= "Content-Type:text/html; charset=utf-8\r
"; $header .= "Content-Transfer-Encoding: base64\r
\r
"; $header .= $this->_body . "\r
"; $header .= "--" . $separator . "\r
"; // if(isset($this->_attachment)){ $header .= "\r
--" . $separator . "\r
"; $header .= "Content-Type: " . $this->getMIMEType() . '; name="' . basename($this->_attachment) . '"' . "\r
"; $header .= "Content-Transfer-Encoding: base64\r
"; $header .= 'Content-Disposition: attachment; filename="' . basename($this->_attachment) . '"' . "\r
"; $header .= "\r
"; $header .= $this->readFile(); $header .= "\r
--" . $separator . "\r
"; } $header .= "\r
.\r
"; $command[] = array("DATA\r
", 354); $command[] = array($header, 250); $command[] = array("QUIT\r
", 221); return $command; } /** * * @access protected * @param string $command smtp * @param int $code * @return boolean */ protected function sendCommand($command, $code) { echo 'Send command:' . $command . ',expected code:' . $code . '
'; // try{ if(socket_write($this->_socket, $command, strlen($command))){ // , $code, if(empty($code)) { return true; } // $data = trim(socket_read($this->_socket, 1024)); echo 'response:' . $data . '

'; if($data) { $pattern = "/^".$code."/"; if(preg_match($pattern, $data)) { return true; } else{ $this->_errorMessage = "Error:" . $data . "|**| command:"; return false; } } else{ $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); return false; } } else{ $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); return false; } }catch(Exception $e) { $this->_errorMessage = "Error:" . $e->getMessage(); } } /** * , base64 * @access protected * @return mixed */ protected function readFile() { if(isset($this->_attachment) && file_exists($this->_attachment)) { $file = file_get_contents($this->_attachment); return base64_encode($file); } else { return false; } } /** * MIME * @access protected * @return mixed */ protected function getMIMEType() { if(isset($this->_attachment) && file_exists($this->_attachment)) { $mime = mime_content_type($this->_attachment); if(! preg_match("/gif|jpg|png|jpeg/", $mime)){ $mime = "application/octet-stream"; } return $mime; } else { return false; } } /** * * @access private * @return boolean */ private function socket() { if(!function_exists("socket_create")) { $this->_errorMessage = "Extension sockets must be enabled"; return false; } // socket $this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); if(!$this->_socket) { $this->_errorMessage = socket_strerror(socket_last_error()); return false; } socket_set_block($this->_socket);// // if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) { $this->_errorMessage = socket_strerror(socket_last_error()); return false; } socket_read($this->_socket, 1024); return true; } /** * socket * @access private * @return boolean */ private function close() { if(isset($this->_socket) && is_object($this->_socket)) { $this->_socket->close(); return true; } $this->_errorMessage = "No resource can to be close"; return false; } } /**************************** Test ***********************************/ $mail = new MySendMail(); $mail->setServer("XXXXX", "XXXXX@XXXXX", "XXXXX"); $mail->setFrom("XXXXX@XXXXX"); $mail->setReceiver("XXXXX@XXXXX"); //$mail->setReceiver("XXXXX@XXXXX"); $mail->setCc("XXXXX@XXXXX"); $mail->setCc("XXXXX@XXXXX"); $mail->setBcc("XXXXX@XXXXX"); $mail->setBcc("XXXXX@XXXXX"); $mail->setBcc("XXXXX@XXXXX"); $mail->setMailInfo("test", "test", "sms.zip"); $mail->sendMail();
setServer("XXXXX", "XXXXX@XXXXX", "XXXXX");   smtp   
* $mail->setFrom("XXXXX");      
* $mail->setReceiver("XXXXX");      
* $mail->setMailInfo("test", "test");       、  
* $mail->sendMail();   
*/
class MySendMail {
    /**
    * @var string          
    * @access private
    */
    private $_userName;
 
    /**
    * @var string         
    * @access private
    */
    private $_password;
 
    /**
    * @var string            
    * @access private
    */
    private $_sendServer;
 
    /**
    * @var int            
    * @access protected
    */
    protected $_port=25;
 
    /**
    * @var string    
    * @access protected
    */
    protected $_from;
 
    /**
    * @var string    
    * @access protected
    */
    protected $_to;
 
    /**
    * @var string   
    * @access protected
    */
    protected $_subject;
 
    /**
    * @var string     
    * @access protected
    */
    protected $_body;
 
    /**
    * @var reource socket  
    * @access protected
    */
    protected $_socket;
 
    /**
    * @var string     
    * @access protected
    */
    protected $_errorMessage;
 
 
    /**
    *         ,                ,             
    * @access public
    * @param string $server       ip    
    * @param string $username     
    * @param string $password     
    * @param int $port         ,smtp  25   
    * @return boolean
    */
    public function setServer($server, $username="", $password="", $port=25) {
        $this->_sendServer = $server;
        $this->_port = $port;
        if(!empty($username)) {
            $this->_userName = base64_encode($username);
        }
        if(!empty($password)) {
            $this->_password = base64_encode($password);
        }
        return true;
    }
 
    /**
    *      
    * @access public
    * @param string $from      
    * @return boolean
    */
    public function setFrom($from) {
        $this->_from = $from;
        return true;
    }
 
    /**
    *      
    * @access public
    * @param string $to      
    * @return boolean
    */
    public function setReceiver($to) {
        $this->_to = $to;
        return true;
    }
 
    /**
    *       
    * @access public
    * @param string $body     
    * @param string $subject       ,      ,    HTML  
    * @return boolean
    */
    public function setMailInfo($subject, $body) {
        $this->_subject = $subject;
        $this->_body = base64_encode($body);
        if(!empty($attachment)) {
            $this->_attachment = $attachment;
        }
        return true;
    }
 
    /**
    *     
    * @access public
    * @return boolean
    */
    public function sendMail() {
        $command = $this->getCommand();
        $this->socket();
         
        foreach ($command as $value) {
            if($this->sendCommand($value[0], $value[1])) {
                continue;
            }
            else{
                return false;
            }
        }
         
        //          ,smtp  :QUIT    ,         ,   socket       
        $this->close(); 
        echo 'Mail OK!';
        return true;
    }
 
    /**
    *       
    * @return string
    */
    public function error(){
        if(!isset($this->_errorMessage)) {
            $this->_errorMessage = "";
        }
        return $this->_errorMessage;
    }
 
    /**
    *   mail  
    * @access protected
    * @return array
    */
    protected function getCommand() {
        $separator = "----=_Part_" . md5($this->_from . time()) . uniqid(); //   
 
        $command = array(
                array("HELO sendmail\r
", 250) ); if(!empty($this->_userName)){ $command[] = array("AUTH LOGIN\r
", 334); $command[] = array($this->_userName . "\r
", 334); $command[] = array($this->_password . "\r
", 235); } // $command[] = array("MAIL FROM: _from . ">\r
", 250); $header = "FROM: _from . ">\r
"; // $command[] = array("RCPT TO: _to . ">\r
", 250); $header .= "TO: _to . ">\r
"; $header .= "Subject: " . $this->_subject ."\r
"; $header .= "Content-Type: multipart/alternative;\r
"; // $header .= "\t" . 'boundary="' . $separator . '"'; $header .= "\r
MIME-Version: 1.0\r
"; $header .= "\r
--" . $separator . "\r
"; $header .= "Content-Type:text/html; charset=utf-8\r
"; $header .= "Content-Transfer-Encoding: base64\r
\r
"; $header .= $this->_body . "\r
"; $header .= "--" . $separator . "\r
"; // $header .= "\r
.\r
"; $command[] = array("DATA\r
", 354); $command[] = array($header, 250); $command[] = array("QUIT\r
", 221); return $command; } /** * * @access protected * @param string $command smtp * @param int $code * @return boolean */ protected function sendCommand($command, $code) { echo 'Send command:' . $command . ',expected code:' . $code . '
'; // try{ if(socket_write($this->_socket, $command, strlen($command))){ // , $code, if(empty($code)) { return true; } // $data = trim(socket_read($this->_socket, 1024)); echo 'response:' . $data . '

'; if($data) { $pattern = "/^".$code."/"; if(preg_match($pattern, $data)) { return true; } else{ $this->_errorMessage = "Error:" . $data . "|**| command:"; return false; } } else{ $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); return false; } } else{ $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); return false; } }catch(Exception $e) { $this->_errorMessage = "Error:" . $e->getMessage(); } } /** * * @access private * @return boolean */ private function socket() { if(!function_exists("socket_create")) { $this->_errorMessage = "Extension sockets must be enabled"; return false; } // socket $this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); if(!$this->_socket) { $this->_errorMessage = socket_strerror(socket_last_error()); return false; } socket_set_block($this->_socket);// // if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) { $this->_errorMessage = socket_strerror(socket_last_error()); return false; } socket_read($this->_socket, 1024); return true; } /** * socket * @access private * @return boolean */ private function close() { if(isset($this->_socket) && is_object($this->_socket)) { $this->_socket->close(); return true; } $this->_errorMessage = "No resource can to be close"; return false; } } /**************************** Test ***********************************/ $mail = new MySendMail(); $mail->setServer("XXXX", "XXXXX@XXXXX", "XXXX"); $mail->setFrom("XXXXX@XXXXX"); $mail->setReceiver("XXXXX@XXXXX"); $mail->setMailInfo("test", "test"); $mail->sendMail();