Discuz教程网

[二次开发] Discuz X2 function sendmail 发送邮件函数

[复制链接]
authicon dly 发表于 2012-11-8 20:09:57 | 显示全部楼层 |阅读模式
DISCUZ X2 function sendmail 发送邮件函数
感谢 : Saion.LooTan,kookxiang 两位mm提供的信息 3Q


  1. function sendmail($toemail, $subject, $message, $from = '') {
  2.         global $_G;
  3.         if(!is_array($_G['setting']['mail'])) {
  4.                 $_G['setting']['mail'] = unserialize($_G['setting']['mail']);
  5.         }
  6.         $_G['setting']['mail']['server'] = $_G['setting']['mail']['port'] = $_G['setting']['mail']['auth'] = $_G['setting']['mail']['from'] = $_G['setting']['mail']['auth_username'] = $_G['setting']['mail']['auth_password'] = '';
  7.         if($_G['setting']['mail']['mailsend'] != 1) {
  8.                 $smtpnum = count($_G['setting']['mail']['smtp']);
  9.                 if($smtpnum) {
  10.                         $rid = rand(0, $smtpnum-1);
  11.                         $smtp = $_G['setting']['mail']['smtp'][$rid];
  12.                         $_G['setting']['mail']['server'] = $smtp['server'];
  13.                         $_G['setting']['mail']['port'] = $smtp['port'];
  14.                         $_G['setting']['mail']['auth'] = $smtp['auth'] ? 1 : 0;
  15.                         $_G['setting']['mail']['from'] = $smtp['from'];
  16.                         $_G['setting']['mail']['auth_username'] = $smtp['auth_username'];
  17.                         $_G['setting']['mail']['auth_password'] = $smtp['auth_password'];
  18.                 }
  19.         }
  20.         $message = preg_replace("/href\="(?!http\:\/\/)(.+?)"/i", 'href="'.$_G['siteurl'].'\\1"', $message);

  21. $message = <<


  22. $subject


  23. $subject

  24. $message


  25. EOT;

  26.         $maildelimiter = $_G['setting']['mail']['maildelimiter'] == 1 ? "\r\n" : ($_G['setting']['mail']['maildelimiter'] == 2 ? "\r" : "\n");
  27.         $mailusername = isset($_G['setting']['mail']['mailusername']) ? $_G['setting']['mail']['mailusername'] : 1;
  28.         $_G['setting']['mail']['port'] = $_G['setting']['mail']['port'] ? $_G['setting']['mail']['port'] : 25;
  29.         $_G['setting']['mail']['mailsend'] = $_G['setting']['mail']['mailsend'] ? $_G['setting']['mail']['mailsend'] : 1;

  30.         if($_G['setting']['mail']['mailsend'] == 3) {
  31.                 $email_from = empty($from) ? $_G['setting']['adminemail'] : $from;
  32.         } else {
  33.                 $email_from = $from == '' ? '=?'.CHARSET.'?B?'.base64_encode($_G['setting']['sitename'])."?= <".$_G['setting']['adminemail'].">" : (preg_match('/^(.+?) \<(.+?)\>$/',$from, $mats) ? '=?'.CHARSET.'?B?'.base64_encode($mats[1])."?= <$mats[2]>" : $from);
  34.         }

  35.         $email_to = preg_match('/^(.+?) \<(.+?)\>$/',$toemail, $mats) ? ($mailusername ? '=?'.CHARSET.'?B?'.base64_encode($mats[1])."?= <$mats[2]>" : $mats[2]) : $toemail;

  36.         $email_subject = '=?'.CHARSET.'?B?'.base64_encode(preg_replace("/[\r|\n]/", '', '['.$_G['setting']['sitename'].'] '.$subject)).'?=';
  37.         $email_message = chunk_split(base64_encode(str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $message))))));
  38.         $host = $_SERVER['HTTP_HOST'];
  39.         $version = $_G['setting']['version'];
  40.         $headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: $host $version {$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/html; charset=".CHARSET."{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";
  41.         if($_G['setting']['mail']['mailsend'] == 1) {
  42.                 if(function_exists('mail') && @mail($email_to, $email_subject, $email_message, $headers)) {
  43.                         return true;
  44.                 }
  45.                 return false;

  46.         } elseif($_G['setting']['mail']['mailsend'] == 2) {

  47.                 if(!$fp = fsockopen($_G['setting']['mail']['server'], $_G['setting']['mail']['port'], $errno, $errstr, 30)) {
  48.                         runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) CONNECT - Unable to connect to the SMTP server", 0);
  49.                         return false;
  50.                 }
  51.                 stream_set_blocking($fp, true);

  52.                 $lastmessage = fgets($fp, 512);
  53.                 if(substr($lastmessage, 0, 3) != '220') {
  54.                         runlog('SMTP', "{$_G[setting][mail][server]}:{$_G[setting][mail][port]} CONNECT - $lastmessage", 0);
  55.                         return false;
  56.                 }

  57.                 fputs($fp, ($_G['setting']['mail']['auth'] ? 'EHLO' : 'HELO')." uchome\r\n");
  58.                 $lastmessage = fgets($fp, 512);
  59.                 if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
  60.                         runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) HELO/EHLO - $lastmessage", 0);
  61.                         return false;
  62.                 }

  63.                 while(1) {
  64.                         if(substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
  65.                                 break;
  66.                         }
  67.                         $lastmessage = fgets($fp, 512);
  68.                 }

  69.                 if($_G['setting']['mail']['auth']) {
  70.                         fputs($fp, "AUTH LOGIN\r\n");
  71.                         $lastmessage = fgets($fp, 512);
  72.                         if(substr($lastmessage, 0, 3) != 334) {
  73.                                 runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) AUTH LOGIN - $lastmessage", 0);
  74.                                 return false;
  75.                         }

  76.                         fputs($fp, base64_encode($_G['setting']['mail']['auth_username'])."\r\n");
  77.                         $lastmessage = fgets($fp, 512);
  78.                         if(substr($lastmessage, 0, 3) != 334) {
  79.                                 runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) USERNAME - $lastmessage", 0);
  80.                                 return false;
  81.                         }

  82.                         fputs($fp, base64_encode($_G['setting']['mail']['auth_password'])."\r\n");
  83.                         $lastmessage = fgets($fp, 512);
  84.                         if(substr($lastmessage, 0, 3) != 235) {
  85.                                 runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) PASSWORD - $lastmessage", 0);
  86.                                 return false;
  87.                         }

  88.                         $email_from = $_G['setting']['mail']['from'];
  89.                 }

  90.                 fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  91.                 $lastmessage = fgets($fp, 512);
  92.                 if(substr($lastmessage, 0, 3) != 250) {
  93.                         fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  94.                         $lastmessage = fgets($fp, 512);
  95.                         if(substr($lastmessage, 0, 3) != 250) {
  96.                                 runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) MAIL FROM - $lastmessage", 0);
  97.                                 return false;
  98.                         }
  99.                 }

  100.                 fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $toemail).">\r\n");
  101.                 $lastmessage = fgets($fp, 512);
  102.                 if(substr($lastmessage, 0, 3) != 250) {
  103.                         fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $toemail).">\r\n");
  104.                         $lastmessage = fgets($fp, 512);
  105.                         runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) RCPT TO - $lastmessage", 0);
  106.                         return false;
  107.                 }

  108.                 fputs($fp, "DATA\r\n");
  109.                 $lastmessage = fgets($fp, 512);
  110.                 if(substr($lastmessage, 0, 3) != 354) {
  111.                         runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) DATA - $lastmessage", 0);
  112.                         return false;
  113.                 }

  114.                 $headers .= 'Message-ID: <'.gmdate('YmdHs').'.'.substr(md5($email_message.microtime()), 0, 6).rand(100000, 999999).'@'.$_SERVER['HTTP_HOST'].">{$maildelimiter}";

  115.                 fputs($fp, "Date: ".gmdate('r')."\r\n");
  116.                 fputs($fp, "To: ".$email_to."\r\n");
  117.                 fputs($fp, "Subject: ".$email_subject."\r\n");
  118.                 fputs($fp, $headers."\r\n");
  119.                 fputs($fp, "\r\n\r\n");
  120.                 fputs($fp, "$email_message\r\n.\r\n");
  121.                 $lastmessage = fgets($fp, 512);
  122.                 if(substr($lastmessage, 0, 3) != 250) {
  123.                         runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) END - $lastmessage", 0);
  124.                 }
  125.                 fputs($fp, "QUIT\r\n");

  126.                 return true;

  127.         } elseif($_G['setting']['mail']['mailsend'] == 3) {

  128.                 ini_set('SMTP', $_G['setting']['mail']['server']);
  129.                 ini_set('smtp_port', $_G['setting']['mail']['port']);
  130.                 ini_set('sendmail_from', $email_from);

  131.                 if(function_exists('mail') && @mail($email_to, $email_subject, $email_message, $headers)) {
  132.                         return true;
  133.                 }
  134.                 return false;
  135.         }
  136. }
复制代码



上一篇:Discuz X2uc的防灌水机制
下一篇:Discuz X2插入回复的函数insertpost()
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 03:41

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表