YourPaste - For your paste! Archive - Tools - Login

Piping mail in osTicket

Posted by Klopper on Sat 17 May 2008 22:54 798 views - Syntax: PHP - Expires: never - Report - IMG - Download -

  1. #!/usr/bin/php -q
  2. <?php
  3. /*********************************************************************
  4.     pipe.php
  5.  
  6.     Converts piped emails to ticket. Both local and remote!
  7.  
  8.     Peter Rotich <peter@osticket.com>
  9.     Copyright (c)  2006,2007,2008 osTicket
  10.     http://www.osticket.com
  11.  
  12.     Released under the GNU General Public License WITHOUT ANY WARRANTY.
  13.     See LICENSE.TXT for details.
  14.  
  15.     vim: expandtab sw=4 ts=4 sts=4:
  16.     $Id: $
  17. **********************************************************************/
  18. @chdir(realpath(dirname(__FILE__)).'/'); //Change dir.
  19. require('api.inc.php');
  20. require_once(INCLUDE_DIR.'class.mailparse.php');
  21. require_once(INCLUDE_DIR.'class.email.php');
  22.  
  23. ini_set('memory_limit', '256M'); //The concern here is having enough mem for emails with attachments.
  24. //ini_set('allow_url_include', 1); //Allow file get contents.
  25.  
  26. //Make sure piping is enabled!
  27. if(!$cfg->enableEmailPiping())
  28.     api_exit(EX_UNAVAILABLE,'Services not available!');
  29. //Get the input
  30. $data=isset($_SERVER['HTTP_HOST'])?file_get_contents('php://input'):file_get_contents('php://stdin');
  31. if(empty($data)){
  32.     api_exit(EX_NOINPUT,'No data');
  33. }
  34. //Parse the email.
  35. $parser= new Mail_Parse($data);
  36. if(!$parser->decode()){ //Decode...returns false on decoding errors
  37.     api_exit(EX_NOINPUT,'Email parse failed ['.$parser->getError()."]\n\n".$data);    
  38. }
  39.  
  40. //Check from address. make sure it is not a banned address.
  41. $fromlist = $parser->getFromAddressList();
  42. //Check for parsing errors on FROM address.
  43. if(!$fromlist || PEAR::isError($fromlist)){
  44.     api_exit(EX_DATAERR,'Invalid FROM address ['.$fromlist->getMessage()."]\n\n".$data);
  45. }
  46.  
  47. //Try to figure out the email associated with the message.
  48. $deptId=0;
  49. $tolist = $parser->getToAddressList();
  50. foreach ($tolist as $toaddr){
  51.     if(($emailId=Email::getIdByEmail($toaddr->mailbox.'@'.$toaddr->host))){
  52.         //We've found target email.
  53.         break;
  54.     }
  55. }
  56. if(!$emailId && ($cclist=$parser->getCcAddressList())) {
  57.     foreach ($cclist as $ccaddr){
  58.         if(($emailId=Email::getIdByEmail($ccaddr->mailbox.'@'.$ccaddr->host))){
  59.             break;
  60.         }
  61.     }
  62. }
  63. //TODO: Options to reject emails without a matching To address in db? May be it was Bcc? Current Policy: If you pipe, we accept policy
  64.  
  65. require_once(INCLUDE_DIR.'class.ticket.php'); //We now need this bad boy!
  66.  
  67. $var=array();
  68. $name=trim($fromlist[0]->personal,'"');
  69. $subj=$parser->getSubject();
  70.  
  71. $var['email']=$fromlist[0]->mailbox.'@'.$fromlist[0]->host;
  72. $var['name']=$name?$name:$var['email'];
  73. $var['emailId']=$emailId?$emailId:$cfg->getDefaultEmailId();
  74. $var['subject']=$subj?$subj:'[No Subject]';
  75. $var['message']=Format::stripEmptyLines($parser->getBody());
  76. $var['header']=$cfg->saveEmailHeaders()?$parser->getHeader():''; //TODO: Finish
  77. $var['pri']=$cfg->useEmailPriority()?$parser->getPriority():0;
  78. $ticlet=null;
  79. if(ereg ("[[][#][0-9]{1,10}[]]",$var['subject'],$regs)) {
  80.     $extid=trim(preg_replace("/[^0-9]/", "", $regs[0]));
  81.     $ticket= new Ticket(Ticket::getIdByExtId($extid));
  82.     //Allow mismatched emails?? For now hell NO.
  83.     if(!is_object($ticket) || strcasecmp($ticket->getEmail(),$var['email']))
  84.         $ticket=null;
  85. }        
  86. $errors=array();
  87. $msgid=0;
  88. if(!$ticket){ //New tickets...
  89.     $ticket=Ticket::create($var,$errors,'email');
  90.     if(!is_object($ticket) || $errors){
  91.         api_exit(EX_DATAERR,'Create Failed '.implode("\n",$errors)."\n\n");
  92.     }
  93.     $msgid=$ticket->getLastMsgId();
  94. }else{
  95.     $message=$var['message'];
  96.     //Strip quoted reply...TODO: figure out how mail clients do it without special tag..
  97.     if($cfg->stripQuotedReply() && ($tag=$cfg->getReplySeparator()) && strpos($var['message'],$tag))
  98.         list($message)=split($tag,$var['message']);
  99.     //post message....postMessage does the cleanup.
  100.     if(!($msgid=$ticket->postMessage($message,$var['header'],'Email'))) {
  101.         api_exit(EX_DATAERR,"post message failed \n\n $message\n");
  102.     }
  103. }
  104. //Ticket created...save attachments if enabled.
  105. $struct=$parser->getStruct();      
  106. if($struct && $struct->parts && $cfg->allowEmailAttachments()) {                  
  107.     for($i = 0; $i < count($struct->parts); $i++) {
  108.         $part=$struct->parts[$i];
  109.         if($part->disposition
  110.                 && (!strcasecmp($part->disposition,'attachment') || !strcasecmp($part->disposition,'inline') || !strcasecmp($part->ctype_primary,'image'))){
  111.             $filename=$part->d_parameters['filename'];
  112.             if($filename && $cfg->canUploadFileType($filename)) {
  113.                 $ticket->saveAttachment($filename,$part->body,$msgid,'M');
  114.             }
  115.         }
  116.     }
  117. }
  118. //print_r($var);
  119. api_exit(EX_SUCCESS);
  120. ?>
  121.  

Comments


Name:
Comment:

© 2008 YourPaste.net - Disclaimer