PHP使用SMTP邮件服务器发送邮件示例

PHP使用SMTP邮件服务器发送邮件。具体如下:

用之前记得先去163注册一个邮箱,然后打开SMTP服务,当然也可以使用QQ邮箱等,但配置信息得改。

话不多说,直接上代码

email.class.php  定义发送邮件的库

  <?php  class smtp  {    /* Public Variables */    var $smtp_port; //smtp_port 端口号    var $time_out;    var $host_name; //服务器主机名    var $log_file;    var $relay_host; //服务器主机地址    var $debug;    var $auth; //验证    var $user; //服务器用户名    var $pass; //服务器密码    /* Private Variables */    var $sock;    /* Constractor 构造方法*/    function smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass)    {      $this->debug   = FALSE;      $this->smtp_port = $smtp_port;      $this->relay_host = $relay_host;      $this->time_out  = 30; //is used in fsockopen()      #      $this->auth    = $auth; //auth      $this->user    = $user;      $this->pass    = $pass;      #      $this->host_name = "localhost"; //is used in HELO command      // $this->host_name = "smtp.163.com"; //is used in HELO command      $this->log_file  = "";      $this->sock = FALSE;    }    /* Main Function */    function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")    {      $header  = "";      $mail_from = $this->get_address($this->strip_comment($from));      $body   = mb_ereg_replace("(^|(rn))(\.)", "\1.\3", $body);      $header .= "MIME-Version:1.0rn";      if ($mailtype == "HTML") { //邮件发送类型        //$header .= "Content-Type:text/htmlrn";        $header .= 'Content-type: text/html; charset=utf-8' . "rn";      }      $header .= "To: " . $to . "rn";      if ($cc != "") {        $header .= "Cc: " . $cc . "rn";      }      $header .= "From: " . $from . "rn";      // $header .= "From: $from<".$from.">rn";  //这里只显示邮箱地址,不够人性化      $header .= "Subject: " . $subject . "rn";      $header .= $additional_headers;      $header .= "Date: " . date("r") . "rn";      $header .= "X-Mailer:By (PHP/" . phpversion() . ")rn";      list($msec, $sec) = explode(" ", microtime());      $header .= "Message-ID: <" . date("YmdHis", $sec) . "." . ($msec * 1000000) . "." . $mail_from . ">rn";      $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 hostn");      }      echo "<br>";      //echo $header;      return $sent;    }    /* Private Functions */    function smtp_send($helo, $from, $to, $header, $body = "")    {      if (!$this->smtp_putcmd("HELO", $helo)) {        return $this->smtp_error("sending HELO command");      }      #auth      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("Trying to " . $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: Cannot connenct to relay host " . $this->relay_host . "n");        $this->log_write("Error: " . $errstr . " (" . $errno . ")n");        return FALSE;      }      $this->log_write("Connected to relay host " . $this->relay_host . "n");      return TRUE;      ;    }    function smtp_sockopen_mx($address)    {      $domain = ereg_replace("^.+@([^@]+)$", "\1", $address);      if (!@getmxrr($domain, $MXHOSTS)) {        $this->log_write("Error: Cannot resolve 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: Cannot connect to mx host " . $host . "n");          $this->log_write("Error: " . $errstr . " (" . $errno . ")n");          continue;        }        $this->log_write("Connected to mx host " . $host . "n");        return TRUE;      }      $this->log_write("Error: Cannot connect to any mx hosts (" . implode(", ", $MXHOSTS) . ")n");      return FALSE;    }    function smtp_message($header, $body)    {      fputs($this->sock, $header . "rn" . $body);      $this->smtp_debug("> " . str_replace("rn", "n" . "> ", $header . "n> " . $body . "n> "));      return TRUE;    }    function smtp_eom()    {      fputs($this->sock, "rn.rn");      $this->smtp_debug(". [EOM]n");      return $this->smtp_ok();    }    function smtp_ok()    {      $response = str_replace("rn", "", fgets($this->sock, 512));      $this->smtp_debug($response . "n");      if (!mb_ereg("^[23]", $response)) {        fputs($this->sock, "QUITrn");        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 . "rn");      $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 (!@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 (mb_ereg($comment, $address)) {        $address = mb_ereg_replace($comment, "", $address);      }      return $address;    }    function get_address($address)    {      $address = mb_ereg_replace("([ trn])+", "", $address);      $address = mb_ereg_replace("^.*<(.+)>.*$", "\1", $address);      return $address;    }    function smtp_debug($message)    {      if ($this->debug) {        echo $message . "<br>";      }    }    function get_attach_type($image_tag) //    {      $filedata = array();      $img_file_con = fopen($image_tag, "r");      unset($image_data);      while ($tem_buffer = AddSlashes(fread($img_file_con, filesize($image_tag))))        $image_data .= $tem_buffer;      fclose($img_file_con);      $filedata['context'] = $image_data;      $filedata['filename'] = basename($image_tag);      $extension      = substr($image_tag, strrpos($image_tag, "."), strlen($image_tag) - strrpos($image_tag, "."));      switch ($extension) {        case ".gif":          $filedata['type'] = "image/gif";          break;        case ".gz":          $filedata['type'] = "application/x-gzip";          break;        case ".htm":          $filedata['type'] = "text/html";          break;        case ".html":          $filedata['type'] = "text/html";          break;        case ".jpg":          $filedata['type'] = "image/jpeg";          break;        case ".tar":          $filedata['type'] = "application/x-tar";          break;        case ".txt":          $filedata['type'] = "text/plain";          break;        case ".zip":          $filedata['type'] = "application/zip";          break;        default:          $filedata['type'] = "application/octet-stream";          break;      }      return $filedata;    }  }  ?>

index.php 发送邮件的具体实现

  <?php  require 'email.class.php';  $mailto='*********@qq.com'; //收件人  $subject="恭喜您开通年费会员成功"; //邮件主题  $body="回复TD退订"; //邮件内容  sendmailto($mailto,$subject,$body);  echo "finish".date('时间:Y年m月d日  H:i');  function sendmailto($mailto, $mailsub, $mailbd)  {    //require_once ('email.class.php');    //##########################################    $smtpserver   = "smtp.163.com"; //SMTP服务器    $smtpserverport = 25; //SMTP服务器端口    $smtpusermail  = "***********@163.com"; //SMTP服务器的用户邮箱    $smtpemailto  = $mailto;    $smtpuser    = "*******@163.com"; //SMTP服务器的用户帐号    $smtppass    = "**********"; //SMTP服务器的用户密码    $mailsubject  = $mailsub; //邮件主题    $mailsubject  = "=?UTF-8?B?" . base64_encode($mailsubject) . "?="; //防止乱码    $mailbody    = $mailbd; //邮件内容    //$mailbody = "=?UTF-8?B?".base64_encode($mailbody)."?="; //防止乱码    $mailtype    = "HTML"; //邮件格式(HTML/TXT),TXT为文本邮件. 139邮箱的短信提醒要设置为HTML才正常    ##########################################    $smtp      = new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //这里面的一个true是表示使用身份验证,否则不使用身份验证.    $smtp->debug  = TRUE; //是否显示发送的调试信息    $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);  }  ?>
© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论