浏览代码

* fix for e-mail addresses like: <mailbox@host> (personal name)
now the personal name is no longer interpreted as comment
but is stored as the personal name inside the address object if
there is no other personal name supplied.
in case of:
"personal name1" <mailbox@host> (personal name2)
personal name 1 is used and personal name 2 is treated as comment.
* removed an eval call and replaced by something that doesn't need eval.

stekkel 22 年之前
父节点
当前提交
b54b1c2ac0
共有 1 个文件被更改,包括 28 次插入13 次删除
  1. 28 13
      class/mime/Rfc822Header.class.php

+ 28 - 13
class/mime/Rfc822Header.class.php

@@ -53,10 +53,6 @@ class Rfc822Header {
                 $field = substr($line, 0, $pos);
 		if (!strstr($field,' ')) { /* valid field */
             	    $value = trim(substr($line, $pos+1));
-            	    if(!preg_match('/^X.*/i', $field) &&
-                       !preg_match('/^Subject/i', $field)) {
-                       $value = $this->stripComments($value);
-                    }
             	    $this->parseField($field, $value);
 		}
             }
@@ -68,7 +64,6 @@ class Rfc822Header {
 
     function stripComments($value) {
         $result = '';
-
         $cnt = strlen($value);
         for ($i = 0; $i < $cnt; ++$i) {
             switch ($value{$i}) {
@@ -113,6 +108,7 @@ class Rfc822Header {
         $field = strtolower($field);
         switch($field) {
             case 'date':
+		$value = $this->stripComments($value);
                 $d = strtr($value, array('  ' => ' '));
                 $d = explode(' ', $d);
                 $this->date = getTimeStamp($d);
@@ -142,53 +138,67 @@ class Rfc822Header {
                 $this->in_reply_to = $value;
                 break;
             case 'message-id':
+		$value = $this->stripComments($value);
                 $this->message_id = $value;
                 break;
 	    case 'references':
+		$value = $this->stripComments($value);
 	        $this->references = $value;
 		break;
             case 'disposition-notification-to':
+		$value = $this->stripComments($value);
                 $this->dnt = $this->parseAddress($value);
                 break;
             case 'mime-version':
+		$value = $this->stripComments($value);
                 $value = str_replace(' ', '', $value);
                 $this->mime = ($value == '1.0' ? true : $this->mime);
                 break;
             case 'content-type':
+		$value = $this->stripComments($value);
                 $this->parseContentType($value);
                 break;
             case 'content-disposition':
+		$value = $this->stripComments($value);
                 $this->parseDisposition($value);
                 break;
             case 'user-agent':
             case 'x-mailer':
-                $this->xmailer = $value;
+        	$this->xmailer = $value;
                 break;
             case 'x-priority':
                 $this->priority = $value;
                 break;
             case 'list-post':
+		$value = $this->stripComments($value);
                 $this->mlist('post', $value);
                 break;
             case 'list-reply':
+		$value = $this->stripComments($value);	    
                 $this->mlist('reply', $value);
                 break;
             case 'list-subscribe':
+		$value = $this->stripComments($value);	    
                 $this->mlist('subscribe', $value);
                 break;
             case 'list-unsubscribe':
+		$value = $this->stripComments($value);
                 $this->mlist('unsubscribe', $value);
                 break;
             case 'list-archive':
+		$value = $this->stripComments($value);
                 $this->mlist('archive', $value);
                 break;
             case 'list-owner':
+		$value = $this->stripComments($value);
                 $this->mlist('owner', $value);
                 break;
             case 'list-help':
+		$value = $this->stripComments($value);
                 $this->mlist('help', $value);
                 break;
             case 'list-id':
+		$value = $this->stripComments($value);
                 $this->mlist('id', $value);
                 break;
             default:
@@ -217,6 +227,7 @@ class Rfc822Header {
         $j = strlen($address);
         $name = '';
         $addr = '';
+	$comment = '';
         while ($pos < $j) {
             switch ($address{$pos}) {
                 case '"': /* get the personal name */
@@ -242,12 +253,13 @@ class Rfc822Header {
                     break;
                 case '(':  /* rip off comments */
                     $addr_start = $pos;
-                    for (++$pos; ($pos < $j) && ($address{$pos} != ')'); ++$pos) {
-                        $addr .= $address{$pos};
-                    }
-                    $address_start = substr($address, 0, $addr_start);
-                    $address_end   = substr($address, $pos + 1);
-                    $address       = $address_start . $address_end;
+		    $pos = strpos($address,')');
+		    if ($pos !== false) {
+			$comment = substr($address, $addr_start+1,($pos-$addr_start-1));
+                	$address_start = substr($address, 0, $addr_start);
+                	$address_end   = substr($address, $pos + 1);
+                	$address       = $address_start . $address_end;
+		    }
                     $j = strlen($address);
                     $pos = $addr_start + 1;
                     break;
@@ -260,6 +272,7 @@ class Rfc822Header {
 
                     $at = strpos($addr, '@');
                     $addr_structure = new AddressStructure();
+		    if (!$name && $comment) $name = $comment;
                     $addr_structure->personal = $name;
                     $addr_structure->group = $group;
                     if ($at) {
@@ -319,6 +332,7 @@ class Rfc822Header {
         } else if ($name == '') {
             $name = trim(substr($address, 0, $addr_start));
         }
+        if (!$name && $comment) $name = $comment;
         $at = strpos($addr, '@');
         $addr_structure = new AddressStructure();
         $addr_structure->group = $group;
@@ -476,7 +490,7 @@ class Rfc822Header {
                 $arr = $this->getAddr_a($argument, $excl_arr, $arr);
             }
         } else {
-            eval('$addr = $this->' . $arg . ';') ;
+	    $addr = $this->{$arg};
             if (is_array($addr)) {
                 foreach ($addr as $next_addr) {
                     if (is_object($next_addr)) {
@@ -561,6 +575,7 @@ class Rfc822Header {
 		return false;
 	    }	
 	}
+        //exit;
 	return $result;
     }