从Discuz扣下来的发送邮件代码,整理成类(支持群发)

来源:互联网 发布:丽晶服装软件 编辑:程序博客网 时间:2024/05/16 11:06
  1. <?php
  2. class SendMail
  3. {
  4.      var $server = "";    //地址或IP 如:smtp.tom.com
  5.      var $port = "25";    //端口 
  6.      var $auth = "1";    //服务器是否要求身份验证
  7.      var $auth_username = "";
  8.      var $auth_password = "";
  9.      var $mail_from = "";   //发件人 如:wggtyj@tom.com
  10.      var $email_from = "";   //发件人
  11.      var $email_to = "";     //收件人,多个用逗号隔开 如:44490400@qq.com,44343454@qq.com
  12.      var $maildelimiter = "1";     //1使用 CRLF 作为分隔符(通常为 Windows 主机),0使用 LF 作为分隔符(通常为 Unix/Linux 主机),2使用 CR 作为分隔符(通常为 Mac 主机)
  13.      var $email_subject = "";   //标题
  14.      var $email_message = "";   //内容
  15.      var $mailusername = "1";   //收件人地址中包含用户名
  16.      var $charset = "gbk";
  17.      var $bbname = "wer";    //网站名称
  18. var $ishtml = true;     //是否使用html
  19. var $ContentType = "text/plain";
  20. function Send(){
  21. $this->maildelimiter = $this->maildelimiter == 1 ? "/r/n" : ($this->maildelimiter == 2 ? "/r" : "/n");
  22. $this->mailusername = isset($this->mailusername) ? $this->mailusername : 1;
  23. $this->email_subject = '=?'.$this->charset.'?B?'.base64_encode(str_replace("/r"''str_replace("/n"'''['.$this->bbname.'] '.$this->email_subject))).'?=';
  24. $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)))))));
  25. $this->email_from = (preg_match('/^(.+?) /<(.+?)/>$/',$this->email_from, $from) ? '=?'.$this->charset.'?B?'.base64_encode($from[1])."?= <$from[2]>" : $this->email_from);
  26. foreach(explode(','$this->email_to) as $touser) {
  27. $tousers[] = preg_match('/^(.+?) /<(.+?)/>$/',$touser$to) ? ($this->mailusername ? '=?'.$this->charset.'?B?'.base64_encode($to[1])."?= <$to[2]>" : $to[2]) : $touser;
  28. }
  29. $this->email_to = implode(','$tousers);
  30. if($this->ishtml==true) $this->ContentType = "text/html";
  31. $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}";
  32. $this->port = $this->port ? $this->port : 25;
  33. if(!$fp = fsockopen($this->server, $this->port, $errno$errstr, 30)) {
  34.    die("$this->server:$this->port CONNECT - Unable to connect to the SMTP server");
  35. }
  36.    stream_set_blocking($fp, true);
  37. $lastmessage = fgets($fp, 512);
  38. if(substr($lastmessage, 0, 3) != '220') {
  39.    $errorlog('SMTP'"$this->server:$this->port CONNECT - $lastmessage");
  40. }
  41. fputs($fp, ($this->auth ? 'EHLO' : 'HELO')." discuz/r/n");
  42. $lastmessage = fgets($fp, 512);
  43. if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
  44.    die("$this->server:$this->port HELO/EHLO - $lastmessage");
  45. }
  46. while(1) {
  47.    if(substr($lastmessage, 3, 1) != '-' || emptyempty($lastmessage)) {
  48.      break;
  49.     }
  50.     $lastmessage = fgets($fp, 512);
  51. }
  52. if($this->auth) {
  53.    fputs($fp"AUTH LOGIN/r/n");
  54.    $lastmessage = fgets($fp, 512);
  55.    if(substr($lastmessage, 0, 3) != 334) {
  56.     die("$this->server:$this->port AUTH LOGIN - $lastmessage");
  57.    }
  58.    fputs($fpbase64_encode($this->auth_username)."/r/n");
  59.    $lastmessage = fgets($fp, 512);
  60.    if(substr($lastmessage, 0, 3) != 334) {
  61.     die("$this->server:$this->port USERNAME - $lastmessage");
  62.    }
  63.    fputs($fpbase64_encode($this->auth_password)."/r/n");
  64.    $lastmessage = fgets($fp, 512);
  65.    if(substr($lastmessage, 0, 3) != 235) {
  66.     die("$this->server:$this->port PASSWORD - $lastmessage");
  67.    }
  68.    $this->email_from = $this->mail_from;
  69. }
  70. fputs($fp"MAIL FROM: <".preg_replace("/.*/<(.+?)/>.*/""//1"$this->email_from).">/r/n");
  71. $lastmessage = fgets($fp, 512);
  72. if(substr($lastmessage, 0, 3) != 250) {
  73.    fputs($fp"MAIL FROM: <".preg_replace("/.*/<(.+?)/>.*/""//1"$this->email_from).">/r/n");
  74.    $lastmessage = fgets($fp, 512);
  75.    if(substr($lastmessage, 0, 3) != 250) {
  76.     die("$this->server:$this->port MAIL FROM - $lastmessage");
  77.    }
  78. }
  79. $email_tos = array();
  80. foreach(explode(','$this->email_to) as $touser) {
  81.    $touser = trim($touser);
  82.    if($touser) {
  83.     fputs($fp"RCPT TO: <".preg_replace("/.*/<(.+?)/>.*/""//1"$touser).">/r/n");
  84.     $lastmessage = fgets($fp, 512);
  85.     if(substr($lastmessage, 0, 3) != 250) {
  86.      fputs($fp"RCPT TO: <".preg_replace("/.*/<(.+?)/>.*/""//1"$touser).">/r/n");
  87.      $lastmessage = fgets($fp, 512);
  88.      die("$this->server:$this->port RCPT TO - $lastmessage");
  89.     }
  90.    }
  91. }
  92. fputs($fp"DATA/r/n");
  93. $lastmessage = fgets($fp, 512);
  94. if(substr($lastmessage, 0, 3) != 354) {
  95.    die("$this->server:$this->port$this->server:$this->port DATA - $lastmessage");
  96. }
  97. $headers .= 'Message-ID: <'.gmdate('YmdHs').'.'.substr(md5($this->email_message.microtime()), 0, 6).rand(100000, 999999).'@'.$_SERVER['HTTP_HOST'].">{$this->maildelimiter}";
  98. fputs($fp"Date: ".gmdate('r')."/r/n");
  99. fputs($fp"To: ".$this->email_to."/r/n");
  100. fputs($fp"Subject: ".$this->email_subject."/r/n");
  101. fputs($fp$headers."/r/n");
  102. fputs($fp"/r/n/r/n");
  103. fputs($fp"$this->email_message/r/n./r/n");
  104. fputs($fp"QUIT/r/n");
  105. return true;
  106. }
  107. }
  108. //用法
  109. /*
  110.      $mail = new SendMail;
  111.      $mail->server = "smtp.tom.com";
  112.      $mail->port = "25";
  113.      $mail->auth = "1";    //服务器是否要求身份验证
  114.      $mail->auth_username = "test";
  115.      $mail->auth_password = "test";
  116.      $mail->mail_from = "test@tom.com";
  117.      $mail->email_from = "test@tom.com";
  118.      $mail->email_to = "44490400@qq.com";     //多个用逗号隔开
  119.      $mail->maildelimiter = "1";     //1使用 CRLF 作为分隔符(通常为 Windows 主机),0使用 LF 作为分隔符(通常为 Unix/Linux 主机),2使用 CR 作为分隔符(通常为 Mac 主机)
  120.      $mail->email_subject = "wwwwwwwwwwwwwwwwwwwww";
  121.      $mail->email_message = "ssssss<font color='red'><b>sssss</b></font>ssssssssssssss";
  122.      $mail->mailusername = "1";   //收件人地址中包含用户名
  123.      $mail->charset = "gbk";
  124.      $mail->bbname = "wer";    //网站名称
  125. $mail->ishtml = true;
  126. $mail->ContentType = "text/plain";
  127.      $mail->Send();
  128. */
  129. ?>
原创粉丝点击