/**
* Rfc822Header.class.php
*
- * Copyright (c) 2003-2005 The SquirrelMail Project Team
- * Licensed under the GNU GPL. For full terms see the file COPYING.
- *
* This file contains functions needed to handle headers in mime messages.
*
+ * @copyright © 2003-2007 The SquirrelMail Project Team
+ * @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id$
* @package squirrelmail
* @subpackage mime
* @since 1.3.0
*/
class Rfc822Header {
- var $date = -1,
- $subject = '',
- $from = array(),
- $sender = '',
- $reply_to = array(),
- $mail_followup_to = array(),
- $to = array(),
- $cc = array(),
- $bcc = array(),
- $in_reply_to = '',
- $message_id = '',
- $references = '',
- $mime = false,
- $content_type = '',
- $disposition = '',
- $xmailer = '',
- $priority = 3,
- $dnt = '',
- $encoding = '',
- $content_id = '',
- $content_desc = '',
- $mlist = array(),
- $more_headers = array(); /* only needed for constructing headers
- in smtp.php */
+ /**
+ * Date header
+ * @var mixed
+ */
+ var $date = -1;
+ /**
+ * Original date header as fallback for unparsable dates
+ * @var mixed
+ */
+ var $date_unparsed = '';
+ /**
+ * Subject header
+ * @var string
+ */
+ var $subject = '';
+ /**
+ * From header
+ * @var array
+ */
+ var $from = array();
+ /**
+ * @var mixed
+ */
+ var $sender = '';
+ /**
+ * Reply-To header
+ * @var array
+ */
+ var $reply_to = array();
+ /**
+ * Mail-Followup-To header
+ * @var array
+ */
+ var $mail_followup_to = array();
+ /**
+ * To header
+ * @var array
+ */
+ var $to = array();
+ /**
+ * Cc header
+ * @var array
+ */
+ var $cc = array();
+ /**
+ * Bcc header
+ * @var array
+ */
+ var $bcc = array();
+ /**
+ * In-reply-to header
+ * @var string
+ */
+ var $in_reply_to = '';
+ /**
+ * Message-ID header
+ * @var string
+ */
+ var $message_id = '';
+ /**
+ * References header
+ * @var string
+ */
+ var $references = '';
+ /**
+ * @var mixed
+ */
+ var $mime = false;
+ /**
+ * Content Type object
+ * @var object
+ */
+ var $content_type = '';
+ /**
+ * @var mixed
+ */
+ var $disposition = '';
+ /**
+ * X-Mailer header
+ * @var string
+ */
+ var $xmailer = '';
+ /**
+ * Priority header
+ * @var integer
+ */
+ var $priority = 3;
+ /**
+ * Disposition notification for requesting message delivery notification (MDN)
+ * @var mixed
+ */
+ var $dnt = '';
+ /**
+ * Delivery notification (DR)
+ * @var mixed
+ */
+ var $drnt = '';
+ /**
+ * @var mixed
+ */
+ var $encoding = '';
+ /**
+ * @var mixed
+ */
+ var $content_id = '';
+ /**
+ * @var mixed
+ */
+ var $content_desc = '';
+ /**
+ * @var mixed
+ */
+ var $mlist = array();
+ /**
+ * SpamAssassin 'x-spam-status' header
+ * @var mixed
+ */
+ var $x_spam_status = array();
+ /**
+ * Extra header
+ * only needed for constructing headers in delivery class
+ * @var array
+ */
+ var $more_headers = array();
+
/**
* @param mixed $hdr string or array with message headers
*/
}
}
}
- if ($this->content_type == '') {
+ if (!is_object($this->content_type)) {
$this->parseContentType('text/plain; charset=us-ascii');
}
}
}
$result .= $value{$i};
}
- $result .= $value{$i};
+ if($i < $cnt) {
+ $result .= $value{$i};
+ }
break;
case '(':
$depth = 1;
$d = strtr($value, array(' ' => ' '));
$d = explode(' ', $d);
$this->date = getTimeStamp($d);
+ $this->date_unparsed = strtr($value,'<>',' ');
break;
case 'subject':
$this->subject = $value;
$this->references = $value;
break;
case 'x-confirm-reading-to':
- case 'return-receipt-to':
case 'disposition-notification-to':
$value = $this->stripComments($value);
$this->dnt = $this->parseAddress($value);
break;
+ case 'return-receipt-to':
+ $value = $this->stripComments($value);
+ $this->drnt = $this->parseAddress($value);
+ break;
case 'mime-version':
$value = $this->stripComments($value);
$value = str_replace(' ', '', $value);
$value = $this->stripComments($value);
$this->mlist('id', $value);
break;
+ case 'x-spam-status':
+ $this->x_spam_status = $this->parseSpamStatus($value);
+ break;
default:
break;
}
* X-MS-Mail-Priority is not parsed because it always coincides
* with one of the other headers.
*
- * NOTE: this is actually a duplicate from the function in
- * functions/imap_messages. I'm not sure if it's ok here to call
+ * NOTE: this is actually a duplicate from the code in
+ * functions/imap_messages:parseFetch().
+ * I'm not sure if it's ok here to call
* that function?
- * @param string $value literal priority name
+ * @param string $sValue literal priority name
* @return integer
*/
- function parsePriority($value) {
- $value = strtolower(array_shift(split('/\w/',trim($value))));
+ function parsePriority($sValue) {
+ // don't use function call inside array_shift.
+ $aValue = preg_split('/\s/',trim($sValue));
+ $value = strtolower(array_shift($aValue));
+
if ( is_numeric($value) ) {
return $value;
}
$this->mlist[$field] = $res_a;
}
+ /**
+ * Parses the X-Spam-Status header
+ * @param string $value
+ */
+ function parseSpamStatus($value) {
+ // Header value looks like this:
+ // No, score=1.5 required=5.0 tests=MSGID_FROM_MTA_ID,NO_REAL_NAME,UPPERCASE_25_50 autolearn=disabled version=3.1.0-gr0
+
+ $spam_status = array();
+
+ if (preg_match ('/^(No|Yes),\s+score=(-?\d+\.\d+)\s+required=(-?\d+\.\d+)\s+tests=(.*?)\s+autolearn=(.*?)\s+version=(.+?)$/', $value, $matches)) {
+ // full header
+ $spam_status['bad_format'] = 0;
+ $spam_status['value'] = $matches[0];
+ // is_spam
+ if (isset($matches[1])
+ && strtolower($matches[1]) == 'yes') {
+ $spam_status['is_spam'] = true;
+ } else {
+ $spam_status['is_spam'] = false;
+ }
+
+ // score
+ $spam_status['score'] = $matches[2];
+
+ // required
+ $spam_status['required'] = $matches[3];
+
+ // tests
+ $tests = array();
+ $tests = explode(',', $matches[4]);
+ foreach ($tests as $test) {
+ $spam_status['tests'][] = trim($test);
+ }
+
+ // autolearn
+ $spam_status['autolearn'] = $matches[5];
+
+ // version
+ $spam_status['version'] = $matches[6];
+ } else {
+ $spam_status['bad_format'] = 1;
+ $spam_status['value'] = $value;
+ }
+ return $spam_status;
+ }
+
/**
* function to get the address strings out of the header.
* example1: header->getAddr_s('to').
}
/**
+//FIXME: This needs some documentation (inside the function too)! Don't code w/out comments!
* @param mixed $address array or string
* @param boolean $recurs
* @return mixed array, boolean
$srch_addr = $this->parseAddress($address);
$results = array();
foreach ($this->to as $to) {
- if ($to->host == $srch_addr->host) {
- if ($to->mailbox == $srch_addr->mailbox) {
+ if (strtolower($to->host) == strtolower($srch_addr->host)) {
+ if (strtolower($to->mailbox) == strtolower($srch_addr->mailbox)) {
$results[] = $srch_addr;
- if ($to->personal == $srch_addr->personal) {
+ if (strtolower($to->personal) == strtolower($srch_addr->personal)) {
if ($recurs) {
return array($results, true);
} else {
}
}
foreach ($this->cc as $cc) {
- if ($cc->host == $srch_addr->host) {
- if ($cc->mailbox == $srch_addr->mailbox) {
+ if (strtolower($cc->host) == strtolower($srch_addr->host)) {
+ if (strtolower($cc->mailbox) == strtolower($srch_addr->mailbox)) {
$results[] = $srch_addr;
- if ($cc->personal == $srch_addr->personal) {
+ if (strtolower($cc->personal) == strtolower($srch_addr->personal)) {
if ($recurs) {
return array($results, true);
} else {
return $this->content_type->properties;
}
}
-
-?>
\ No newline at end of file