php实现在站点里面添加邮件发送的功能


Posted in PHP onApril 28, 2020

下面夏日博客来讲下如何在站点里面添加一个邮件发送的功能。
首先需要下载一个smtp 的 php 邮件发送类,代码如下:

<?php
class smtp 
{ 
 /* Public Variables */
 public $smtp_port; 
 public $time_out; 
 public $host_name; 
 public $log_file; 
 public $relay_host; 
 public $debug; 
 public $auth; 
 public $user; 
 public $pass; 
  
 /* Private Variables */
 private $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->log_file =""; 
   
  $this->sock = FALSE; 
 } 
 
 /* Main Function */
 function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") 
 { 
  $mail_from = $this->get_address($this->strip_comment($from)); 
  $body = preg_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: $from<".$from.">\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"); 
  } 
  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 = preg_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."\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 (!preg_match("/^[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 (!@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 (preg_match($comment, $address)) { 
   $address = preg_replace($comment, "", $address); 
  } 
   
  return $address; 
 } 
 
 function get_address($address) 
 { 
  $address = preg_replace("/([ \t\r\n])+/", "", $address); 
  $address = preg_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; 
 } 
 
} // end class 
?>

这类的邮件发送类网上有许多,可以挑一款自己喜欢的就行,将以上的代码保存为 ZC_Email.class.php 文件,然后在使用的时候直接 include_once("ZC_Email.class.php") 就可以了,代码如下:

<?php 
include_once("ZC_Email.class.php");
?>

这是将邮件的发送类已经嵌入到页面中了,下一步就要在页面进行内容的发送了,我这里的系统是用户购买成功后进行发送,实例代码如下:

//空间购买成功发送邮件
  $smtpserver = "smtp.163.com";//SMTP服务器 
  $smtpserverport =25;//SMTP服务器端口 
  $smtpusermail = "xiariboke@163.com";//SMTP服务器的用户邮箱 
  $smtpemailto = "xiariboke@qq.com";//发送给谁 
  $smtpuser = "xiariboke@163.com";//SMTP服务器的用户帐号 
  $smtppass = "xiariboke";//SMTP服务器的用户密码 
  $mailsubject = "精品门业网香港空间购买";//邮件主题 
  $mailbody = "成功购买香港空间 $size M空间,购买域名为:$domain 购买时间为:".format_date(time(),2)." 到期时间为: $lasttime ".format_date(time(),5);//邮件内容 
  $mailtype = "TXT";//邮件格式(HTML/TXT),TXT为文本邮件 
  ########################################## 
  $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证. 
  $smtp->debug = false;//是否显示发送的调试信息 
  $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype); 
  //邮件发送结束
 
  showmsg('购买成功!','ZC_Link_List.php?sort=2');

其中 SMTP 服务器的用户邮箱和密码自己要设置好,这是发给指定的一个邮箱,当然可以自定义改成自己的,这里面的变量都是我站点内使用的,如果不需要可以自己稍微修改一下,这里不多讲了。
希望本文所述对大家学习php程序设计有所帮助。

PHP 相关文章推荐
COM in PHP (winows only)
Oct 09 PHP
PHP 应用程序的安全 -- 不能违反的四条安全规则
Nov 26 PHP
PHP date函数参数详解
Nov 27 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
Aug 15 PHP
基于flush()不能按顺序输出时的解决办法
Jun 29 PHP
php json转换成数组形式代码分享
Nov 10 PHP
php中substr()函数参数说明及用法实例
Nov 15 PHP
9个实用的PHP代码片段分享
Jan 22 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
Yii2如何批量添加数据
May 17 PHP
php提交过来的数据生成为txt文件
Apr 28 #PHP
php生成txt文件实例代码介绍
Apr 28 #PHP
100行PHP代码实现socks5代理服务器
Apr 28 #PHP
Yii2实现ajax上传图片插件用法
Apr 28 #PHP
thinkphp3.2实现上传图片的控制器方法
Apr 28 #PHP
PHP简单实现文本计数器的方法
Apr 28 #PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 #PHP
You might like
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
Python批量转换文件编码格式
2015/05/17 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
python3.7调试的实例方法
2020/07/21 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
心得体会开头
2014/01/01 职场文书
小学英语教学反思案例
2014/02/04 职场文书
高三高考决心书
2014/03/11 职场文书
一年级学生期末评语
2014/04/21 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
Django显示可视化图表的实践
2021/05/10 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
python tqdm用法及实例详解
2021/06/16 Python