@@ -214,7 +214,7 @@ public function rfc822_parse_headers($raw_headers): object {
214
214
$ headers = [];
215
215
$ imap_headers = [];
216
216
if (extension_loaded ('imap ' ) && $ this ->config ["rfc822 " ]) {
217
- $ raw_imap_headers = (array )\imap_rfc822_parse_headers ($ this -> raw );
217
+ $ raw_imap_headers = (array )\imap_rfc822_parse_headers ($ raw_headers );
218
218
foreach ($ raw_imap_headers as $ key => $ values ) {
219
219
$ key = str_replace ("- " , "_ " , $ key );
220
220
$ imap_headers [$ key ] = $ values ;
@@ -594,11 +594,9 @@ private function parseAddresses($list): array {
594
594
} else {
595
595
$ personalParts = $ this ->mime_header_decode ($ address ->personal );
596
596
597
- if (is_array ($ personalParts )) {
598
- $ address ->personal = '' ;
599
- foreach ($ personalParts as $ p ) {
600
- $ address ->personal .= $ this ->convertEncoding ($ p ->text , $ this ->getEncoding ($ p ));
601
- }
597
+ $ address ->personal = '' ;
598
+ foreach ($ personalParts as $ p ) {
599
+ $ address ->personal .= $ this ->convertEncoding ($ p ->text , $ this ->getEncoding ($ p ));
602
600
}
603
601
604
602
if (str_starts_with ($ address ->personal , "' " )) {
@@ -629,24 +627,55 @@ private function extractHeaderExtensions(): void {
629
627
if (($ key == "user_agent " ) === false ) {
630
628
if (($ pos = strpos ($ value , "; " )) !== false ) {
631
629
$ original = substr ($ value , 0 , $ pos );
632
- $ this ->set ($ key , trim (rtrim ($ original )), true );
630
+ $ this ->set ($ key , trim (rtrim ($ original )));
633
631
634
632
// Get all potential extensions
635
633
$ extensions = explode ("; " , substr ($ value , $ pos + 1 ));
634
+ $ previousKey = null ;
635
+ $ previousValue = '' ;
636
+
636
637
foreach ($ extensions as $ extension ) {
637
638
if (($ pos = strpos ($ extension , "= " )) !== false ) {
638
639
$ key = substr ($ extension , 0 , $ pos );
639
640
$ key = trim (rtrim (strtolower ($ key )));
640
641
642
+ $ matches = [];
643
+
644
+ if (preg_match ('/^(?P<key_name>\w+)\*/ ' , $ key , $ matches ) !== 0 ) {
645
+ $ key = $ matches ['key_name ' ];
646
+ $ previousKey = $ key ;
647
+
648
+ $ value = substr ($ extension , $ pos + 1 );
649
+ $ value = str_replace ('" ' , "" , $ value );
650
+ $ previousValue .= trim (rtrim ($ value ));
651
+
652
+ continue ;
653
+ }
654
+
655
+ if (
656
+ $ previousKey !== null
657
+ && $ previousKey !== $ key
658
+ && isset ($ this ->attributes [$ previousKey ]) === false
659
+ ) {
660
+ $ this ->set ($ previousKey , $ previousValue );
661
+
662
+ $ previousValue = '' ;
663
+ }
664
+
641
665
if (isset ($ this ->attributes [$ key ]) === false ) {
642
666
$ value = substr ($ extension , $ pos + 1 );
643
667
$ value = str_replace ('" ' , "" , $ value );
644
668
$ value = trim (rtrim ($ value ));
645
669
646
670
$ this ->set ($ key , $ value );
647
671
}
672
+
673
+ $ previousKey = $ key ;
648
674
}
649
675
}
676
+ if ($ previousValue !== '' ) {
677
+ $ this ->set ($ previousKey , $ previousValue );
678
+ }
650
679
}
651
680
}
652
681
}
0 commit comments