mail.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:9k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. // +-------------------------------------------------------------+
  3. // | DeskPRO v [2.0.1 Production]
  4. // | Copyright (C) 2001 - 2004 Headstart Solutions Limited
  5. // | Supplied by WTN-WDYL
  6. // | Nullified by WTN-WDYL
  7. // | Distribution via WebForum, ForumRU and associated file dumps
  8. // +-------------------------------------------------------------+
  9. // | DESKPRO IS NOT FREE SOFTWARE
  10. // +-------------------------------------------------------------+
  11. // | License ID : Full Enterprise License =) ...
  12. // | License Owner : WTN-WDYL Team
  13. // +-------------------------------------------------------------+
  14. // | $RCSfile: mail.php,v $
  15. // | $Date: 2004/02/11 20:32:13 $
  16. // | $Revision: 1.39 $
  17. // +-------------------------------------------------------------+
  18. // | File Details:
  19. // | - Mail gateway handler and wrapper.
  20. // +-------------------------------------------------------------+
  21. error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
  22. define('GATEWAYZONE', 1);
  23. ############################### INCLUDE FILES ###############################
  24. require_once('functions.php');
  25. require_once(INCLUDE_PATH . 'config.php');
  26. require_once(INCLUDE_PATH . 'license.php');
  27. require_once(INCLUDE_PATH . 'functions/general_functions.php');
  28. require_once(INCLUDE_PATH . 'functions/fields_functions.php');
  29. require_once(INCLUDE_PATH . 'functions/mail/class_mimeDecode.php');
  30. require_once(INCLUDE_PATH . 'functions/mail/mailDecoding_functions.php');
  31. require_once(INCLUDE_PATH . 'functions/mail/class_RFC822.php');
  32. if (constant('DATABASE_TYPE') == 'mysql') {
  33. require_once(INCLUDE_PATH . 'functions/database/mysql.php');
  34. new_db_class();
  35. }
  36. ############################### SETTINGS + REPLACEMENTS ###############################
  37. get_settings();
  38. $use_smtp = $settings['use_smtp'];
  39. $smtp_settings['host'] = $settings['smtp_host'];
  40. $smtp_settings['port'] = $settings['smtp_port'];
  41. $smtp_settings['helo'] = $settings['smtp_helo'];
  42. $smtp_settings['auth'] = $settings['smtp_auth'];
  43. $smtp_settings['user'] = $settings['smtp_user'];
  44. $smtp_settings['pass'] = $settings['smtp_pass'];
  45. $db->query("SELECT * FROM template_words WHERE !language OR language = '$settings[default_language]'");
  46. while ($result = $db->row_array()) {
  47.     if ($result['language'] == '0') {
  48.         $default_lang[$result['wordref']] = trim($result['text']);
  49.     } elseif ($result['language'] == $settings['default_language']) {
  50.         $start_lang[$result['wordref']] = trim($result['text']);
  51.     } else {
  52.         $this_lang[$result['wordref']] = trim($result['text']);
  53.     }
  54. }
  55. $dplang = array_merge($this_lang, $start_lang);
  56. $dplang = array_merge($dplang, $default_lang);
  57. ############################### LANGUAGES ###############################
  58. $db->query("SELECT * FROM template_words WHERE language = '0' OR language = '$settings[default_language]'");
  59. while ($result = $db->row_array()) {
  60. if ($result[language] == '0') {
  61. $start_lang[$result[wordref]] = trim($result[text]);
  62. } elseif ($result[language] == $settings[default_language]) {
  63. $default_lang[$result[wordref]] = trim($result[text]);
  64. } else {
  65. $this_lang[$result[wordref]] = trim($result[text]);
  66. }
  67. }
  68. $dplang = array_merge($start_lang, $default_lang);
  69. $dplang = array_merge($dplang, $this_lang); 
  70. ############################### DEAL WITH EMAILS ###############################
  71. /*
  72. Emails are collected from the mechanism that the user sets and then are processed
  73. by the function process() which is set by the file that init.php is actually
  74. being called from
  75. */
  76. ////////////////////////////////////////////////////////////////////////////////
  77. // First, figure out how big messages can be. We subtract 2K from the database's
  78. // max_allowed_packet setting so there's no surprises.
  79. $max_size = $db->query_return("show variables like '%max_allowed_packet%'");
  80. $max_size = $max_size[1] - 2048;
  81. ////////////////////////////////////////////////////////////////////////////////
  82. // Next, sort out how long we have to run before we're gracelessly killed by
  83. // the PHP interpreter.
  84. $max_runtime = ini_get('max_execution_time');
  85. if ($max_runtime > 5) {
  86. if (($max_runtime * 0.05) > 5) {
  87. $max_runtime = $max_runtime * 0.95;
  88. } else {
  89. $max_runtime = $max_runtime - 5;
  90. }
  91. }
  92. //////////////////// PART 3 GET EMAIL (FILE METHOD) ////////////////////
  93. if (constant('GATEWAY_METHOD') == 'FILE') {
  94. /* 
  95. - no size tests are done here because FILE method is only used for testing
  96. - reads all the emails found in a directory
  97. */
  98. $dir = opendir(FILE_PATH);
  99. while ($file = readdir($dir)) {
  100. if (is_file(FILE_PATH . '/' . $file)) {
  101. $fp = fopen(FILE_PATH . '/' . $file, "r");
  102. $data = fread($fp, filesize(FILE_PATH . '/' . $file));
  103. print_rr(find_email($data));
  104. exit();
  105. process(decodeMail($data), $data);
  106. fclose($fp);
  107. echo "Procssed email $file<br />";
  108. }
  109. }
  110. }
  111. //////////////////// PART 3 GET EMAIL (PIPE METHOD) ////////////////////
  112. if (constant('GATEWAY_METHOD') == 'PIPE') {
  113. // check max pipe size setting to reduce max size - used to check on max attachment size
  114. if ($settings['max_message_size_pipe']) {
  115. if ($settings['max_message_size_pipe'] < $max_size) {
  116. $max_size = $settings['max_message_size_pipe'];
  117. }
  118. }
  119. // get the incoming data
  120. $data = get_pipe();
  121. // if the email is too big to process
  122. if ((strlen($data) > $max_size)) {
  123. // need to email the user asking them to send a smaller email
  124. $user['email'] == find_email($data);
  125. log_error('message_too_big');
  126. } else {
  127. process(decodeMail($data), $data);
  128. }
  129. }
  130. //////////////////// PART 3 GET EMAIL (POP3 METHOD) ////////////////////
  131. if (constant('GATEWAY_METHOD') == 'POP' or constant('GATEWAY_METHOD') == 'POP3') {
  132. // Constrain message size by admin setting for POP mail size maximum
  133. if ($settings['max_message_size_pop']) {
  134. if ($settings['max_message_size_pop'] < $max_size) {
  135. $max_size = $settings['max_message_size_pop'];
  136. }
  137. }
  138. $starttime = time();
  139. if (defined('TECHPOP')) {
  140. $target = 'tech';
  141. } elseif (defined('RETURNPOP')) {
  142. $target = 'return';
  143. } elseif (defined('TECHMAILPOP')) {
  144. $target = 'techmail';
  145. } else {
  146. $target = 'user';
  147. }
  148. $db->query("SELECT * FROM gateway_pop_accounts WHERE target = '$target'");
  149. while ($res = $db->row_array()) {
  150. $pop3_accounts[] = $res;
  151. $ids[$res['accountid']] = 1;
  152. }
  153. if (is_array($pop3_accounts)) {
  154. $ids = array2sql(array_keys($ids));
  155. $db->query("
  156. SELECT
  157. gateway_accounts.auto_new, gateway_accounts.auto_reply, gateway_accounts.email, 
  158. gateway_accounts.is_default, gateway_accounts.id,
  159. ticket_pri.id AS priority_id, ticket_pri.name AS priority, 
  160. ticket_cat.id AS category_id, ticket_cat.name AS category, 
  161. tech.id AS tech_id, tech.email AS tech_email
  162. FROM gateway_accounts
  163. LEFT JOIN ticket_pri ON (ticket_pri.id = gateway_accounts.priority)
  164. LEFT JOIN ticket_cat ON (ticket_cat.id = gateway_accounts.category)
  165. LEFT JOIN tech ON (tech.id = gateway_accounts.tech)
  166. WHERE gateway_accounts.id IN $ids
  167. ");
  168. while ($res = $db->row_array()) {
  169. $gateways[$res['id']] = $res;
  170. }
  171. require_once(INCLUDE_PATH . 'functions/pop3.php');
  172. foreach ($pop3_accounts AS $account) {
  173. // get the gateway account for user email collection
  174. $gateway = $gateways[$account['accountid']];
  175. // Connect
  176. global $pop;
  177. $pop = new POP_Socket(
  178. array(
  179. 'server' => $account['server'],
  180. 'port' => '110',
  181. 'username' => $account['username'],
  182. 'password' => $account['password'],
  183. 'deletemails' => 1
  184. )
  185. );
  186. // Skip this server if we can't connect or authenticate to it.
  187. if (!$pop->connect()) {
  188. log_pop_error("Couldn't connect to server");
  189. continue;
  190. }
  191. if (!$pop->auth()) {
  192. log_pop_error("Couldn't authenticate to server");
  193. continue;
  194. }
  195. if (!$pop->get_list()) {
  196. log_pop_error("Couldn't download message list");
  197. continue;
  198. }
  199. $pop_msgs = $pop->msgNums;
  200. foreach ($pop_msgs AS $msgid => $msgsize) {
  201. if (($max_runtime) AND (time() - $starttime) >= $max_runtime) {
  202. // If we're about to exceed the script's maximum runtime, quit processing and exit gracefully
  203. break;
  204. $break_now = 1;
  205. }
  206. if (($max_size) AND $msgsize > $max_size) {
  207. // Get the headers, log the failure in gateway_pop_failures
  208. $headers = '';
  209. if (!$pop->get_top($msgid, $headers, 50)) {
  210. log_pop_error("Couldn't retrieve headers for message $msgid");
  211. continue 2;
  212. } else {
  213. log_pop_error("Message $msgid too big; first 50 lines:n$headers");
  214. continue;
  215. }
  216. } else {
  217. $message = '';
  218. $pop->get_email($msgid, $message);
  219. if (!strlen($message)) {
  220. log_pop_error("Couldn't download message $msgid");
  221. continue 2;
  222. }
  223. if (process(decodeMail($message), $message, $gateway)) {
  224. // Message processed, can delete.
  225. if (!$pop->delete_email($msgid)) {
  226. log_pop_error("Couldn't delete message $msgid");
  227. continue 2;
  228. }
  229. }
  230. }
  231. if ($break_now) {
  232. break;
  233. }
  234. // Log out and finish up (note that emails will not be deleted until we get here
  235. $pop->close();
  236. }
  237. }
  238. }