浏览代码

better address parsing. This should fix wrong parsing of addresses with
comments

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

+ 19 - 12
class/mime/Rfc822Header.class.php

@@ -41,7 +41,6 @@ class Rfc822Header {
         if (is_array($hdr)) {
         if (is_array($hdr)) {
             $hdr = implode('', $hdr);
             $hdr = implode('', $hdr);
         }
         }
-
         /* First we unfold the header */
         /* First we unfold the header */
         $hdr = trim(str_replace(array("\r\n\t", "\r\n "),array('', ''), $hdr));
         $hdr = trim(str_replace(array("\r\n\t", "\r\n "),array('', ''), $hdr));
 
 
@@ -268,6 +267,7 @@ class Rfc822Header {
                 $is_encoded = true;
                 $is_encoded = true;
                 break;
                 break;
             case '"': /* get the personal name */
             case '"': /* get the personal name */
+                //$name .= parseString($address,$pos);
                 $start_encoded = $pos;
                 $start_encoded = $pos;
                 ++$pos;
                 ++$pos;
                 if ($address{$pos} == '"') {
                 if ($address{$pos} == '"') {
@@ -304,17 +304,27 @@ class Rfc822Header {
                 }
                 }
                 break;
                 break;
             case '(':  /* rip off comments */
             case '(':  /* rip off comments */
-                $addr_start = $pos;
+                $comment_start = $pos;
                 $pos = strpos($address,')');
                 $pos = strpos($address,')');
                 if ($pos !== false) {
                 if ($pos !== false) {
-                    $comment = substr($address, $addr_start+1,($pos-$addr_start-1));
-                    $address_start = substr($address, 0, $addr_start);
+                    $comment = substr($address, $comment_start+1,($pos-$comment_start-1));
+                    $address_start = substr($address, 0, $comment_start);
                     $address_end   = substr($address, $pos + 1);
                     $address_end   = substr($address, $pos + 1);
                     $address       = $address_start . $address_end;
                     $address       = $address_start . $address_end;
                 }
                 }
                 $j = strlen($address);
                 $j = strlen($address);
-                $pos = $addr_start + 1;
+                if ($comment_start) {
+                    $pos = $comment_start-1;
+                } else {
+                    $pos = 0;
+                }
                 break;
                 break;
+            case ';':
+                if ($group) {
+                    $address = substr($address, 0, $pos - 1);
+                    ++$pos;
+                    break;
+                }
             case ',':  /* we reached a delimiter */
             case ',':  /* we reached a delimiter */
                 if (!$name && !$addr) {
                 if (!$name && !$addr) {
                     $addr = substr($address, 0, $pos);
                     $addr = substr($address, 0, $pos);
@@ -384,12 +394,6 @@ class Rfc822Header {
                 $j = strlen($address);
                 $j = strlen($address);
                 $group = '';
                 $group = '';
                 break;
                 break;
-            case ';':
-                if ($group) {
-                    $address = substr($address, 0, $pos - 1);
-                }
-                ++$pos;
-                break;
             case ' ':
             case ' ':
                 ++$pos;
                 ++$pos;
                 break;
                 break;
@@ -429,6 +433,9 @@ class Rfc822Header {
                                 if ($i_del) {
                                 if ($i_del) {
                                     $addr = substr($address,$pos,$i_del-$pos);
                                     $addr = substr($address,$pos,$i_del-$pos);
                                     $pos = $i_del;
                                     $pos = $i_del;
+                                } else if ($i_space) {
+                                    $addr = substr($address,$pos,$i_space-$pos);
+                                    $pos = $i_space+1;
                                 } else {
                                 } else {
                                     $addr = substr($address,$pos);
                                     $addr = substr($address,$pos);
                                     $pos = $j;
                                     $pos = $j;
@@ -436,7 +443,7 @@ class Rfc822Header {
                             }
                             }
                         } else {
                         } else {
                             if ($i_space) {
                             if ($i_space) {
-                                $name .= substr($address,$pos,$i_space-$pos) .  ' ';
+                                $name .= substr($address,$pos,$i_space-$pos) . ' ';
                                 $addr_start = $i_space+1;
                                 $addr_start = $i_space+1;
                                 $pos = $i_space+1;
                                 $pos = $i_space+1;
                             } else {
                             } else {