PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/discuzx_hacks/discuzx_plus/source/function/function_mail.php

https://github.com/bluelovers/Discuz
PHP | 231 lines | 184 code | 41 blank | 6 comment | 53 complexity | 95a87627957d8ce17923ea36776e2911 MD5 | raw file
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: function_mail.php 8214 2010-04-19 06:00:47Z wangjinbo $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. function sendmail($toemail, $subject, $message, $from = '') {
  12. global $_G;
  13. if(!is_array($_G['setting']['mail'])) {
  14. $_G['setting']['mail'] = unserialize($_G['setting']['mail']);
  15. }
  16. $message = preg_replace("/href\=\"(?!http\:\/\/)(.+?)\"/i", 'href="'.$_G['siteurl'].'\\1"', $message);
  17. $message = <<<EOT
  18. <html>
  19. <head>
  20. <meta http-equiv="Content-Type" content="text/html; charset=$_G[charset]">
  21. <title>$subject</title>
  22. </head>
  23. <body>
  24. $subject<br />
  25. $message
  26. </body>
  27. </html>
  28. EOT;
  29. $maildelimiter = $_G['setting']['mail']['maildelimiter'] == 1 ? "\r\n" : ($_G['setting']['mail']['maildelimiter'] == 2 ? "\r" : "\n");
  30. $mailusername = isset($_G['setting']['mail']['mailusername']) ? $_G['setting']['mail']['mailusername'] : 1;
  31. $_G['setting']['mail']['port'] = $_G['setting']['mail']['port'] ? $_G['setting']['mail']['port'] : 25;
  32. $_G['setting']['mail']['mailsend'] = $_G['setting']['mail']['mailsend'] ? $_G['setting']['mail']['mailsend'] : 1;
  33. if($_G['setting']['mail']['mailsend'] == 3) {
  34. $email_from = empty($from) ? $_G['setting']['adminemail'] : $from;
  35. } else {
  36. $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);
  37. }
  38. $email_to = preg_match('/^(.+?) \<(.+?)\>$/',$toemail, $mats) ? ($mailusername ? '=?'.CHARSET.'?B?'.base64_encode($mats[1])."?= <$mats[2]>" : $mats[2]) : $toemail;;
  39. $email_subject = '=?'.CHARSET.'?B?'.base64_encode(preg_replace("/[\r|\n]/", '', '['.$_G['setting']['sitename'].'] '.$subject)).'?=';
  40. $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))))));
  41. $headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: DISCUZ ".DISCUZ_VERSION."{$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/html; charset=".CHARSET."{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";
  42. if($_G['setting']['mail']['mailsend'] == 1) {
  43. if(function_exists('mail') && @mail($email_to, $email_subject, $email_message, $headers)) {
  44. return true;
  45. }
  46. return false;
  47. } elseif($_G['setting']['mail']['mailsend'] == 2) {
  48. if(!$fp = fsockopen($_G['setting']['mail']['server'], $_G['setting']['mail']['port'], $errno, $errstr, 30)) {
  49. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) CONNECT - Unable to connect to the SMTP server", 0);
  50. return false;
  51. }
  52. stream_set_blocking($fp, true);
  53. $lastmessage = fgets($fp, 512);
  54. if(substr($lastmessage, 0, 3) != '220') {
  55. runlog('SMTP', "$_G[setting][mail][server]:$_G[setting][mail][port] CONNECT - $lastmessage", 0);
  56. return false;
  57. }
  58. fputs($fp, ($_G['setting']['mail']['auth'] ? 'EHLO' : 'HELO')." uchome\r\n");
  59. $lastmessage = fgets($fp, 512);
  60. if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
  61. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) HELO/EHLO - $lastmessage", 0);
  62. return false;
  63. }
  64. while(1) {
  65. if(substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
  66. break;
  67. }
  68. $lastmessage = fgets($fp, 512);
  69. }
  70. if($_G['setting']['mail']['auth']) {
  71. fputs($fp, "AUTH LOGIN\r\n");
  72. $lastmessage = fgets($fp, 512);
  73. if(substr($lastmessage, 0, 3) != 334) {
  74. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) AUTH LOGIN - $lastmessage", 0);
  75. return false;
  76. }
  77. fputs($fp, base64_encode($_G['setting']['mail']['auth_username'])."\r\n");
  78. $lastmessage = fgets($fp, 512);
  79. if(substr($lastmessage, 0, 3) != 334) {
  80. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) USERNAME - $lastmessage", 0);
  81. return false;
  82. }
  83. fputs($fp, base64_encode($_G['setting']['mail']['auth_password'])."\r\n");
  84. $lastmessage = fgets($fp, 512);
  85. if(substr($lastmessage, 0, 3) != 235) {
  86. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) PASSWORD - $lastmessage", 0);
  87. return false;
  88. }
  89. $email_from = $_G['setting']['mail']['from'];
  90. }
  91. fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  92. $lastmessage = fgets($fp, 512);
  93. if(substr($lastmessage, 0, 3) != 250) {
  94. fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  95. $lastmessage = fgets($fp, 512);
  96. if(substr($lastmessage, 0, 3) != 250) {
  97. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) MAIL FROM - $lastmessage", 0);
  98. return false;
  99. }
  100. }
  101. fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $toemail).">\r\n");
  102. $lastmessage = fgets($fp, 512);
  103. if(substr($lastmessage, 0, 3) != 250) {
  104. fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $toemail).">\r\n");
  105. $lastmessage = fgets($fp, 512);
  106. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) RCPT TO - $lastmessage", 0);
  107. return false;
  108. }
  109. fputs($fp, "DATA\r\n");
  110. $lastmessage = fgets($fp, 512);
  111. if(substr($lastmessage, 0, 3) != 354) {
  112. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) DATA - $lastmessage", 0);
  113. return false;
  114. }
  115. $headers .= 'Message-ID: <'.gmdate('YmdHs').'.'.substr(md5($email_message.microtime()), 0, 6).rand(100000, 999999).'@'.$_SERVER['HTTP_HOST'].">{$maildelimiter}";
  116. fputs($fp, "Date: ".gmdate('r')."\r\n");
  117. fputs($fp, "To: ".$email_to."\r\n");
  118. fputs($fp, "Subject: ".$email_subject."\r\n");
  119. fputs($fp, $headers."\r\n");
  120. fputs($fp, "\r\n\r\n");
  121. fputs($fp, "$email_message\r\n.\r\n");
  122. $lastmessage = fgets($fp, 512);
  123. if(substr($lastmessage, 0, 3) != 250) {
  124. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) END - $lastmessage", 0);
  125. }
  126. fputs($fp, "QUIT\r\n");
  127. return true;
  128. } elseif($_G['setting']['mail']['mailsend'] == 3) {
  129. ini_set('SMTP', $_G['setting']['mail']['server']);
  130. ini_set('smtp_port', $_G['setting']['mail']['port']);
  131. ini_set('sendmail_from', $email_from);
  132. if(function_exists('mail') && @mail($email_to, $email_subject, $email_message, $headers)) {
  133. return true;
  134. }
  135. return false;
  136. }
  137. }
  138. function sendmail_cron($toemail, $subject, $message) {
  139. $toemail = addslashes($toemail);
  140. $query = DB::query("SELECT * FROM ".DB::table('common_mailcron')." WHERE email='$toemail' LIMIT 1");
  141. if($value = DB::fetch($query)) {
  142. $cid = $value['cid'];
  143. } else {
  144. $cid = DB::insert('mailcron', array('email'=>$toemail), 1);
  145. }
  146. $message = preg_replace("/href\=\"(?!http\:\/\/)(.+?)\"/i", 'href="'.$_G['siteurl'].'\\1"', $message);
  147. $setarr = array(
  148. 'cid' => $cid,
  149. 'subject' => addslashes($subject),
  150. 'message' => addslashes($message),
  151. 'dateline' => $_G['timestamp']
  152. );
  153. DB::insert('common_mailqueue', $setarr);
  154. return true;
  155. }
  156. function sendmail_touser($touid, $subject, $message, $mailtype='') {
  157. global $_G;
  158. if(empty($_G['setting']['sendmailday'])) return false;
  159. require_once libfile('function/home');
  160. $tospace = getspace($touid);
  161. if(empty($tospace['email'])) return false;
  162. space_merge($tospace, 'field_home');
  163. space_merge($tospace, 'status');
  164. $acceptemail = $tospace['acceptemail'];
  165. if(!empty($acceptemail[$mailtype]) && $_G['timestamp'] - $tospace['lastvisit'] > $_G['setting']['sendmailday']*86400) {
  166. if(empty($tospace['lastsendmail'])) {
  167. $tospace['lastsendmail'] = $_G['timestamp'];
  168. }
  169. $sendtime = $tospace['lastsendmail'] + $acceptemail['frequency'];
  170. $query = DB::query("SELECT * FROM ".DB::table('common_mailcron')." WHERE touid='$touid' LIMIT 1");
  171. if($value = DB::fetch($query)) {
  172. $cid = $value['cid'];
  173. if($value['sendtime'] < $sendtime) $sendtime = $value['sendtime'];
  174. DB::update('common_mailcron', array('email'=>addslashes($tospace['email']), 'sendtime'=>$sendtime), array('cid'=>$cid));
  175. } else {
  176. $cid = DB::insert('common_mailcron', array('touid'=>$touid, 'email'=>addslashes($tospace['email']), 'sendtime'=>$sendtime), 1);
  177. }
  178. $message = preg_replace("/href\=\"(?!http\:\/\/)(.+?)\"/i", 'href="'.$_G['siteurl'].'\\1"', $message);
  179. $setarr = array(
  180. 'cid' => $cid,
  181. 'subject' => addslashes($subject),
  182. 'message' => addslashes($message),
  183. 'dateline' => $_G['timestamp']
  184. );
  185. DB::insert('common_mailqueue', $setarr);
  186. return true;
  187. }
  188. return false;
  189. }
  190. ?>