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程序设计有所帮助。

(0)

相关推荐

  • php发送邮件的问题详解

    php实现发送邮件,一般常用的是开源项目PHPMailer来实现,那么除此之外,有什么其他的好的项目吗? 解决方法: 使用SMTP协议来发送邮件吧 在CodeIgniter里面使用它内置的邮件类发送邮件 $this->load->library('email'); $to = "aa@bb.cc"; $subject = "test"; $message = "hello!"; $config["protocol"

  • PHP实现163邮箱自动发送邮件

    163邮箱大家都使用过吧,那么基于php如何实现163邮箱自动发送邮件功能呢,下面我们小编给大家分享具体实现代码: 想给大家展示下效果图: demo.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http:/

  • PHP插件PHPMailer发送邮件功能

    本文实例为大家分享了ThinkPHP3.2.3发送邮件的具体代码,供大家参考,具体内容如下 首先第一步 :在网上down了一个PHPMailer插件,下载解压后,这里我们只需要用到其中两个文件,如下图所示: 将class.phpmailer.php和class.smtp.php两个文件分别放置到 ThinkPHP/Library/Vendor/PHPMailer/class.phpmailer.php (注意大小写哦) ThinkPHP/Library/Vendor/PHPMailer/clas

  • PHP实现自动发送邮件功能代码(qq 邮箱)

    最近做一个邮箱验证的功能,研究了一会,搞定了邮件的自动发送.下面用qq邮箱作为演示,一步一步来解释: 代码下载地址 首先,就是做到邮件的发送,代码如下: <?PHP //邮件发送 require './mailer/class.phpmailer.php'; require './mailer/class.smtp.php'; date_default_timezone_set('PRC');//设置邮件发送的时间,如果不设置,则会显示其他区的时间 $mail = new PHPMailer()

  • Linux服务器下PHPMailer发送邮件失败的问题解决

    需求 更换服务器之后,我发现我的发送邮件功能失效了!原来的服务器是可以的,一定是哪里出问题了,决定来排查一下.我是用的PHPMailer,SMTP方式发送邮件的. 排查过程 这种方式首先PHP要开启sockets拓展,查了一下phpinfo页面,是开启的: 看了一下openssl也是开启(因为拿了qq邮箱来测),所以没问题: 那就再看一下allow_url_fopen,开启的,没问题: 是不是禁用了函数?没有禁用,没问题: 那配置上就没有问题了,我就想,是不是端口被占用了? 运行一下:netst

  • phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法

    本文实例讲述了phplist及phpmailer通过gmail发送邮件的配置方法.分享给大家供大家参考,具体如下: 一般来说,只要你使用的不是gmail邮箱,那么利用phplist发送邮件只要按照前面<PHP的邮件群发系统phplist配置方法详细总结>配置就够了.但若你如同我一样不幸,必须使用gmail这种有ssl验证的邮箱,那么恭喜你,我的不幸现在已然成为你的幸运,经过数天的尝试,我终于成功将gmail与phplist组合在了一起.现将经验分享于此,希望对各位同我一般境遇的同志有用.另外,

  • phpmailer简单发送邮件的方法(附phpmailer源码下载)

    本文实例讲述了phpmailer简单发送邮件的方法.分享给大家供大家参考,具体如下: 首先,点击此处本站下载相应的php文件. 解压后有2个php文件(2个类)  1个html文件(API) 将2个php文件放到php项目中 简述:我这里是用一个163的邮箱发消息给126的邮箱 关键代码如下: <?php require 'class.phpmailer.php'; $mail = new PHPMailer(true); //建立邮件发送类 $mail->CharSet = "UT

  • 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; /* 构造函数 */ fu

  • CI框架简单邮件发送类实例

    本文实例讲述了CI框架简单邮件发送类.分享给大家供大家参考,具体如下: ci框架绝对是php初学中想要的东西,它能极大的缩短你的代码量! 下面看看我的发送邮件的简单演示: function email() { $this->load->library('email'); $config['protocol'] = 'smtp'; $config['smtp_host'] = 'smtp.163.com'; $config['smtp_user'] = 'jb51@163.com';//这里写上

  • 基于JavaMail实现简单邮件发送

    本文实例为大家分享了JavaMail实现简单邮件发送的具体代码,供大家参考,具体内容如下 1.引入依赖 <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-mail</artifactId>     <version>2.5.5</version> </dependency&g

  • Java实现简单邮件发送

    JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件.这一机制被广泛的用在注册激活和垃圾邮件的发送等方面. Java邮件发送的大致过程是这样的: 1.构建一个继承自javax.mail.Authenticator的具体类,并重写里面的getPasswordAuthentication()方法.此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利. 2.构建一个proper

  • Java实现简单邮件发送功能

    本文实例为大家分享了Java实现简单邮件发送的具体代码,供大家参考,具体内容如下 需要的jar包: activation-1.1.1.jar mail-1.4.7.jar QQ邮箱设置开启POP3/SMTP服务,并获得授权码 java实现简单邮件发送 import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax

  • JavaMail实现简单邮件发送

    本文实例为大家分享了JavaMail实现简单邮件发送的具体代码,供大家参考,具体内容如下 简单邮件 即纯文本邮件,没有除文字以外的其他所有文件. 传输协议 SMTP协议 全称为 Simple Mail Transfer Protocol,简单邮件传输协议.它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则. POP3协议 全称为 Post Office Protocol,邮局协议.它定义了邮件客户端软件和POP3邮件服务器的通信规则. 邮件发送原理 ①SMT

  • C#实现的自定义邮件发送类完整实例(支持多人多附件)

    本文实例讲述了C#实现的自定义邮件发送类.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Mail; using System.Net.Mime; namespace ConsoleApplication1 { /// <summary> /// 发送邮件类 的摘要说明 /// </summary&g

  • PHP实现支持SSL连接的SMTP邮件发送类

    本文实例讲述了PHP实现支持SSL连接的SMTP邮件发送类.分享给大家供大家参考.具体如下: 该实例代码测试过了gmail和QQ邮箱的SMTP.具体代码如下: 复制代码 代码如下: <?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送,带附件(单个或多个附件),支持到服务器的ssl连接 * 需要的php扩展:sockets.Fileinfo和openssl. * 编码格式是UTF-8,传输编码格式是base64 * @example *

  • PHP邮件发送类PHPMailer用法实例详解

    本文实例讲述了PHP邮件发送类PHPMailer用法,并详细讲述了其具体的操作步骤.分享给大家供大家参考.具体步骤如下: 1.在服务器安装 sendmail sudo apt-get install sendmail 2.启动 sendmail sudo /etc/init.d/sendmail start 3.修改 php.ini [mail function] SMTP = localhost smtp_port = 25 sendmail_from = me@example.com 4.F

  • 基于JavaMail的Java实现简单邮件发送功能

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件. 1. 电子邮件协议 电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP.其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议.SMTP 是

随机推荐