PHP实现发送邮件的方法(基于简单邮件发送类)
程序员文章站
2022-05-12 13:30:01
本文实例讲述了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程序设计有所帮助。