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

前端技术 2023/09/07 PHP

本文实例讲述了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程序设计有所帮助。

本文地址:https://www.stayed.cn/item/19581

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。