X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=class%2Fmime%2FRfc822Header.class.php;h=9f106d86b62d334ede869a4062f9666dc1e1a23f;hp=ca5ade5e8b6d8859cd7c1fd9f15061ed8e8435b2;hb=2a9b0fade049f568190407babf869bb4edf23375;hpb=8b53b4baaffc18ebc700b46ee28cbc2c7046916a;ds=sidebyside diff --git a/class/mime/Rfc822Header.class.php b/class/mime/Rfc822Header.class.php index ca5ade5e..9f106d86 100644 --- a/class/mime/Rfc822Header.class.php +++ b/class/mime/Rfc822Header.class.php @@ -3,24 +3,26 @@ /** * Rfc822Header.class.php * - * Copyright (c) 2003 The SquirrelMail Project Team + * Copyright (c) 2003-2004 The SquirrelMail Project Team * Licensed under the GNU GPL. For full terms see the file COPYING. * * This contains functions needed to handle mime messages. * * $Id$ + * @package squirrelmail */ -/* - * rdc822_header class +/** * input: header_string or array + * @package squirrelmail */ class Rfc822Header { - var $date = '', + var $date = -1, $subject = '', $from = array(), $sender = '', $reply_to = array(), + $mail_followup_to = array(), $to = array(), $cc = array(), $bcc = array(), @@ -34,6 +36,8 @@ class Rfc822Header { $priority = 3, $dnt = '', $encoding = '', + $content_id = '', + $content_desc = '', $mlist = array(), $more_headers = array(); /* only needed for constructing headers in smtp.php */ @@ -41,12 +45,12 @@ class Rfc822Header { if (is_array($hdr)) { $hdr = implode('', $hdr); } - /* First we unfold the header */ - $hdr = trim(str_replace(array("\r\n\t", "\r\n "),array('', ''), $hdr)); + /* First we replace \r\n by \n and unfold the header */ + $hdr = trim(str_replace(array("\r\n", "\n\t", "\n "),array("\n", ' ', ' '), $hdr)); /* Now we can make a new header array with */ /* each element representing a headerline */ - $hdr = explode("\r\n" , $hdr); + $hdr = explode("\n" , $hdr); foreach ($hdr as $line) { $pos = strpos($line, ':'); if ($pos > 0) { @@ -125,6 +129,9 @@ class Rfc822Header { case 'reply-to': $this->reply_to = $this->parseAddress($value, true); break; + case 'mail-followup-to': + $this->mail_followup_to = $this->parseAddress($value, true); + break; case 'to': $this->to = $this->parseAddress($value, true); break; @@ -164,6 +171,16 @@ class Rfc822Header { $value = $this->stripComments($value); $this->parseDisposition($value); break; + case 'content-transfer-encoding': + $this->encoding = $value; + break; + case 'content-description': + $this->content_desc = $value; + break; + case 'content-id': + $value = $this->stripComments($value); + $this->content_id = $value; + break; case 'user-agent': case 'x-mailer': $this->xmailer = $value; @@ -176,11 +193,11 @@ class Rfc822Header { $this->mlist('post', $value); break; case 'list-reply': - $value = $this->stripComments($value); + $value = $this->stripComments($value); $this->mlist('reply', $value); break; case 'list-subscribe': - $value = $this->stripComments($value); + $value = $this->stripComments($value); $this->mlist('subscribe', $value); break; case 'list-unsubscribe': @@ -230,7 +247,7 @@ class Rfc822Header { $i = $iEnd; } $sToken = str_replace($aReplace, $aSpecials,$sToken); - $aTokens[] = $sToken; + if ($sToken) $aTokens[] = $sToken; break; case '"': $iEnd = strpos($address,$cChar,$i+1); @@ -306,11 +323,11 @@ class Rfc822Header { array_pop($aTokens); // create token and add it again $sNewToken = $prevToken . $sNextToken; - $aTokens[] = $sNewToken; + if($sNewToken) $aTokens[] = $sNewToken; } } $sToken = str_replace($aReplace, $aSpecials,$sToken); - $aTokens[] = $sToken; + if ($sToken) $aTokens[] = $sToken; break; case ',': case ':': @@ -342,7 +359,7 @@ class Rfc822Header { } if (count($aStack)) { $sPersonal = trim(implode('',$aStack)); - } else { + } else { $sPersonal = ''; } if (!$sPersonal && count($aComment)) { @@ -370,18 +387,18 @@ class Rfc822Header { } /* - * parseAddress: recursive function for parsing address strings and store + * parseAddress: recursive function for parsing address strings and store * them in an address stucture object. * input: $address = string * $ar = boolean (return array instead of only the * first element) * $addr_ar = array with parsed addresses // obsolete * $group = string // obsolete - * $host = string (default domainname in case of + * $host = string (default domainname in case of * addresses without a domainname) * $lookup = callback function (for lookup address * strings which are probably nicks - * (without @ ) ) + * (without @ ) ) * output: array with addressstructure objects or only one * address_structure object. * personal name: encoded: =?charset?Q|B?string?= @@ -404,7 +421,7 @@ class Rfc822Header { case '=': case '"': case ' ': - $aStack[] = $sToken; + $aStack[] = $sToken; break; case '(': $aComment[] = substr($sToken,1,-1); @@ -415,7 +432,7 @@ class Rfc822Header { $oAddr = end($aAddress); if(!$oAddr || ((isset($oAddr)) && !$oAddr->mailbox && !$oAddr->personal)) { $sEmail = $sGroup . ':;'; - } + } $aAddress[] = $this->createAddressObject($aStack,$aComment,$sEmail,$sGroup); $sGroup = ''; $aStack = $aComment = array(); @@ -424,7 +441,7 @@ class Rfc822Header { case ',': $aAddress[] = $this->createAddressObject($aStack,$aComment,$sEmail,$sGroup); break; - case ':': + case ':': $sGroup = trim(implode(' ',$aStack)); $sGroup = preg_replace('/\s+/',' ',$sGroup); $aStack = array(); @@ -434,7 +451,7 @@ class Rfc822Header { break; case '>': /* skip */ - break; + break; default: $aStack[] = $sToken; break; } } @@ -473,20 +490,20 @@ class Rfc822Header { if ($sHost && $oAddr->mailbox) { $oAddr->host = $sHost; } - } + } } if (!$aAddrBookAddress && $oAddr->mailbox) { $aProcessedAddress[] = $oAddr; } else { - $aProcessedAddress = array_merge($aProcessedAddress,$aAddrBookAddress); + $aProcessedAddress = array_merge($aProcessedAddress,$aAddrBookAddress); } } - if ($ar) { + if ($ar) { return $aProcessedAddress; } else { return $aProcessedAddress[0]; } - } + } function parseContentType($value) { $pos = strpos($value, ';'); @@ -507,37 +524,39 @@ class Rfc822Header { } $this->content_type = $content_type; } - + /* RFC2184 */ - function processParameters($aParameters) { + function processParameters($aParameters) { $aResults = array(); - $aCharset = array(); - // handle multiline parameters + $aCharset = array(); + // handle multiline parameters foreach($aParameters as $key => $value) { - if ($iPos = strpos($key,'*')) { - $sKey = substr($key,0,$iPos); - if (!isset($aResults[$sKey])) { - $aResults[$sKey] = $value; - if (substr($key,-1) == '*') { // parameter contains language/charset info - $aCharset[] = $sKey; - } - } else { - $aResults[$sKey] .= $value; - } - } + if ($iPos = strpos($key,'*')) { + $sKey = substr($key,0,$iPos); + if (!isset($aResults[$sKey])) { + $aResults[$sKey] = $value; + if (substr($key,-1) == '*') { // parameter contains language/charset info + $aCharset[] = $sKey; + } + } else { + $aResults[$sKey] .= $value; + } + } else { + $aResults[$key] = $value; + } } - foreach ($aCharset as $key) { - $value = $aResults[$key]; - // extract the charset & language - $charset = substr($value,0,strpos($value,"'")); - $value = substr($value,strlen($charset)+1); - $language = substr($value,0,strpos($value,"'")); - $value = substr($value,strlen($charset)+1); - // FIX ME What's the status of charset decode with language information ???? - $value = charset_decode($charset,$value); - $aResults[$key] = $value; - } - return $aResults; + foreach ($aCharset as $key) { + $value = $aResults[$key]; + // extract the charset & language + $charset = substr($value,0,strpos($value,"'")); + $value = substr($value,strlen($charset)+1); + $language = substr($value,0,strpos($value,"'")); + $value = substr($value,strlen($charset)+1); + // FIX ME What's the status of charset decode with language information ???? + $value = charset_decode($charset,$value); + $aResults[$key] = $value; + } + return $aResults; } function parseProperties($value) { @@ -666,7 +685,7 @@ class Rfc822Header { } return $arr; } - + function findAddress($address, $recurs = false) { $result = false; if (is_array($address)) { @@ -681,7 +700,7 @@ class Rfc822Header { $result = $i; } } - ++$i; + ++$i; } } else { if (!is_array($this->cc)) $this->cc = array(); @@ -721,7 +740,7 @@ class Rfc822Header { return true; } else { return false; - } + } } //exit; return $result;