PageRenderTime 40ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/source/function/function_mail.php

https://github.com/kuaileshike/upload
PHP | 254 lines | 211 code | 37 blank | 6 comment | 57 complexity | 5393c9b5cf4483cb47e52ff505cd743c 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 28969 2012-03-21 04:07:45Z zhangguosheng $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. set_time_limit(0);
  12. function sendmail($toemail, $subject, $message, $from = '') {
  13. global $_G;
  14. if(!is_array($_G['setting']['mail'])) {
  15. $_G['setting']['mail'] = dunserialize($_G['setting']['mail']);
  16. }
  17. $_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'] = '';
  18. if($_G['setting']['mail']['mailsend'] != 1) {
  19. $smtpnum = count($_G['setting']['mail']['smtp']);
  20. if($smtpnum) {
  21. $rid = rand(0, $smtpnum-1);
  22. $smtp = $_G['setting']['mail']['smtp'][$rid];
  23. $_G['setting']['mail']['server'] = $smtp['server'];
  24. $_G['setting']['mail']['port'] = $smtp['port'];
  25. $_G['setting']['mail']['auth'] = $smtp['auth'] ? 1 : 0;
  26. $_G['setting']['mail']['from'] = $smtp['from'];
  27. $_G['setting']['mail']['auth_username'] = $smtp['auth_username'];
  28. $_G['setting']['mail']['auth_password'] = $smtp['auth_password'];
  29. }
  30. }
  31. $message = preg_replace("/href\=\"(?!http\:\/\/)(.+?)\"/i", 'href="'.$_G['siteurl'].'\\1"', $message);
  32. $message = <<<EOT
  33. <html>
  34. <head>
  35. <meta http-equiv="Content-Type" content="text/html; charset=$_G[charset]">
  36. <title>$subject</title>
  37. </head>
  38. <body>
  39. $subject<br />
  40. $message
  41. </body>
  42. </html>
  43. EOT;
  44. $maildelimiter = $_G['setting']['mail']['maildelimiter'] == 1 ? "\r\n" : ($_G['setting']['mail']['maildelimiter'] == 2 ? "\r" : "\n");
  45. $mailusername = isset($_G['setting']['mail']['mailusername']) ? $_G['setting']['mail']['mailusername'] : 1;
  46. $_G['setting']['mail']['port'] = $_G['setting']['mail']['port'] ? $_G['setting']['mail']['port'] : 25;
  47. $_G['setting']['mail']['mailsend'] = $_G['setting']['mail']['mailsend'] ? $_G['setting']['mail']['mailsend'] : 1;
  48. if($_G['setting']['mail']['mailsend'] == 3) {
  49. $email_from = empty($from) ? $_G['setting']['adminemail'] : $from;
  50. } else {
  51. $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);
  52. }
  53. $email_to = preg_match('/^(.+?) \<(.+?)\>$/',$toemail, $mats) ? ($mailusername ? '=?'.CHARSET.'?B?'.base64_encode($mats[1])."?= <$mats[2]>" : $mats[2]) : $toemail;
  54. $email_subject = '=?'.CHARSET.'?B?'.base64_encode(preg_replace("/[\r|\n]/", '', '['.$_G['setting']['sitename'].'] '.$subject)).'?=';
  55. $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))))));
  56. $host = $_SERVER['HTTP_HOST'];
  57. $version = $_G['setting']['version'];
  58. $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}";
  59. if($_G['setting']['mail']['mailsend'] == 1) {
  60. if(function_exists('mail') && @mail($email_to, $email_subject, $email_message, $headers)) {
  61. return true;
  62. }
  63. return false;
  64. } elseif($_G['setting']['mail']['mailsend'] == 2) {
  65. if(!$fp = fsocketopen($_G['setting']['mail']['server'], $_G['setting']['mail']['port'], $errno, $errstr, 30)) {
  66. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) CONNECT - Unable to connect to the SMTP server", 0);
  67. return false;
  68. }
  69. stream_set_blocking($fp, true);
  70. $lastmessage = fgets($fp, 512);
  71. if(substr($lastmessage, 0, 3) != '220') {
  72. runlog('SMTP', "{$_G[setting][mail][server]}:{$_G[setting][mail][port]} CONNECT - $lastmessage", 0);
  73. return false;
  74. }
  75. fputs($fp, ($_G['setting']['mail']['auth'] ? 'EHLO' : 'HELO')." uchome\r\n");
  76. $lastmessage = fgets($fp, 512);
  77. if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
  78. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) HELO/EHLO - $lastmessage", 0);
  79. return false;
  80. }
  81. while(1) {
  82. if(substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
  83. break;
  84. }
  85. $lastmessage = fgets($fp, 512);
  86. }
  87. if($_G['setting']['mail']['auth']) {
  88. fputs($fp, "AUTH LOGIN\r\n");
  89. $lastmessage = fgets($fp, 512);
  90. if(substr($lastmessage, 0, 3) != 334) {
  91. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) AUTH LOGIN - $lastmessage", 0);
  92. return false;
  93. }
  94. fputs($fp, base64_encode($_G['setting']['mail']['auth_username'])."\r\n");
  95. $lastmessage = fgets($fp, 512);
  96. if(substr($lastmessage, 0, 3) != 334) {
  97. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) USERNAME - $lastmessage", 0);
  98. return false;
  99. }
  100. fputs($fp, base64_encode($_G['setting']['mail']['auth_password'])."\r\n");
  101. $lastmessage = fgets($fp, 512);
  102. if(substr($lastmessage, 0, 3) != 235) {
  103. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) PASSWORD - $lastmessage", 0);
  104. return false;
  105. }
  106. $email_from = $_G['setting']['mail']['from'];
  107. }
  108. fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  109. $lastmessage = fgets($fp, 512);
  110. if(substr($lastmessage, 0, 3) != 250) {
  111. fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  112. $lastmessage = fgets($fp, 512);
  113. if(substr($lastmessage, 0, 3) != 250) {
  114. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) MAIL FROM - $lastmessage", 0);
  115. return false;
  116. }
  117. }
  118. fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $toemail).">\r\n");
  119. $lastmessage = fgets($fp, 512);
  120. if(substr($lastmessage, 0, 3) != 250) {
  121. fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $toemail).">\r\n");
  122. $lastmessage = fgets($fp, 512);
  123. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) RCPT TO - $lastmessage", 0);
  124. return false;
  125. }
  126. fputs($fp, "DATA\r\n");
  127. $lastmessage = fgets($fp, 512);
  128. if(substr($lastmessage, 0, 3) != 354) {
  129. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) DATA - $lastmessage", 0);
  130. return false;
  131. }
  132. $timeoffset = $_G['setting']['timeoffset'];
  133. if(function_exists('date_default_timezone_set')) {
  134. @date_default_timezone_set('Etc/GMT'.($timeoffset > 0 ? '-' : '+').(abs($timeoffset)));
  135. }
  136. $headers .= 'Message-ID: <'.date('YmdHs').'.'.substr(md5($email_message.microtime()), 0, 6).rand(100000, 999999).'@'.$_SERVER['HTTP_HOST'].">{$maildelimiter}";
  137. fputs($fp, "Date: ".date('r')."\r\n");
  138. fputs($fp, "To: ".$email_to."\r\n");
  139. fputs($fp, "Subject: ".$email_subject."\r\n");
  140. fputs($fp, $headers."\r\n");
  141. fputs($fp, "\r\n\r\n");
  142. fputs($fp, "$email_message\r\n.\r\n");
  143. $lastmessage = fgets($fp, 512);
  144. if(substr($lastmessage, 0, 3) != 250) {
  145. runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) END - $lastmessage", 0);
  146. }
  147. fputs($fp, "QUIT\r\n");
  148. return true;
  149. } elseif($_G['setting']['mail']['mailsend'] == 3) {
  150. ini_set('SMTP', $_G['setting']['mail']['server']);
  151. ini_set('smtp_port', $_G['setting']['mail']['port']);
  152. ini_set('sendmail_from', $email_from);
  153. if(function_exists('mail') && @mail($email_to, $email_subject, $email_message, $headers)) {
  154. return true;
  155. }
  156. return false;
  157. }
  158. }
  159. function sendmail_cron($toemail, $subject, $message) {
  160. $toemail = addslashes($toemail);
  161. $value = C::t('common_mailcron')->fetch_all_by_email($toemail, 0, 1);
  162. $value = $value[0];
  163. if($value) {
  164. $cid = $value['cid'];
  165. } else {
  166. $cid = C::t('common_mailcron')->insert(array('email' => $toemail), true);
  167. }
  168. $message = preg_replace("/href\=\"(?!http\:\/\/)(.+?)\"/i", 'href="'.$_G['siteurl'].'\\1"', $message);
  169. $setarr = array(
  170. 'cid' => $cid,
  171. 'subject' => $subject,
  172. 'message' => $message,
  173. 'dateline' => $_G['timestamp']
  174. );
  175. C::t('common_mailqueue')->insert($setarr);
  176. return true;
  177. }
  178. function sendmail_touser($touid, $subject, $message, $mailtype='') {
  179. global $_G;
  180. if(empty($_G['setting']['sendmailday'])) return false;
  181. require_once libfile('function/home');
  182. $tospace = getuserbyuid($touid);
  183. if(empty($tospace['email'])) return false;
  184. space_merge($tospace, 'field_home');
  185. space_merge($tospace, 'status');
  186. $acceptemail = $tospace['acceptemail'];
  187. if(!empty($acceptemail[$mailtype]) && $_G['timestamp'] - $tospace['lastvisit'] > $_G['setting']['sendmailday']*86400) {
  188. if(empty($tospace['lastsendmail'])) {
  189. $tospace['lastsendmail'] = $_G['timestamp'];
  190. }
  191. $sendtime = $tospace['lastsendmail'] + $acceptemail['frequency'];
  192. $value = C::t('common_mailcron')->fetch_all_by_touid($touid, 0, 1);
  193. $value = $value[0];
  194. if($value) {
  195. $cid = $value['cid'];
  196. if($value['sendtime'] < $sendtime) $sendtime = $value['sendtime'];
  197. C::t('common_mailcron')->update($cid, array('email' => $tospace['email'], 'sendtime' => $sendtime));
  198. } else {
  199. $cid = C::t('common_mailcron')->insert(array(
  200. 'touid' => $touid,
  201. 'email' => $tospace['email'],
  202. 'sendtime' => $sendtime,
  203. ), true);
  204. }
  205. $message = preg_replace("/href\=\"(?!http\:\/\/)(.+?)\"/i", 'href="'.$_G['siteurl'].'\\1"', $message);
  206. $setarr = array(
  207. 'cid' => $cid,
  208. 'subject' => $subject,
  209. 'message' => $message,
  210. 'dateline' => $_G['timestamp']
  211. );
  212. C::t('common_mailqueue')->insert($setarr);
  213. return true;
  214. }
  215. return false;
  216. }
  217. ?>