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

电子政务应用

开发平台:

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: functions.php,v $
  15. // | $Date: 2004/02/11 01:28:14 $
  16. // | $Revision: 1.25 $
  17. // +-------------------------------------------------------------+
  18. // | File Details:
  19. // | - process() provider for user-mailed e-mails.
  20. // +-------------------------------------------------------------+
  21. error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
  22. /*****************************************************
  23. function spam_check
  24. -----DESCRIPTION: -----------------------------------
  25. - Lets check for spam
  26. *****************************************************/
  27. function spam_check($subject, $themessage) {
  28. global $db;
  29. $db->query("SELECT * FROM gateway_spam");
  30. while ($result = $db->row_array()) {
  31. // relevant info to check
  32. if (!$result[type]) {
  33. $text = $subject;
  34. } elseif ($result[type] == 1) {
  35. $text = $themessage;
  36. }
  37. // regex check
  38. if ($result['regex'] AND $result['textmatch']) {
  39. if (preg_match($result[textmatch], $text)) {
  40. if ($result['is_delete']) {
  41. return 'delete';
  42.  } else {
  43. return 'markspam';
  44. }
  45. }
  46. }
  47. // normal check
  48. if (!$result[regex] AND $result['textmatch']) {
  49. if (in_string($result[textmatch], $text)) {
  50. if ($result['is_delete']) {
  51. return 'delete';
  52.  } else {
  53. return 'markspam';
  54. }
  55. }
  56. }
  57. }
  58. return null;
  59. }
  60. /*****************************************************
  61. function extra_email
  62. -----DESCRIPTION: -----------------------------------
  63. - Sends a warning email to the user
  64. *****************************************************/
  65. function extra_email($type, $user_details) {
  66. global $ticket;
  67. $user_details = update_user_details($user_details);
  68. if ($type == 'license_expiry') {
  69. eval(makeemaileval('message', 'TECHBODY_license_expired', $subject, $ticket));
  70. $toemail = $settings['email_offemail'];
  71. dp_mail($settings['email_offemail'], $subject, $message);
  72. } else {
  73. eval(makeemaileval('message', 'BODY_email_warning', $subject, $ticket));
  74. dp_mail($user_details['email'], $subject, $message);
  75. }
  76. }
  77. /*****************************************************
  78. function get_pipe
  79. -----DESCRIPTION: -----------------------------------
  80. - Get data the is piped to script
  81. *****************************************************/
  82. function get_pipe() {
  83. global $settings;
  84. $fp = fopen('php://stdin', 'r');
  85. while(!feof($fp) ){
  86. $data .= fgets($fp, 4096);
  87. $size += 4096;
  88. if ($settings['max_message_size_pipe']) {
  89. if ($size > $settings['max_message_size_pipe']) {
  90. fclose($fp);
  91. log_error('message_too_big');
  92. exit;
  93. }
  94. }
  95. }
  96. fclose($fp);
  97. return $data;
  98. }
  99. /*****************************************************
  100. function log_pop_error
  101. -----DESCRIPTION: -----------------------------------
  102. - Logs any POP3 errors
  103. *****************************************************/
  104. function log_pop_error($error) {
  105. global $pop, $db;
  106. $error = $pop->serverinfo['server'] . ' (' . $pop->serverinfo['username'] . ') error: ' . $error;
  107. $db->query("
  108. INSERT INTO gateway_pop_failures SET 
  109. messageid = '" . addslashes($messageid) . "', 
  110. reason = '". addslashes($error) . "', 
  111. stamp = '" . mktime() . "'
  112. ");
  113. $pop->close();
  114. }
  115. /*****************************************************
  116. function store_mail
  117. -----DESCRIPTION: -----------------------------------
  118. - Store mail in gateway_source table
  119. *****************************************************/
  120. function store_mail($headers, $source) {
  121. global $db, $settings;
  122. $db->query("
  123. INSERT INTO gateway_source SET
  124. source = '" . mysql_escape_string($source) . "',
  125. headers = '" . mysql_escape_string(serialize($headers)) . "'
  126. ");
  127. return $db->last_id();
  128. }
  129. /*****************************************************
  130. function process_attachments
  131. -----DESCRIPTION: -----------------------------------
  132. - Deal with attachments
  133. *****************************************************/
  134. function process_attachments($attachments, $embedded, $ticketid='', $userid='') {
  135. global $user_fields, $ticket, $db;
  136. $attachments = array_merge($attachments, $embedded);
  137. if (is_array($attachments)) {
  138. foreach ($attachments AS $key => $attach) {
  139. $db->query("INSERT INTO blobs SET 
  140. blobdata = '" . mysql_escape_string($attach[data]) . "'
  141. ");
  142. $blobid = $db->last_id();
  143. $db->query("INSERT INTO ticket_attachments SET
  144. filename = '" . mysql_escape_string($attach[filename]) . "',
  145. filesize =  '" . strlen($attach[data]) . "',
  146. extension =  '" . mysql_escape_string($attach[extension]) . "',
  147. userid = '$userid',
  148. timestamp = '" . mktime() . "',
  149. ticketid = '$ticketid',
  150. blobid = '$blobid'
  151. ");
  152. $id = $db->last_id();
  153. // build array to send to techs
  154. $attachment_array[] = array(
  155. 'name' => $attach[filename],
  156. 'id' => $id,
  157. 'filesize' => strlen($attach[data]),
  158. 'extension' => $attach[extension],
  159. 'data' => $attach[data]
  160. );
  161. }
  162. }
  163. return $attachment_array;
  164. }
  165. ###################### FUNCTION find_email) #######################
  166. /*
  167. Finds the from email, email is passed by reference for performance reasons
  168. */
  169. function find_email(&$email) {
  170. $lines = explode("n", $email);
  171. for ($i=0; $i<count($lines); $i++) {
  172. if (preg_match("/^From: (.*)/", $lines[$i], $matches)) {
  173. return $matches[1];
  174. }
  175. }
  176. }
  177. ###################### FUNCTION log_error() #######################
  178. function log_error($error, &$message) {
  179. global $user, $ticketid, $sourceid, $db, $gateway, $settings, $new, $for_error;
  180. $email = trim(strtolower($message->fromEmail));
  181. $user_details = $user;
  182. $user_details['email'] = $email;
  183. /*
  184. - Logs errors
  185. - Reports certain errors to tech/admin to follow up
  186. - Sends email to user in some situations to inform them of the error
  187. - Sends the email from the email address they used (sales v support) if relevant (admin option)
  188. - Sends emails to techs to explain error
  189. - Sends emails to admin if there is a problem they need to fix straight away
  190. */
  191. $db->query("INSERT INTO gateway_error SET
  192. error = '" . mysql_escape_string($error) . "',
  193. timestamp = '" . mktime() . "',
  194. sourceid = '$sourceid'
  195. ");
  196. // By default, we assume we're *not* sending mail. The cases below can change
  197. // this. We also assume if we *are* sending mail, the amount of error mail we send
  198. // is also limited per hour
  199. $send_email = false;
  200. $max_emails = $settings['max_error_emails'];
  201. if ($error == 'no_gateway') {
  202. dp_mail(
  203. $settings[technical_email],
  204. 'IMPORTANT: DeskPRO Error', 
  205. 'This is an automated DeskPRO error. 
  206. You currently have no gateway accounts setup but you have email being processed by DeskPRO. This email will not be processed until you have created a gateway account. Instructions on doing this can be found in the admin manual found inside the docs folder in your distribution'
  207. );
  208. }
  209. switch ($error) {
  210. case 'no_email':
  211. case 'self_email':
  212. case 'invalid_email':
  213. case 'banned_email':
  214. case 'no_gateway':
  215. case 'gateway_email':
  216. case 'duplicate_subject':
  217. case 'no_ticketref':
  218. case 'duplicate_message':
  219. case 'no_tech':
  220. case 'spam':
  221. case 'no_user':
  222. case 'x-loop':
  223. // In these cases, we don't send any mail at all; either the mail is
  224. // spam, a forgery, or the administrator hasn't configured the mail
  225. // gateway yet. We don't have to actually do anything here except
  226. // to catch these cases so we don't send mail.
  227. $send_email = false;
  228. break;
  229. case 'no_message':
  230. // The message was empty.
  231. $email_template = 'BODY_error_new';
  232. $error_empty = 1;
  233. $send_email = true;
  234. break;
  235. case 'ticket_closed':
  236. // The ticket is closed.
  237. $email_template = 'BODY_error_reply';
  238. $error_closed = 1;
  239. $send_email = true;
  240. break;
  241. case 'bad_auth':
  242. // The ticket is closed.
  243. $email_template = 'BODY_error_reply';
  244. $error_auth = 1;
  245. $send_email = true;
  246. break;
  247. case 'user_expired':
  248. // The ticket is closed.
  249. $email_template = 'BODY_error_new';
  250. $error_expired = 1;
  251. $send_email = true;
  252. break;
  253. case 'new_user_limit':
  254. // Don't create any more tickes for this user. Probably autoresponding
  255. $send_email = false;
  256. break;
  257. case 'unregistered':
  258. // The sender's address isn't recognized and the admin has configured
  259. // DeskPro to require registration before submitting new tickets.
  260. $email_template = 'BODY_error_new';
  261. $error_unregistered = 1;
  262. $send_email = true;
  263. break;
  264. case 'autoresponds_reply':
  265. case 'autoresponder_reply':
  266. // The user has an autoresponder; if we keep sending mail, it'll just
  267. // keep getting bounced back to us.
  268. $db->query("UPDATE user SET autoresponds = 1 WHERE id = '$user[id]'");
  269. $send_email = false;
  270. break;
  271. case 'message_too_big':
  272. // message is too big (probably large attachments)
  273. $email_template = 'BODY_error_new';
  274. $send_email = true;
  275. $error_message_too_big = 1;
  276. break;
  277. case 'attachment_too_big':
  278. // One or more attachments were too long.
  279. if ($new == true) {
  280. $email_template = 'BODY_error_new';
  281. } else {
  282. $email_template = 'BODY_error_reply';
  283. }
  284. $send_email = true;
  285. $error_attachment_too_big = 1;
  286. break;
  287. case 'license_no_new_tickets':
  288. // The license prohibits more tickets
  289. $send_email = false;
  290. extra_email('license_expiry', $user);
  291. break;
  292. }
  293. if (defined('RETURNPOP')) {
  294. // We *NEVER* respond to bounces.
  295. $send_email = 0;
  296. }
  297. if ($send_email) {
  298. if (!defined('USERZONE')) {
  299. $email_template = 'TECHBODY_error_reply';
  300. }
  301. // Just a sanity check
  302. if (!$max_emails) { 
  303. $max_emails = 5;
  304. }
  305. // First we check whether we've already sent as many mails this hour to this
  306. // user as we're allowed.
  307. $day_time = time() - (60 * 60);
  308. $result = $db->query_return("
  309. SELECT COUNT(*) AS total
  310. FROM gateway_auto
  311. WHERE email = '" . mysql_escape_string($email) . "'
  312. AND type = '$error'
  313. AND timestamp > $day_time
  314. ");
  315. // send email if necessary
  316. if ($result['total'] < $max_emails) {
  317. $db->query("
  318. INSERT INTO gateway_auto SET
  319. email = '" . mysql_escape_string($email) . "',
  320. type = '$type',
  321. timestamp = " . mktime() . "
  322. ");
  323. $user_details = update_user_details($user_details);
  324. eval(makeemaileval('body', $email_template, $subject));
  325. dp_mail($email, $subject, $body);
  326. }
  327. }
  328. return false;
  329. }
  330. ?>