从Discuz扣下来的发送邮件代码,整理成类(支持群发)
来源:互联网 发布:丽晶服装软件 编辑:程序博客网 时间:2024/05/16 11:06
- <?php
- class SendMail
- {
- var $server = "";
- var $port = "25";
- var $auth = "1";
- var $auth_username = "";
- var $auth_password = "";
- var $mail_from = "";
- var $email_from = "";
- var $email_to = "";
- var $maildelimiter = "1";
- var $email_subject = "";
- var $email_message = "";
- var $mailusername = "1";
- var $charset = "gbk";
- var $bbname = "wer";
- var $ishtml = true;
- var $ContentType = "text/plain";
- function Send(){
- $this->maildelimiter = $this->maildelimiter == 1 ? "/r/n" : ($this->maildelimiter == 2 ? "/r" : "/n");
- $this->mailusername = isset($this->mailusername) ? $this->mailusername : 1;
- $this->email_subject = '=?'.$this->charset.'?B?'.base64_encode(str_replace("/r", '', str_replace("/n", '', '['.$this->bbname.'] '.$this->email_subject))).'?=';
- $this->email_message = chunk_split(base64_encode(str_replace("/r/n.", " /r/n..", str_replace("/n", "/r/n", str_replace("/r", "/n", str_replace("/r/n", "/n", str_replace("/n/r", "/r", $this->email_message)))))));
- $this->email_from = (preg_match('/^(.+?) /<(.+?)/>$/',$this->email_from, $from) ? '=?'.$this->charset.'?B?'.base64_encode($from[1])."?= <$from[2]>" : $this->email_from);
- foreach(explode(',', $this->email_to) as $touser) {
- $tousers[] = preg_match('/^(.+?) /<(.+?)/>$/',$touser, $to) ? ($this->mailusername ? '=?'.$this->charset.'?B?'.base64_encode($to[1])."?= <$to[2]>" : $to[2]) : $touser;
- }
- $this->email_to = implode(',', $tousers);
- if($this->ishtml==true) $this->ContentType = "text/html";
- $headers = "From: $this->email_from{$this->maildelimiter}X-Priority: 3{$this->maildelimiter}X-Mailer: Discuz! {$this->maildelimiter}MIME-Version: 1.0{$this->maildelimiter}Content-type: $this->ContentType; charset=$this->charset{$this->maildelimiter}Content-Transfer-Encoding: base64{$this->maildelimiter}";
- $this->port = $this->port ? $this->port : 25;
- if(!$fp = fsockopen($this->server, $this->port, $errno, $errstr, 30)) {
- die("$this->server:$this->port CONNECT - Unable to connect to the SMTP server");
- }
- stream_set_blocking($fp, true);
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != '220') {
- $errorlog('SMTP', "$this->server:$this->port CONNECT - $lastmessage");
- }
- fputs($fp, ($this->auth ? 'EHLO' : 'HELO')." discuz/r/n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
- die("$this->server:$this->port HELO/EHLO - $lastmessage");
- }
- while(1) {
- if(substr($lastmessage, 3, 1) != '-' || emptyempty($lastmessage)) {
- break;
- }
- $lastmessage = fgets($fp, 512);
- }
- if($this->auth) {
- fputs($fp, "AUTH LOGIN/r/n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 334) {
- die("$this->server:$this->port AUTH LOGIN - $lastmessage");
- }
- fputs($fp, base64_encode($this->auth_username)."/r/n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 334) {
- die("$this->server:$this->port USERNAME - $lastmessage");
- }
- fputs($fp, base64_encode($this->auth_password)."/r/n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 235) {
- die("$this->server:$this->port PASSWORD - $lastmessage");
- }
- $this->email_from = $this->mail_from;
- }
- fputs($fp, "MAIL FROM: <".preg_replace("/.*/<(.+?)/>.*/", "//1", $this->email_from).">/r/n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 250) {
- fputs($fp, "MAIL FROM: <".preg_replace("/.*/<(.+?)/>.*/", "//1", $this->email_from).">/r/n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 250) {
- die("$this->server:$this->port MAIL FROM - $lastmessage");
- }
- }
- $email_tos = array();
- foreach(explode(',', $this->email_to) as $touser) {
- $touser = trim($touser);
- if($touser) {
- fputs($fp, "RCPT TO: <".preg_replace("/.*/<(.+?)/>.*/", "//1", $touser).">/r/n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 250) {
- fputs($fp, "RCPT TO: <".preg_replace("/.*/<(.+?)/>.*/", "//1", $touser).">/r/n");
- $lastmessage = fgets($fp, 512);
- die("$this->server:$this->port RCPT TO - $lastmessage");
- }
- }
- }
- fputs($fp, "DATA/r/n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 354) {
- die("$this->server:$this->port$this->server:$this->port DATA - $lastmessage");
- }
- $headers .= 'Message-ID: <'.gmdate('YmdHs').'.'.substr(md5($this->email_message.microtime()), 0, 6).rand(100000, 999999).'@'.$_SERVER['HTTP_HOST'].">{$this->maildelimiter}";
- fputs($fp, "Date: ".gmdate('r')."/r/n");
- fputs($fp, "To: ".$this->email_to."/r/n");
- fputs($fp, "Subject: ".$this->email_subject."/r/n");
- fputs($fp, $headers."/r/n");
- fputs($fp, "/r/n/r/n");
- fputs($fp, "$this->email_message/r/n./r/n");
- fputs($fp, "QUIT/r/n");
- return true;
- }
- }
- ?>