PHP实现发送邮件的方法(基于简单邮件发送类)


Posted in PHP onDecember 17, 2015

本文实例讲述了PHP实现发送邮件的方法。分享给大家供大家参考,具体如下:

邮件发送类

<?php 
/*邮件发送类 
*功能:使用smtp服务器发送邮件 
*/ 
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($relay_host = "", $smtp_port = 25, $auth = false, $log_file="", $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 = $log_file; //邮件发送成功失败的日志记录文件  
  $this->sock = FALSE; 
 } 
 function mail_encode($str) 
 { 
  //return '=?utf-8?B?'.base64_encode(mb_convert_encoding($str, "GBK", "UTF-8")).'?='; 
  return "=?UTF-8?B?".base64_encode($str)."?=";
 } 
 /* 主函数,发送邮件 */ 
 function sendmail($flag, $boundary, $to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "") { 
  $mail_from = $this->get_address ( $this->strip_comment ( $from ) ); 
  $body = ereg_replace ( '(^|(\r\n))(\.)', "\1.\3", $body ); 
  $header = "MIME-Version:1.0\r\n"; 
  if ($mailtype == "HTML") { 
   if ($flag == 2) { 
    $header .= "Content-Type:multipart/mixed; boundary= $boundary\r\n"; 
   } else { 
    $header .= "Content-Type:text/html; charset=\"UTF-8\" \r\n"; 
   } 
  } 
  $header .= "To: " . $to . "\r\n";   
  if ($cc != "") { 
   $header .= "Cc: " . $cc . "\r\n"; 
  }  
  $header .= "From: $from<" . $from . ">\r\n"; 
  $subject = self::mail_encode($subject); 
  $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 ( "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}quot;, "\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 (! 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 (! @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}quot;, "\1", $address );
  return $address;
 }
 function smtp_debug($message) {
  if ($this->debug) {
   echo $message;
  }
 }
}
?>

调用邮件发送类发送邮件

<?php 
//文件全路径名称,文件名称 
function send_smtp_mail($file, $fileName) { 
 require ("smtp_mail.php"); 
 date_default_timezone_set ( 'Asia/Shanghai' ); 
 $subject = date ( "Y-m-d" ) . "邮件标题"; //邮件标题 
 $content = "邮件内容!"; //邮件内容 
 //$file = "/a/b/c.txt"; //附件 
 //$fileName = "email_log.log"; //附件名称 
 $smtpserver = "服务器ip"; //SMTP服务器 
 $smtpserverport = 25; //SMTP服务器端口 
 $bcc = ""; //副收件人 
 //$smtpuser = ""; //SMTP服务器的用户帐号 
 //$smtppass = ""; //SMTP服务器的用户密码 
 $smtpmailfrom = "aaa@bbb.com"; //SMTP服务器的用户邮箱,邮件发送者 
 $smtpemailto = "邮箱1,邮箱2,邮箱3"; //邮件接受者 
 $cc = ""; //抄送 
 $mailsubject = $subject; //邮件主题 
 $mailtype = "HTML"; //邮件格式(HTML/TXT),TXT为文本邮件 
 $additional_headers = ""; 
 $smtplogfile = ""; //发送邮件的日志文件,如果没有就不记录 
 // 定义分界线 
 $boundary = uniqid ( "" ); 
 $headers = "Content-type: multipart/mixed; boundary= $boundary\r\n"; 
 //附件类型 
 $mimeType = "application/unknown"; 
 // 打开文件 
 $fp = fopen ( $file, "r" ); 
 // 把整个文件读入一个变量 
 $read = fread ( $fp, filesize ( $file ) ); 
 //我们用base64方法把它编码 
 $read = base64_encode ( $read ); 
 //把这个长字符串切成由每行76个字符组成的小块 
 $read = chunk_split ( $read ); 
 fclose ( $fp ); //关闭文件 
 /* 邮件发送代码 */ 
 $flag = 1; //判断使用什么样的文件头1或2 
 if ($fileName == "") { 
  //没有附件 
  $body = $content; 
 } else { 
  //有附件 
  $flag = 2; 
  if ($mailtype == "HTML") { 
   $body = "--$boundary\r\n"; //此必须\r\n 
   $body .= "Content-Type:text/html\r\n\r\n"; //此必须\r\n\r\n 
   $body .= "$content\r\n"; 
   $body .= "--$boundary\r\n"; 
   $body .= "Content-type: $mimeType; name=$fileName\r\n"; 
   $body .= "Content-disposition: attachment; filename=$fileName\r\n"; 
   $body .= "Content-Transfer-Encoding: BASE64\r\n\r\n"; 
   $body .= "$read\r\n\r\n"; 
   $body .= "--$boundary--\r\n"; 
  } else { 
   $body = "--$boundary\r\n"; 
   $body .= "Content-type: Content-type: text/plain; charset=iso-8859-1\r\n\r\n"; 
   $body .= "Content-transfer-encoding: 8bit\r\n\r\n"; 
   $body .= "$content\r\n\r\n"; 
   $body .= "--$boundary\r\n"; 
   $body .= "Content-type: $mimeType; name=$fileName\r\n\r\n"; 
   $body .= "Content-disposition: attachment; filename=$fileName\r\n\r\n"; 
   $body .= "Content-transfer-encoding: base64\r\n\r\n"; 
   $body .= "$read\r\n\r\n"; 
   $body .= "--$boundary--\r\n"; 
  } 
 } 
 $mailbody = $body; //邮件内容 
 //这里面的一个true是表示使用身份验证,否则不使用身份验证. 
 $smtp = new smtp ( $smtpserver, $smtpserverport, false, $smtplogfile ); 
 //$smtp->debug = TRUE;//是否显示发送的调试信息 
 if ($smtp->sendmail ( $flag, $boundary, $smtpemailto, $smtpmailfrom, $mailsubject, $mailbody, $mailtype, $cc, $bcc, $additional_headers )) { 
  echo ("发送成功"); 
 } else { 
  echo ("发送失败"); 
 } 
} 
?>

希望本文所述对大家php程序设计有所帮助。

PHP 相关文章推荐
PHP个人网站架设连环讲(二)
Oct 09 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
php变量范围介绍
Oct 15 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
PHP 读取和编写 XML
Nov 19 PHP
php经典算法集锦
Nov 14 PHP
php mongodb操作类 带几个简单的例子
Aug 25 PHP
php文件上传 你真的掌握了吗
Nov 28 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
php字符串函数 str类常见用法示例
May 15 PHP
Yii 框架使用Forms操作详解
May 18 PHP
PHP响应post请求上传文件的方法
Dec 17 #PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 #PHP
通过PHP简单实例介绍文件上传
Dec 16 #PHP
PHP上传文件参考配置大文件上传
Dec 16 #PHP
谈谈 PHP7新增功能
Dec 16 #PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 #PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 #PHP
You might like
Terran热键控制
2020/03/14 星际争霸
PHP里的中文变量说明
2011/07/23 PHP
php array的学习笔记
2012/05/16 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
SVG描边动画
2017/02/23 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
深入理解python try异常处理机制
2016/06/01 Python
python基础教程之Filter使用方法
2017/01/17 Python
python实现Decorator模式实例代码
2018/02/09 Python
python游戏地图最短路径求解
2019/01/16 Python
Python列表(List)知识点总结
2019/02/18 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
EJB与JAVA BEAN的区别
2016/08/29 面试题
物业工作计划书
2014/01/10 职场文书
个人借款担保书
2014/04/02 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
公司承诺函范文
2015/01/21 职场文书
跑出一片天观后感
2015/06/08 职场文书