diff --git a/include/class.mailparse.php b/include/class.mailparse.php index c61573d463e78e3a2f7137d7bb9991ec14cd7b76..58adf3eac0210f2b608cda7e1a8e051cd2ffe684 100644 --- a/include/class.mailparse.php +++ b/include/class.mailparse.php @@ -15,8 +15,8 @@ vim: expandtab sw=4 ts=4 sts=4: **********************************************************************/ -require_once('Mail/mimeDecode.php'); -require_once('Mail/RFC822.php'); +require_once(PEAR_DIR.'Mail/mimeDecode.php'); +require_once(PEAR_DIR.'Mail/RFC822.php'); class Mail_Parse { @@ -231,4 +231,94 @@ class Mail_Parse { function parseAddressList($address){ return Mail_RFC822::parseAddressList($address, null, null,false); } + + function parse($rawemail) { + $parser= new Mail_Parse($rawemail); + return ($parser && $parser->decode())?$parser:null; + } +} + +class EmailDataParser { + var $stream; + var $error; + + function EmailDataParser($stream=null) { + $this->stream = $stream; + } + + function parse($stream) { + + $contents =''; + if(is_resource($stream)) { + while(!feof($stream)) + $contents .= fread($stream, 8192); + + } else { + $contents = $stream; + } + + $parser= new Mail_Parse($contents); + if(!$parser->decode()) //Decode...returns false on decoding errors + return $this->err('Email parse failed ['.$parser->getError().']'); + + $data =array(); + //FROM address: who sent the email. + if(($fromlist = $parser->getFromAddressList()) && !PEAR::isError($fromlist)) { + $from=$fromlist[0]; //Default. + foreach($fromlist as $fromobj) { + if(!Validator::is_email($fromobj->mailbox.'@'.$fromobj->host)) continue; + $from = $fromobj; + break; + } + + $data['name'] = trim($from->personal,'"'); + if($from->comment && $from->comment[0]) + $data['name'].= ' ('.$from->comment[0].')'; + + $data['email'] = $from->mailbox.'@'.$from->host; + } + + //TO Address:Try to figure out the email address... associated with the incoming email. + $emailId = 0; + if(($tolist = $parser->getToAddressList())) { + foreach ($tolist as $toaddr) { + if(($emailId=Email::getIdByEmail($toaddr->mailbox.'@'.$toaddr->host))) + break; + } + } + //maybe we got CC'ed?? + if(!$emailId && ($cclist=$parser->getCcAddressList())) { + foreach ($cclist as $ccaddr) { + if(($emailId=Email::getIdByEmail($ccaddr->mailbox.'@'.$ccaddr->host))) + break; + } + } + + $data['subject'] = Format::utf8encode($parser->getSubject()); + $data['message'] = Format::utf8encode(Format::stripEmptyLines($parser->getBody())); + $data['header'] = $parser->getHeader(); + $data['mid'] = $parser->getMessageId(); + $data['priorityId'] = $parser->getPriority(); + $data['emailId'] = $emailId; + + //attachments XXX: worry about encoding?? + $data['attachments'] = $parser->getAttachments(); + + return $data; + } + + function err($error) { + $this->error = $error; + + return false; + } + + function getError() { + return $this->lastError(); + } + + function lastError() { + return $this->error; + } } +?>