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

电子政务应用

开发平台:

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: user.php,v $
  16. // | $Date: 2004/02/11 20:32:13 $
  17. // | $Revision: 1.108 $
  18. // +-------------------------------------------------------------+
  19. // | File Details:
  20. // | - process() provider for user-mailed e-mails.
  21. // +-------------------------------------------------------------+
  22. error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
  23. //////////////////// PART 1 INCLUDES ////////////////////
  24. define('USERZONE', 1);
  25. include("mail_config.php");
  26. include("mail.php");
  27. ###################### FUNCTION PROCESS() #######################
  28. /*
  29. Deals with incoming user email for new ticket and reply creation
  30. $message: the email after it has been decoded (array of elements)
  31. $source : the source of the email
  32. $gateway: array containing gateway information (for POP3); if not
  33. provided, we try to figure it out ourselves here.
  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(strtolower($message->fromEmail));
  39. $for_error = $email['from'];
  40. $headers = $message->headers;
  41. $subject = $headers['subject'];
  42. //////////////////////////////////////////////////////////////
  43. /* 1. STANDARD PROCESSING INDEPENDANT OF REPLY / NEW TICKET */
  44. //////////////////////////////////////////////////////////////
  45. // insert the full email
  46. $sourceid = store_mail($headers, $source);
  47. // no valid return email (decoding functions look at various mail headers)
  48. if (!$email['from']) {
  49. log_error('no_email', $message);
  50. return true;
  51. }
  52. // the from email is invalid
  53. if (!(validate_email($email['from']))) {
  54. log_error('invalid_email', $message);
  55. return true;
  56. }
  57. // Handle e-mail bans. First, if this sender is banned, reject it.
  58. if (banned_email($email['from'])) {
  59. log_error('banned_email', $message);
  60. return true;
  61. }
  62. // Next, if the sender is ourselves, ignore the message (because that's
  63. // a common spam trick and we'll never be mailing ourselves anyway)
  64. if (strtolower($settings[email_from]) == $email['from']) {
  65. log_error('self_email', $message);
  66. return true;
  67. }
  68. // check the email is not a gateway email, if so we will get autoresponder loops.
  69. // Note this does not stop the problem where an email address is sent to user.php but
  70. // there is no gateway account for it.
  71. $db->query("
  72. SELECT id 
  73. FROM gateway_accounts 
  74. WHERE email = '" . mysql_escape_string($email['from']) . "'
  75. ");
  76. if ($db->num_rows() > 0) {
  77. log_error('gateway_email', $message);
  78. return true;
  79. }
  80. // check there actually is some text. We first use the text portion of the email, but if that is empty
  81. // we use the HTML portion
  82. if (trim($message->text) != '') {
  83. $body = $message->text;
  84. } elseif (trim($message->html != '')) {
  85. $body = $message->html;
  86. } else {
  87. log_error('no_message', $message);
  88. return true;
  89. }
  90. // Stops us looping with other mail software
  91. if ($headers['x-loop-detect'] == 3) {
  92. $no_autoresponse = 1;
  93. } elseif ($headers['x-loop-detect'] == 5) {
  94. log_error('x-loop', $message);
  95. return true;
  96. }
  97. // Incremement the x-loop-detect
  98. $extra_mail_info['headers']['X-Loop-Detect'] = (int)$headers['X-Loop-Detect'];
  99. $extra_mail_info['headers']['X-Loop-Detect']++;
  100. // we don't want to autorespond to another DeskPRO
  101. if (in_string('DeskPRO', $headers['X-Mailer'])) {
  102. $no_autoresponse = 1;
  103. }
  104. //////////////////////////////////////////////////////////////
  105. /* 2. REPLY v NEW TICKET    */
  106. //////////////////////////////////////////////////////////////
  107. /*
  108. Need to check which ticket this is
  109. i) a dp1.x email, for those upgrade
  110. ii) [AAAA-0000-AAAA] [xxxxxxxx] in subject
  111. iii) <=== Ticket Ref AAAA-0000-AAAA ===> / <=== $ticket[authcode] ===>
  112. */
  113. // dp1 check, we have the ticketid not ref and the auth code
  114. if (ereg("[([0-9].*)--([A-Za-z0-9]{8})]", $subject, $arr)) {
  115. $new = false;
  116. $ticketid = $arr[1];
  117. $ticketauth = $arr[2];
  118. // get the ref from the id
  119. $result = $db->query_return("SELECT ref FROM ticket WHERE id = '" . addslashes($ticketid) . "'");
  120. $ticketref = $result['ref'];
  121. } else {
  122. // not dp1, now we need to run the checks to get ticketref/authcode, both are needed
  123. // subject check
  124. if (ereg("[([0-9]{4}-[A-Za-z]{4}-[0-9]{4})]", $subject, $arr)) {
  125. $ticketref = $arr[1];
  126. // footer check
  127. } elseif (ereg("<=== ([0-9]{4}-[A-Za-z]{4}-[0-9]{4}) ===>", $body, $arr)) {
  128. $ticketref = $arr[1];
  129. // nothing found, we are creating a new ticket
  130. }
  131. // subject check
  132. if (ereg("[([a-zA-Z0-9]{8})]", $subject, $arr)) {
  133. $ticketauth = $arr[1];
  134. // footer check
  135. } elseif (ereg("<=== ([a-zA-Z0-9]{8}) ===>", $body, $arr)) {
  136. $ticketauth = $arr[1];
  137. }
  138. }
  139. // We have got ticketid / ref lets check they exist
  140. // if not then we need to create a new ticket
  141. if ($ticketref) {
  142. $ticket = get_ticket_from_ref($ticketref);
  143. // ticket not found, check if ticket was merged
  144. if (!is_array($ticket)) {
  145. $ticket = $db->query_return("
  146. SELECT * FROM ticket_merge 
  147. WHERE old_ref = '" . addslashes($ticketref) . "'
  148. ");
  149. if ($ticket['new_id']) {
  150. $ticket = get_ticket_from_ref($ticket['new_id']);
  151. }
  152. }
  153. }
  154. if (is_array($ticket)) {
  155. $do = 'reply';
  156. } else {
  157. $do = 'new';
  158. // unset any variables we have set
  159. unset($ticketref, $authcode, $ticketid, $result);
  160. // need to remove any current ticket refs / auths from the subject
  161. $subject = ereg_replace("[[a-zA-Z0-9]{8}]", "", $subject);
  162. $subject = ereg_replace("[([0-9]{4}-[A-Za-z]{4}-[0-9]{4})]", "", $subject);
  163. }
  164. //////////////////////////////////////////////////////////////
  165. /* GET GATEWAY DETAILS */
  166. //////////////////////////////////////////////////////////////
  167. if (!is_array($gateway)) {
  168. $gateway = $db->query_return("
  169. SELECT 
  170. gateway_accounts.auto_new, gateway_accounts.auto_reply, gateway_accounts.email, 
  171. gateway_accounts.is_default, gateway_accounts.id,
  172. ticket_pri.id AS priority_id, ticket_pri.name AS priority, 
  173. ticket_cat.id AS category_id, ticket_cat.name AS category, 
  174. tech.id AS tech_id, tech.email AS tech_email
  175. FROM gateway_accounts
  176. LEFT JOIN ticket_pri ON (ticket_pri.id = gateway_accounts.priority)
  177. LEFT JOIN ticket_cat ON (ticket_cat.id = gateway_accounts.category)
  178. LEFT JOIN tech ON (tech.id = gateway_accounts.tech)
  179. WHERE gateway_accounts.email IN " . array2sql($message->recipientAddresses) . "
  180. OR gateway_accounts.is_default = 1
  181. ORDER BY is_default ASC
  182. LIMIT 0,1
  183. ");
  184. if (!$db->num_rows()) {
  185. // if admin has not created a gateway account
  186. log_error('no_gateway', $message);
  187. return false;
  188. }
  189. }
  190. // spam check
  191. if ($spam_check = spam_check($subject, $body)) {
  192. if ($spam_check == 'delete') {
  193. log_error('spam', $message);
  194. return true;
  195. } else {
  196. $is_spam = 1;
  197. }
  198. }
  199. #############################################################################################
  200.   // NEW TICKET //
  201. if ($do == 'new') {
  202. if (!max_limits('tickets', 1)) {
  203. log_error('license_no_new_tickets', $message);
  204. return true;
  205. }
  206. //////////////////////////////////////////////////////////////
  207. /* 3. CREATE USER IF DOES NOT ALREADY EXIST */
  208. //////////////////////////////////////////////////////////////
  209. // get user fields
  210. $user = $db->query_return("SELECT * FROM user WHERE email = '$email[from]'");
  211. if (!$db->num_rows()) {
  212. $userid = $db->query_return("SELECT userid FROM user_email WHERE email = '$email[from]'");
  213. if ($db->num_rows()) {
  214. $user = $db->query_return("SELECT * FROM user WHERE id = '$userid[userid]'");
  215. }
  216. }
  217. if (!is_array($user)) {
  218. // fail if no user and require regisration
  219. if ($settings[gateway_require_reg] == "1") {
  220. log_error('unregistered', $message);
  221. return true;
  222. }
  223. // Get the sender's name
  224. $fromemaillastspace = strrpos($headers['from'], ' ');
  225. $fromname = trim(substr($headers['from'], 0, $fromemaillastspace - strlen($headers['from'])), " rntx0b"'");
  226. // create user
  227. $password =  make_pass(8);
  228. $password_cookie = md5($session[sessionid] . $password . uniqid(rand(),1));
  229. $password_cookie = substr($password_cookie, 0, 8);
  230. $password_url = md5($password . uniqid(rand(),1) . $session[sessionid]);
  231. $password_url = substr($password_url, 0, 8);
  232. $username = make_username($email['from']);
  233. // require email validation
  234. if ($settings[validate_email]) {
  235. $validate_number = substr(md5(time()),0,6);
  236. $user_query .= " validate_key = '$validate_number', awaiting_validation = 1, ";
  237. $nodisplay = 2;
  238. }
  239. if ($settings[manual_validation]) {
  240. $user_query .= " awaiting_manual_validation = '1', ";
  241. $nodisplay = 3;
  242. }
  243. $db->query("
  244. INSERT into user SET
  245. $user_query
  246. name = '" . mysql_escape_string($fromname) . "',
  247. password = '" . mysql_escape_string($password) . "',
  248. username = '" . mysql_escape_string($username) . "',
  249. email = '" . mysql_escape_string($email['from']) . "', 
  250. password_url = '" . mysql_escape_string($password_url) . "',
  251. password_cookie = '" . mysql_escape_string($password_cookie) . "',
  252. date_registered = '" . mktime() . "'
  253. ");
  254. $id = $db->last_id();
  255. $user = $db->query_return("SELECT * FROM user WHERE id = '$id'");
  256. $new_user = true;
  257. }
  258. //////////////////////////////////////////////////////////////
  259. /* 4. CHECK TICKETS FOR DUPLICATION */
  260. //////////////////////////////////////////////////////////////
  261. // no point running duplication checks if we have just created the user
  262. if (!$new_user) {
  263. /* 
  264. - checks for identical subjects in last 24 hours:
  265. i) if 3, we process ticket but also email the user explaining they can't do it again
  266. ii) if 4, we don't process the message
  267. - checks for identical bodies in the last 24 hours:
  268. i) any email with identical body is ignored. These is no reason to send two identical emails
  269. These protections:
  270. a) catch autoresponder messages that change the subject/body of the message
  271. and thus look like new tickets. If they do this then it is likely that the message
  272. that will be sent will be identical (e.g. vacation reply) and thus should be ignored.
  273. b) An identical message is always going to be useless, an identical subject can be the result
  274. of two different emails hence the warning and higher limit
  275. */
  276. // subject check in last 6 hours
  277. $time_expire = mktime() - (3600 * 6);
  278. $result = $db->query_return("
  279. SELECT count(*) AS total
  280. FROM ticket
  281. WHERE ticket.userid = '$user[id]'
  282. AND ticket.date_opened > '$time_expire'
  283. AND subject = '" . addslashes($subject) . "'
  284. ");
  285. // if this is the 3rd identical email we need to inform the user they need to change subject
  286. if ($result['total'] == 2) {
  287. extra_email('duplicate_subject', $user);
  288. }
  289. if ($result['total'] > 2) {
  290. log_error('duplicate_subject', $message);
  291. return true;
  292. }
  293. // subject check in last 24 hours
  294. $time_expire = mktime() - (3600 * 24);
  295. $db->query("SELECT ticket.subject, ticket_message.message
  296. FROM ticket
  297. LEFT JOIN ticket_message ON (ticket.id = ticket_message.ticketid)
  298. WHERE ticket.userid = $user[id] AND ticket_message.userid = $user[id]
  299. AND (ticket.date_opened > '$time_expire')
  300. OR (ticket_message.date > '$time_expire')
  301. ");
  302. while ($result = $db->row_array()) {
  303. if ($result[message] == $body) {
  304. log_error('duplicate_message', $message);
  305. return true;
  306. }
  307. }
  308. /*
  309. - check number of tickets created by user in certain amount of time
  310. i) if we reach warning amount, tell user and mark as autoresponder
  311. ii) too many we just stop processing
  312. This protection: 
  313. a) another check on autoresponding users. This is useful when the autoresponder 
  314. changes the email to remove the subject and body but makes the message unique (e.g. with a timestamp on outgoing). This is increasingly common with lines such as Thank you for your email received xxxx.
  315. b) Tolerances should be set relativly low to ensure that a user who just sends 5 
  316. new tickets very rapidly is not penialised.
  317. c) The setting of the autoresponder status stops an autoresponder causing the problem.
  318. The only reason that we should get more emails after that is if someone is on purpose trying to send a lot of emails from one email account. This emails would not be valid (as the user is warned)
  319. */
  320. // 1 hour window
  321. $time_expire = mktime() - (3600 * 1);
  322. $result = $db->query_return("
  323. SELECT COUNT(*) AS total
  324. FROM ticket
  325. WHERE userid = '$user[id]'
  326. AND date_opened > '$time_expire'
  327. ");
  328. // we have reached the max new tickets, generate error and stop processing
  329. if ($settings['max_new']) {
  330. if ($result[total] > $settings['max_new']) {
  331. log_error('new_user_limit', $message);
  332. return true;
  333. }
  334. }
  335. // if we have reached warning amount of new tickets, mark as autoresponder and send warning email
  336. if ($settings['max_new_warning']) {
  337. if ($result[total] > $settings['max_new_warning']) {
  338. $db->query("
  339. UPDATE user SET autoresponds = 1 
  340. WHERE id = '$user[id]'
  341. ");
  342. extra_email('too_many_new_tickets', $user);
  343. }
  344. }
  345. }
  346. //////////////////////////////////////////////////////////////
  347. /* 5. CREATE TICKET */
  348. //////////////////////////////////////////////////////////////
  349. $exp = user_expired($user['id']);
  350. if (is_array($exp)) {
  351. log_error('user_expired', $message);
  352. return true;
  353. }
  354. $ref = make_ticket_ref();
  355. // set a nodisplay if spam or user requires validation
  356. if (!$nodisplay) {
  357. if ($is_spam) {
  358. $nodisplay = 1;
  359. }
  360. }
  361. $authcode = substr(md5(rand(0,100000) . mktime()), 0, 8);
  362. // ticket query
  363. $db->query("
  364. INSERT INTO ticket SET
  365. subject = '" . mysql_escape_string($subject) . "',
  366. date_opened = '" . mktime() . "',
  367. is_open = '1',
  368. awaiting_tech = '1',
  369. date_awaiting_toggled = '" . mktime() . "',
  370. userid = '$user[id]',
  371. category = '$gateway[category_id]',
  372. priority = '$gateway[priority_id]',
  373. tech = '$gateway[tech]',
  374. gatewayid = '$gateway[id]',
  375. ref = '$ref',
  376. authcode = '$authcode',
  377. nodisplay = '$nodisplay'
  378. ");
  379. $id = $db->last_id();
  380. ticketlog($id, 'created');
  381. $ticket = $db->query_return("
  382. SELECT ticket.*
  383. FROM ticket 
  384. WHERE ticket.id = '$id'
  385. ");
  386. // add the processed message
  387. $db->query("
  388. INSERT into ticket_message SET
  389. message = '" . mysql_escape_string($body) . "',
  390. ticketid = '$id',
  391. sourceid = '$sourceid',
  392. date = '" . mktime() . "',
  393. striptags = '$striptags',
  394. userid = '$user[id]'
  395. ");
  396. $ticket['body'] = $body;
  397. if ($new_user) {
  398. $ticket['newuser'] = 1;
  399. $ticket['username'] = $user['username'];
  400. $ticket['password'] = $user['password'];
  401. }
  402. //////////////////////////////////////////////////////////////
  403. /* 6. PROCESS ATTACHMENTS */
  404. //////////////////////////////////////////////////////////////
  405. $email_attachments = process_attachments($message->attachments, $message->embedded, $ticket[id], $user[id]);
  406. //////////////////////////////////////////////////////////////
  407. /* 7. SEND EMAIL TO USERS */
  408. //////////////////////////////////////////////////////////////
  409. // Trim message to be quoted in response e-mail to 16k at most
  410. $message = substr($body, NULL, 16384);
  411. /* send email if:
  412. i) set up for this gateway account
  413. ii) the user does not autorespond
  414. iii) there is not something about the specific email that makes us want to not autorespond
  415. */
  416. if ($gateway['auto_new'] AND !$user['autoresponds'] AND !$no_autoresponse) {
  417. notify_user('new_user', $ticket, $user, $message, $email_attachments, $gateway[id], $extra_mail_info);
  418. }
  419. //////////////////////////////////////////////////////////////
  420. /* 8. SEND EMAL TO TECHS */
  421. //////////////////////////////////////////////////////////////
  422. notify_technicians('new', $ticket, $user, $message, $email_attachments, $gateway[id], $extra_mail_info);
  423. return true;
  424. #############################################################################################
  425.   // TICKET REPLY //
  426. if ($do == 'reply') {
  427. //////////////////////////////////////////////////////////////
  428. /* 3. PROCESS / ERROR CHECKING */
  429. //////////////////////////////////////////////////////////////
  430. // check ticket auth is correct
  431. if ($ticket['authcode'] != $ticketauth) {
  432. log_error('bad_auth', $message);
  433. return true;
  434. }
  435. // check ticket is open
  436. if ($ticket[is_open] == "0" AND !$settings['gateway_ticket_reopen']) {
  437. log_error('ticket_closed', $message);
  438. return true;
  439. }
  440. //////////////////////////////////////////////////////////////
  441. /* 4. GET USER DATA */
  442. //////////////////////////////////////////////////////////////
  443. // check the user hastn't been deleted
  444. $user = $db->query_return("
  445. SELECT * FROM user 
  446. WHERE id = '$ticket[userid]'
  447. ");
  448. if (!$db->num_rows()) {
  449. log_error('no_user', $message);
  450. return true;
  451. }
  452. $user['email'] = $email['from'];
  453. //////////////////////////////////////////////////////////////
  454. /* 5. AUTORESPONSE PROTECTION */
  455. //////////////////////////////////////////////////////////////
  456. /* 
  457. - check for too many replies to the ticket in unit time.
  458. i) firstly we email the user and stop autoresponding
  459. ii) we stop processing the emails at all
  460. This protection:
  461. a) An autoresponder that changes the message will be stopped once the limits are reached. Note  that the limit is reset if a tech replies so that a quick conversation is possible
  462. */
  463. // 1 hour
  464. $auto_time = mktime() - (3600 * 1);
  465. $result = $db->query_return(
  466. "SELECT COUNT(*) AS total FROM ticket_message
  467. WHERE ticketid = '$ticket[id]'
  468. AND date > $auto_time
  469. AND date > $ticket[date_lastreply_tech]
  470. ");
  471. // we have reached the max new replies to tickets, generate error and stop processing
  472. if ($settings['max_reply']) {
  473. if ($result[total] > $settings['max_reply']) {
  474. log_error('autoresponder_reply', $message);
  475. return true;
  476. }
  477. }
  478. // if we have reached warning amount number of ticket replies, mark as autoresponder and send warning email
  479. if ($settings['max_reply_warning']) {
  480. if ($result[total] > $settings['max_reply_warning']) {
  481. $db->query("
  482. UPDATE user SET autoresponds = 1 
  483. WHERE id = '$user[id]'
  484. ");
  485. extra_email('too_many_replies', $user);
  486. }
  487. }
  488. //////////////////////////////////////////////////////////////
  489. /* 6. IF SET BY ADMIN, ATTEMPT TO IGNORE PREVIOUS QUOTED REPLIES */
  490. //////////////////////////////////////////////////////////////
  491. if ($settings['gateway_reply_cut']) {
  492. $gateway_cut = $db->query_return_array("SELECT text FROM template_words WHERE wordref = 'gateway_reply_cut'");
  493. if (!is_array($gateway_cut)) {
  494. $gateway_cut = array();
  495. }
  496. foreach ($gateway_cut AS $var) {
  497. if (trim($var) != '') {
  498. // position of the start of the quote
  499. $end = strpos($body, $var['text']);
  500. if ($end) {
  501. // We do $end - 3 here because "usually" mail clients do quotes like this:
  502. // > original message
  503. // That's a quote marker, a space, then the text. We want to kill those two
  504. // characters, plus the newline preceeding them. This has a slight chance of
  505. // deleting the last character in the reply if the quote isn't shown by two
  506. // characters, or if it's otherwise malformed.
  507. $body = substr($body, 0, ($end - 3));
  508. if (trim($body == '')) {
  509. log_error('no_message', $message);
  510. return true;
  511. }
  512. }
  513. }
  514. }
  515. }
  516. //////////////////////////////////////////////////////////////
  517. /* 5. AUTORESPONSE PROTECTION */
  518. //////////////////////////////////////////////////////////////
  519. /* 
  520. - check for identical message to the ticket in the last hour (with the identical message being  the last one in the ticket, so we can allow for two "Yes" replies for example. This has to be  done after "cutting" of any extra quoted content
  521. i) the email is error logged
  522. These protections:
  523. a) catch autoresponders that send identical emails, once one autoresponse has been added, the 2nd  one would be ignored if it was identical
  524. */
  525. // 1 hour
  526. $auto_time = mktime() - (3600 * 1);
  527. // duplication check
  528. $db->query("SELECT ticket_message.id
  529. FROM ticket_message
  530. WHERE ticket_message.userid = $user[id]
  531. AND ticket_message.date > '$time_expire'
  532. AND date > '$ticket[date_lastreply_tech]'
  533. ");
  534. while ($result = $db->row_array()) {
  535. if ($result[message] == $body) {
  536. log_error('duplicate_message', $message);
  537. return true;
  538. }
  539. }
  540. //////////////////////////////////////////////////////////////
  541. /* 7. ADD REPLY TO TICKET */
  542. //////////////////////////////////////////////////////////////
  543. // add the new post to database
  544. $db->query("INSERT into ticket_message SET
  545. message = '" . mysql_escape_string($body) . "',
  546. ticketid = '$ticket[id]',
  547. striptags = '$striptags',
  548. sourceid = '$sourceid',
  549. date = '" . mktime() . "',
  550. userid = '$ticket[userid]'
  551. ");
  552. $ticket['body'] = $body;
  553. ticketlog($ticket['id'], 'user_replied'); 
  554. //////////////////////////////////////////////////////////////
  555. /* 8. UPDATE TICKET */
  556. //////////////////////////////////////////////////////////////
  557. $db->query("
  558. UPDATE ticket SET
  559. awaiting_tech = '1',
  560. date_awaiting_toggled = '" . mktime() . "',
  561. is_open = '1',
  562. date_lastreply = '" . mktime() . "'
  563. WHERE id = $ticket[id]
  564. ");
  565. //////////////////////////////////////////////////////////////
  566. /* 9. PROCESS ATTACHMENTS */
  567. //////////////////////////////////////////////////////////////
  568. $email_attachments = process_attachments($message->attachments, $message->embedded, $ticket[id], $user[id]);
  569. // Trim message to be quoted in return e-mail to 16k at most
  570. $message = substr($body, NULL, 16384);
  571. //////////////////////////////////////////////////////////////
  572. /* 10. SEND EMAIL TO USERS */
  573. //////////////////////////////////////////////////////////////
  574. if ($gateway[auto_reply] AND !$user[autoresponds] AND !$no_autoresponse) {
  575. notify_user('reply_user', $ticket, $user, $message, '', $gateway[id], $extra_mail_info);
  576. }
  577. //////////////////////////////////////////////////////////////
  578. /* 11. SEND EMAIL TO TECHS */
  579. //////////////////////////////////////////////////////////////
  580. notify_technicians('reply', $ticket, $user, $message, $email_attachments, $gateway[id], $extra_mail_info);
  581. return true;
  582. }
  583. /*
  584. Function specific to user.php that gets ticket details from a 
  585. ticket ref
  586. */
  587. function get_ticket_from_ref($ref) {
  588. global $db;
  589. if (is_int($ref)) {
  590. $field = 'ticket.id';
  591. } else {
  592. $field = 'ticket.ref';
  593. }
  594. $ticket = $db->query_return("
  595. SELECT 
  596. ticket.*, ticket_pri.id AS priority_id, ticket_pri.name AS priority_name, 
  597. ticket_cat.id AS category_id, ticket_cat.name AS category_name, 
  598. tech.id AS tech_id, tech.email AS tech_email
  599. FROM ticket
  600. LEFT JOIN ticket_pri ON (ticket.priority = ticket_pri.id)
  601. LEFT JOIN ticket_cat ON (ticket.category = ticket_cat.id)
  602. LEFT JOIN tech ON (ticket.tech = tech.id)
  603. WHERE $field = '" . addslashes($ref) . "'
  604. ");
  605. if ($db->num_rows()) {
  606. return $ticket;
  607. } else {
  608. return null;
  609. }
  610. }
  611. ?>