#!/usr/bin/php -q
<?php
/*********************************************************************
pipe.php
Converts piped emails to ticket. Both local and remote!
Peter Rotich <peter@osticket.com>
Copyright (c) 2006,2007,2008 osTicket
http://www.osticket.com
Released under the GNU General Public License WITHOUT ANY WARRANTY.
See LICENSE.TXT for details.
vim: expandtab sw=4 ts=4 sts=4:
$Id: $
**********************************************************************/
require('api.inc.php');
require_once(INCLUDE_DIR.'class.mailparse.php');
require_once(INCLUDE_DIR.'class.email.php');
ini_set('memory_limit',
'256M');
//The concern here is having enough mem for emails with attachments.
//ini_set('allow_url_include', 1); //Allow file get contents.
//Make sure piping is enabled!
if(!$cfg->enableEmailPiping())
api_exit(EX_UNAVAILABLE,'Services not available!');
//Get the input
api_exit(EX_NOINPUT,'No data');
}
//Parse the email.
$parser= new Mail_Parse($data);
if(!$parser->decode()){ //Decode...returns false on decoding errors
api_exit(EX_NOINPUT,'Email parse failed ['.$parser->getError()."]\n\n".$data);
}
//Check from address. make sure it is not a banned address.
$fromlist = $parser->getFromAddressList();
//Check for parsing errors on FROM address.
if(!$fromlist || PEAR::isError($fromlist)){
api_exit(EX_DATAERR,'Invalid FROM address ['.$fromlist->getMessage()."]\n\n".$data);
}
//Try to figure out the email associated with the message.
$deptId=0;
$tolist = $parser->getToAddressList();
foreach ($tolist as $toaddr){
if(($emailId=Email::getIdByEmail($toaddr->mailbox.'@'.$toaddr->host))){
//We've found target email.
break;
}
}
if(!$emailId && ($cclist=$parser->getCcAddressList())) {
foreach ($cclist as $ccaddr){
if(($emailId=Email::getIdByEmail($ccaddr->mailbox.'@'.$ccaddr->host))){
break;
}
}
}
//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
require_once(INCLUDE_DIR.'class.ticket.php'); //We now need this bad boy!
$name=
trim($fromlist[0]->
personal,
'"');
$subj=$parser->getSubject();
$var['email']=$fromlist[0]->mailbox.'@'.$fromlist[0]->host;
$var['name']=$name?$name:$var['email'];
$var['emailId']=$emailId?$emailId:$cfg->getDefaultEmailId();
$var['subject']=$subj?$subj:'[No Subject]';
$var['message']=Format::stripEmptyLines($parser->getBody());
$var['header']=$cfg->saveEmailHeaders()?$parser->getHeader():''; //TODO: Finish
$var['pri']=$cfg->useEmailPriority()?$parser->getPriority():0;
$ticlet=null;
if(ereg ("[[][#][0-9]{1,10}[]]",
$var['subject'],
$regs)) {
$ticket= new Ticket(Ticket::getIdByExtId($extid));
//Allow mismatched emails?? For now hell NO.
$ticket=null;
}
$msgid=0;
if(!$ticket){ //New tickets...
$ticket=Ticket::create($var,$errors,'email');
api_exit
(EX_DATAERR,
'Create Failed '.
implode("\n",
$errors).
"\n\n");
}
$msgid=$ticket->getLastMsgId();
}else{
$message=$var['message'];
//Strip quoted reply...TODO: figure out how mail clients do it without special tag..
if($cfg->
stripQuotedReply() &&
($tag=
$cfg->
getReplySeparator()) &&
strpos($var['message'],
$tag))
//post message....postMessage does the cleanup.
if(!($msgid=$ticket->postMessage($message,$var['header'],'Email'))) {
api_exit(EX_DATAERR,"post message failed \n\n $message\n");
}
}
//Ticket created...save attachments if enabled.
$struct=$parser->getStruct();
if($struct && $struct->parts && $cfg->allowEmailAttachments()) {
for($i =
0;
$i <
count($struct->
parts);
$i++
) {
$part=$struct->parts[$i];
if($part->disposition
$filename=$part->d_parameters['filename'];
if($filename && $cfg->canUploadFileType($filename)) {
$ticket->saveAttachment($filename,$part->body,$msgid,'M');
}
}
}
}
//print_r($var);
api_exit(EX_SUCCESS);
?>