通过smtp发送邮件

来源:互联网 发布:网上的淘宝刷手可靠吗 编辑:程序博客网 时间:2024/05/05 14:15

由于遇到服务商空间没有开启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 = "greysun@yeah.net"; //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("czh60601@126.com","test", "body", "HTML","", "","");?>
最后在查看是否收到邮件。
参考链接:http://www.jb51.net/article/76559.htm

0 0
原创粉丝点击