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

电子政务应用

开发平台:

Java

  1. #!/usr/bin/php -q
  2. <?php
  3. // +-------------------------------------------------------------+
  4. // | DeskPRO v [2.0.1 Production]
  5. // | Copyright (C) 2001 - 2004 Headstart Solutions Limited
  6. // | Supplied by WTN-WDYL
  7. // | Nullified by WTN-WDYL
  8. // | Distribution via WebForum, ForumRU and associated file dumps
  9. // +-------------------------------------------------------------+
  10. // | DESKPRO IS NOT FREE SOFTWARE
  11. // +-------------------------------------------------------------+
  12. // | License ID : Full Enterprise License =) ...
  13. // | License Owner : WTN-WDYL Team
  14. // +-------------------------------------------------------------+
  15. // | $RCSfile: tech.php,v $
  16. // | $Date: 2004/02/11 01:28:14 $
  17. // | $Revision: 1.60 $
  18. // +-------------------------------------------------------------+
  19. // | File Details:
  20. // | - process() provider for technician-mailed e-mails.
  21. // +-------------------------------------------------------------+
  22. error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
  23. //////////////////// PART 1 INCLUDES ////////////////////
  24. define('TECHPOP', 1);
  25. define('TECHZONE', 1);
  26. include("mail_config.php");
  27. include(INCLUDE_PATH . 'functions/admin-tech_functions.php');
  28. include("mail.php");
  29. ###################### FUNCTION PROCESS() #######################
  30. /* Deals with incoming tech email for reply creation
  31. $message: the email after it has been decoded (array of elements)
  32. $source : the source of the email
  33. $gateway: gateway info [optional]
  34. */
  35. function process(&$message, &$source, $gateway = NULL) {
  36. global $db, $settings, $template_cache, $output, $sourceid, $user;
  37. // rename a few variables for ease of access
  38. $email['from'] = trim($message->fromEmail);
  39. $headers = $message->headers;
  40. $subject = $headers['subject'];
  41. //////////////////////////////////////////////////////////////
  42. /* 1. STANDARD PROCESSING */
  43. //////////////////////////////////////////////////////////////
  44. // insert the full email
  45. $sourceid = store_mail($headers, $source);
  46. // we don't want to autorespond to another DeskPRO
  47. if (in_string('DeskPRO', $headers['X-Mailer'])) {
  48. log_error('sent_by_deskpro', $message);
  49. }
  50. // no valid return email (decoding functions look at various mail headers)
  51. if (!$email['from']) {
  52. log_error('no_email', $message);
  53. return true;
  54. }
  55. if (!(validate_email($email['from']))) {
  56. log_error('invalid_email', $message);
  57. return true;
  58. }
  59. // Handle e-mail bans. First, if this sender is banned, reject it.
  60. if (banned_email(strtolower($email['from']), $banned_emails)) {
  61. log_error('banned_email', $message);
  62. return true;
  63. }
  64. // Next, if the sender is ourselves, ignore the message (because that's
  65. // a common spam trick and we'll never be mailing ourselves anyway)
  66. if (strtolower($settings[email_from]) == strtolower($email['from'])) {
  67. log_error('self_email', $message);
  68. return true;
  69. }
  70. // check the email is not a gateway email, if so we will get autoresponder loops.
  71. $db->query("SELECT id FROM gateway_accounts WHERE email = '" . mysql_escape_string(strtolower($email['from'])) . "'");
  72. if ($db->num_rows() > 0) {
  73. log_error('gateway_email', $message);
  74. return true;
  75. }
  76. // check for text
  77. if ($message->text) {
  78. $body = $message->text;
  79. } elseif ($message->html) {
  80. $body = strip_tags($message->html);
  81. $strip_tags = 1;
  82. } else {
  83. log_error('no_message', $message);
  84. return true;
  85. }
  86. if (trim($body) == '') {
  87. log_error('no_message', $message);
  88. return true;
  89. }
  90. /*
  91. Lets find the ref
  92. i) subject line [AAAA-0000-AAAA]
  93. ii) code at the bottom of the email <=== AAAA-0000-AAAA ===>
  94. iii) XML options <TICKET>$ticket[ref]</TICKET>
  95. */
  96. // subject check
  97. if (ereg("[([0-9]{4}-[A-Za-z]{4}-[0-9]{4})]", $subject, $arr)) {
  98. $ticketref = $arr[1];
  99. // xml check
  100. } elseif (ereg("<TICKET>([0-9]{4}-[A-Za-z]{4}-[0-9]{4})</TICKET>", $body, $arr)) {
  101. $ticketref = $arr[1];
  102. // footer check
  103. } elseif (ereg("<=== ([0-9]{4}-[A-Za-z]{4}-[0-9]{4}) ===>", $body, $arr)) {
  104. $ticketref = $arr[1];
  105. }
  106. if (!$ticketref) {
  107. log_error('no_ticketref', $message);
  108. return true;
  109. }
  110. /*
  111. Lets find the authcode
  112. i) subject line (AAAA-0000-AAAA)
  113. ii) code at the bottom of the email <=== $ticket[authcode] ===>
  114. iii) XML options <AUTHCODE>$ticket[authcode]</AUTHCODE>
  115. */
  116. // subject check
  117. if (ereg("[([a-zA-Z0-9]{8})]", $subject, $arr)) {
  118. $ticketauth = $arr[1];
  119. // xml check
  120. } elseif (ereg("<AUTHCODE>([a-zA-Z0-9]{8})</AUTHCODE>", $body, $arr)) {
  121. $ticketauth = $arr[1];
  122. // footer check
  123. } elseif (ereg("<=== ([a-zA-Z0-9]{8}) ===>", $body, $arr)) {
  124. $ticketauth = $arr[1];
  125. }
  126. /*
  127. Lets find the tech
  128. i) XML options <AUTHCODE>$ticket[authcode]</AUTHCODE>
  129. ii) From the sender address
  130. */
  131. if (eregi("<TECH>(.*)</TECH>", $body, $arr)) {
  132. $tech_username = $arr[1];
  133. $user = $db->query_return("SELECT * FROM tech WHERE username = '" . addslashes($arr[1]) . "'");
  134. }
  135. if (!$db->num_rows()) {
  136. $user = $db->query_return("SELECT * FROM tech WHERE email LIKE '%$email[from]%'");
  137. }
  138. // we don't know who this tech is. 
  139. if (!is_array($user)) {
  140. log_error('no_tech', $message);
  141. return true;
  142. }
  143. // Get ticket information and check if it is valid
  144. $ticket = $db->query_return("
  145. SELECT 
  146. ticket.*, ticket_pri.id AS priority_id, ticket_pri.name AS priority_name, 
  147. ticket_cat.id AS category_id, ticket_cat.name AS category_name, 
  148. tech.id AS tech_id, tech.email AS tech_email
  149. FROM ticket
  150. LEFT JOIN ticket_pri ON (ticket.priority = ticket_pri.id)
  151. LEFT JOIN ticket_cat ON (ticket.category = ticket_cat.id)
  152. LEFT JOIN tech ON (ticket.tech = tech.id)
  153. WHERE ref = '" . addslashes($ticketref) . "'
  154. ");
  155. // no match, lets just check this ticket wastn't merged
  156. if (!$db->num_rows()) {
  157. $ticket = $db->query_return("SELECT * FROM ticket_merge WHERE old_ref = '$ticketref'");
  158. if ($ticket['new_id']) {
  159. $ticket = $db->query_return("
  160. SELECT 
  161. ticket.*, ticket_pri.id AS priority_id, ticket_pri.name AS priority_name, 
  162. ticket_cat.id AS category_id, ticket_cat.name AS category_name, 
  163. tech.id AS tech_id, tech.email AS tech_email
  164. FROM ticket
  165. LEFT JOIN ticket_pri ON (ticket.priority = ticket_pri.id)
  166. LEFT JOIN ticket_cat ON (ticket.category = ticket_cat.id)
  167. LEFT JOIN tech ON (ticket.tech = tech.id)
  168. WHERE ticket = '" . addslashes($ticket['new_id']) . "'
  169. ");
  170. }
  171. }
  172. //////////////////////////////////////////////////////////////
  173. /* 4. ERROR CHECKING */
  174. //////////////////////////////////////////////////////////////
  175. // is there a ticket?
  176. if (!is_array($ticket)) {
  177. log_error('no_ticket', $message);
  178. return true;
  179. }
  180. // check ticket is open
  181. if ($ticket[is_open] == "0" AND !$settings['gateway_ticket_reopen']) {
  182. log_error('ticket_closed', $message);
  183. return true;
  184. }
  185. if (($ticket['authcode']) AND ($ticket['authcode'] != $ticketauth)) {
  186. log_error('bad_authcode', $message);
  187. return true;
  188. }
  189. //////////////////////////////////////////////////////////////
  190. /* 4. ACTIONS */
  191. //////////////////////////////////////////////////////////////
  192. // close ticket
  193. if (eregi("<CLOSE TICKET>Yes</CLOSE TICKET>", $body) AND p_ticket('close', $ticket)) {
  194. $close = 1;
  195. }
  196. // remove ownership
  197. if (eregi("<REMOVE OWNERSHIP>Yes</REMOVE OWNERSHIP>", $body) AND p_ticket('edit', $ticket)) {
  198. $assign = 'remove';
  199. }
  200. // Taking ownership overrides removing ownership; just in case the tech tries to
  201. // be 'clever' and does both, we'll catch it
  202. if (eregi("<TAKE OWNERSHIP>Yes</TAKE OWNERSHIP>", $body) AND p_ticket('edit', $ticket)) {
  203. $assign = 'assign';
  204. }
  205. //////////////////////////////////////////////////////////////
  206. /* 6. AUTORESPONSE PROTECTION */
  207. //////////////////////////////////////////////////////////////
  208. // 1 hour
  209. $auto_time = mktime() - (3600 * 1);
  210. $result = $db->query_return(
  211. "SELECT COUNT(*) AS total FROM ticket_message
  212. WHERE ticketid = '$ticket[id]'
  213. AND date > $auto_time
  214. AND date > $ticket[date_lastreply_tech]
  215. ");
  216. // we have reached the max replies to tickets, generate error and stop processing
  217. if ($settings['max_reply']) {
  218. if ($result[total] > $settings['max_reply']) {
  219. log_error('autoresponder_reply', $message);
  220. return true;
  221. }
  222. }
  223. //////////////////////////////////////////////////////////////
  224. /* 7. IF SET BY ADMIN, ATTEMPT TO IGNORE PREVIOUS QUOTED REPLIES */
  225. //////////////////////////////////////////////////////////////
  226. if ($settings['gateway_reply_cut']) {
  227. // Look for our markers first.
  228. if (eregi('=== Enter your reply below this line ===(.*)=== Enter your reply above this line ===', $body, $arr)) {
  229. $body = $arr[1];
  230. if ($extra_quote = strrpos($body, '>')) {
  231. if ((strlen($body) - $extra_quote) < 5) {
  232. $body = substr($body, 0, $extra_quote);
  233. }
  234. }
  235. } elseif ($body_tmp = preg_replace('/^----- Original Message -----.*^From.*^To:.*^Sent:.*^Subject:.*$/imsU', '', $data)) {
  236. $body = trim($body_tmp);
  237. }
  238. if ($end) {
  239. // We do $end - 3 here because "usually" mail clients do quotes like this:
  240. // > original message
  241. // That's a quote marker, a space, then the text. We want to kill those two
  242. // characters, plus the newline preceeding them. This has a slight chance of
  243. // deleting the last character in the reply if the quote isn't shown by two
  244. // characters, or if it's otherwise malformed.
  245. $body = substr($body, 0, ($end - 3));
  246. if (trim($body == '')) {
  247. log_error('no_message', $message);
  248. return true;
  249. }
  250. }
  251. }
  252. //////////////////////////////////////////////////////////////
  253. /* 8. ADD REPLY TO TICKET */
  254. //////////////////////////////////////////////////////////////
  255. if (!p_ticket('edit', $ticket)) {
  256. log_error('no_permission', $message);
  257. return true;
  258. }
  259. // add the new post to database
  260. $db->query("INSERT into ticket_message SET
  261. message = '" . mysql_escape_string($body) . "',
  262. ticketid = '$ticket[id]',
  263. striptags = '$striptags',
  264. sourceid = '$sourceid',
  265. date = '" . mktime() . "',
  266. techid = '$user[id]'
  267. ");
  268. $ticket['body'] = $body;
  269. ticketlog($ticket['id'], 'tech_replied'); 
  270. //////////////////////////////////////////////////////////////
  271. /* 9. UPDATE TICKET */
  272. //////////////////////////////////////////////////////////////
  273. $db->query("
  274. UPDATE ticket SET
  275. awaiting_tech = '0',
  276. date_awaiting_toggled = '" . mktime() . "',
  277. is_open = '" . iff($close, 0, 1) . "', ".
  278. iff($assign == 'assign', "tech = '$user[id]',") .
  279. iff($assign == 'remove', "tech = '0',") . "
  280. date_lastreply_tech = '" . mktime() . "'
  281. WHERE id = $ticket[id]
  282. ");
  283. if ($assign OR $close) {
  284. $ticket['action'] = 1;
  285. if ($assign == 'assign') {
  286. $ticket['assign'] = 1;
  287. ticketlog($ticket['id'], 'tech', $ticket[tech], $user[id]);
  288. } elseif ($assign == 'remove') {
  289. $ticket['remove'] = 1;
  290. ticketlog($ticket['id'], 'tech', $ticket[tech], 0);
  291. }
  292. if ($close) {
  293. $ticket['close'] = 1;
  294. ticketlog($ticket['id'], 'close');
  295. }
  296. }
  297. //////////////////////////////////////////////////////////////
  298. /* 10. PROCESS ATTACHMENTS */
  299. //////////////////////////////////////////////////////////////
  300. $attachments = process_attachments($message->attachments, $message->embedded, $ticket[id], $user[id]);
  301. // Limit quoted message to 16k at most
  302. $message = substr($body, NULL, 16384);
  303. //////////////////////////////////////////////////////////////
  304. /* 11. SEND EMAIL TO USERS */
  305. //////////////////////////////////////////////////////////////
  306. $ticket['category'] = $ticket['category_name'];
  307. $ticket['priority'] = $ticket['priority_name'];
  308. $ticket_user = $db->query_return("SELECT * FROM user WHERE id = $ticket[userid]");
  309. notify_user('reply_tech', $ticket, $ticket_user, $message, $attachments, $ticket[gatewayid]);
  310. return true;
  311. }
  312. ?>