通過smtp發送郵件

由於遇到服務商空間沒有開啓mail()函數,要發送郵件就需要利用smtp來發送

首先自定義smtp類

<?php
 class smtp
 {
  /* 公共變量 */
  var $smtp_port;
  var $time_out;
  var $host_name;
  var $log_file;
  var $relay_host;
  var $debug;
  var $auth;
  var $user;
  var $pass;
  var $sock;

  function smtp($debug)
  {
   $this->debug = $debug;   //是否顯示調試信息
   $this->smtp_port = 25;    //SMTP端口
   $this->relay_host = "smtp.yeah.net"; //SMTP服務器地址
   $this->time_out = 30;
   $this->auth = true;    //是否身份驗證
   $this->user = "[email protected]"; //SMTP服務器的用戶帳號
   $this->pass = "****"; //SMTP服務器的用戶密碼,網易郵箱需要使用授權碼,如果沒有則使用密碼
   $this->host_name = "更相減損術"; 
   $this->log_file = "";
   $this->sock = FALSE;
  }

  /* 主函數 */
  function sendmail($to, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
  {
   $mail_from = $this->get_address($this->strip_comment($this->user));
   $body = ereg_replace("(^|(\r\n))(\.)", "\1.\3", $body);
   $header = "MIME-Version:1.0\r\n";
   
   if($mailtype=="HTML")
   {
    $header .= "Content-Type:text/html\r\n";
   }
   
   $header .= "To: ".$to."\r\n";
   
   if ($cc != "")
   {
    $header .= "Cc: ".$cc."\r\n";
   }
   
   $header .= "From: ".$this->user."<".$this->user.">\r\n";
   $header .= "Subject: ".$subject."\r\n";
   $header .= $additional_headers;
   $header .= "Date: ".date("r")."\r\n";
   $header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r\n";
   
   list($msec, $sec) = explode(" ", microtime());
   
   $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r\n";
   $TO = explode(",", $this->strip_comment($to));
   
   if ($cc != "")
   {
    $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
   }
   
   if ($bcc != "")
   {
    $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
   }
   
   $sent = TRUE;
   
   foreach ($TO as $rcpt_to)
   {
    $rcpt_to = $this->get_address($rcpt_to);
    
    if (!$this->smtp_sockopen($rcpt_to))
    {
     $this->log_write("Error: Cannot send email to ".$rcpt_to."\n");
     $sent = FALSE;
     
     continue;
    }
    
    if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body))
    {
     $this->log_write("E-mail has been sent to <".$rcpt_to.">\n");
    }
    else
    {
     $this->log_write("Error: Cannot send email to <".$rcpt_to.">\n");
     $sent = FALSE;
    }
    
    fclose($this->sock);
    
    $this->log_write("Disconnected from remote host\n");
   }
   
   return $sent;
  }
  
  /* 私有函數 */
  function smtp_send($helo, $from, $to, $header, $body = "")
  {
   if (!$this->smtp_putcmd("HELO", $helo))
   {
    return $this->smtp_error("sending HELO command");
   }
   
   if($this->auth)
   {
    if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user)))
    {
     return $this->smtp_error("sending HELO command");
    }
   
    if (!$this->smtp_putcmd("", base64_encode($this->pass)))
    {
     return $this->smtp_error("sending HELO command");
    }
   }
   
   if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">"))
   {
    return $this->smtp_error("sending MAIL FROM command");
   }
   
   if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">"))
   {
    return $this->smtp_error("sending RCPT TO command");
   }
   
   if (!$this->smtp_putcmd("DATA"))
   {
    return $this->smtp_error("sending DATA command");
   }
   
   if (!$this->smtp_message($header, $body))
   {
    return $this->smtp_error("sending message");
   }
   
   if (!$this->smtp_eom())
   {
    return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
   }
   
   if (!$this->smtp_putcmd("QUIT"))
   {
    return $this->smtp_error("sending QUIT command");
   }
   
   return TRUE;
  }
  
  function smtp_sockopen($address)
  {
   if ($this->relay_host == "")
   {
    return $this->smtp_sockopen_mx($address);
   }
   else
   {
    return $this->smtp_sockopen_relay();
   }
  }

  function smtp_sockopen_relay()
  {
   $this->log_write("嘗試連接 ".$this->relay_host.":".$this->smtp_port."\n");
   $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
   
   if (!($this->sock && $this->smtp_ok()))
   {
    $this->log_write("Error: 不能連接到中繼主機 ".$this->relay_host."\n");
    $this->log_write("Error: ".$errstr." (".$errno.")\n");
    
    return FALSE;
   }
   
   $this->log_write("已連接到中繼主機".$this->relay_host."\n");

   return TRUE;;
  }

  function smtp_sockopen_mx($address)
  {
   $domain = ereg_replace("^.+@([^@]+)$", "\1", $address);
   
   if (!@getmxrr($domain, $MXHOSTS))
   {
    $this->log_write("Error: 無法解析MX \"".$domain."\"\n");
    
    return FALSE;
   }
   
   foreach ($MXHOSTS as $host)
   {
    $this->log_write("Trying to ".$host.":".$this->smtp_port."\n");
    $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
   
    if (!($this->sock && $this->smtp_ok()))
    {
     $this->log_write("Warning: 不能連接到主機".$host."\n");
     $this->log_write("Error: ".$errstr." (".$errno.")\n");
     
     continue;
    }
   
    $this->log_write("已連接".$host."\n");
   
    return TRUE;
   }
   
   $this->log_write("Error: 不能連接到任何主機 (".implode(", ", $MXHOSTS).")\n");
   
   return FALSE;
  }

  function smtp_message($header, $body)
  {
   fputs($this->sock, $header."\r\n".$body);
   $this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> "));
   
   return TRUE;
  }
  
  function smtp_eom()
  {
   fputs($this->sock, "\r\n.\r\n");
   $this->smtp_debug(". [EOM]\n");
   
   return $this->smtp_ok();
  }
  
  function smtp_ok()
  {
   $response = str_replace("\r\n", "", fgets($this->sock, 512));
   $this->smtp_debug($response."\n");
   
   if (!ereg("^[23]", $response))
   {
    fputs($this->sock, "QUIT\r\n");
    fgets($this->sock, 512);
    $this->log_write("Error: Remote host returned \"".$response."\"\n");
    
    return FALSE;
   }
   
   return TRUE;
  }
  
  function smtp_putcmd($cmd, $arg = "")
  {
   if ($arg != "")
   {
    if($cmd=="")
     $cmd = $arg;
    else
     $cmd = $cmd." ".$arg;
   }
   
   fputs($this->sock, $cmd."\r\n");
   $this->smtp_debug("> ".$cmd."\n");
   
   return $this->smtp_ok();
  }
  
  function smtp_error($string)
  {
   $this->log_write("Error: Error occurred while ".$string.".\n");
   
   return FALSE;
  }
  
  function log_write($message)
  {
   $this->smtp_debug($message);
   
   if ($this->log_file == "")
   {
    return TRUE;
   }
   
   $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
   
   if (log_file>!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a")))
   {
    $this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"\n");
    
    return FALSE;;
   }
   
   flock($fp, LOCK_EX);
   fputs($fp, $message);
   fclose($fp);
   
   return TRUE;
  }
  
  function strip_comment($address)
  {
   $comment = "\([^()]*\)";
   
   while (ereg($comment, $address))
   {
    $address = ereg_replace($comment, "", $address);
   }
   
   return $address;
  }
  
  function get_address($address)
  {
   $address = ereg_replace("([ \t\r\n])+", "", $address);
   $address = ereg_replace("^.*<(.+)>.*$", "\1", $address);
   
   return $address;
  }
  
  function smtp_debug($message)
  {
   if ($this->debug)
   {
    echo $message;
   }
  }
 }
?>
然後直接調用即可
<?php
 require("../myfolder/bin/SMTP.php");
 $smtp = new smtp(true);
 $smtp->sendmail("[email protected]","test", "body", "HTML","", "","");
?>
最後在查看是否收到郵件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章