通过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 = "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","", "","");
?>
最后在查看是否收到邮件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值