35
35
use Horde_Imap_Client_Socket ;
36
36
use Horde_Mime_Exception ;
37
37
use Horde_Mime_Headers ;
38
+ use Horde_Mime_Headers_ContentParam_ContentType ;
39
+ use Horde_Mime_Headers_ContentTransferEncoding ;
38
40
use Horde_Mime_Part ;
39
41
use Html2Text \Html2Text ;
40
42
use OCA \Mail \Attachment ;
41
43
use OCA \Mail \Db \Mailbox ;
42
44
use OCA \Mail \Exception \ServiceException ;
45
+ use OCA \Mail \IMAP \Charset \Converter ;
43
46
use OCA \Mail \Model \IMAPMessage ;
44
47
use OCA \Mail \Service \SmimeService ;
45
48
use OCA \Mail \Support \PerformanceLoggerTask ;
@@ -64,13 +67,16 @@ class MessageMapper {
64
67
65
68
private SMimeService $ smimeService ;
66
69
private ImapMessageFetcherFactory $ imapMessageFactory ;
70
+ private Converter $ converter ;
67
71
68
72
public function __construct (LoggerInterface $ logger ,
69
73
SmimeService $ smimeService ,
70
- ImapMessageFetcherFactory $ imapMessageFactory ) {
74
+ ImapMessageFetcherFactory $ imapMessageFactory ,
75
+ Converter $ converter ) {
71
76
$ this ->logger = $ logger ;
72
77
$ this ->smimeService = $ smimeService ;
73
78
$ this ->imapMessageFactory = $ imapMessageFactory ;
79
+ $ this ->converter = $ converter ;
74
80
}
75
81
76
82
/**
@@ -943,15 +949,39 @@ public function getBodyStructureData(Horde_Imap_Client_Socket $client,
943
949
return new MessageStructureData ($ hasAttachments , $ text , $ isImipMessage , $ isEncrypted );
944
950
}
945
951
952
+ // Convert a given binary body to utf-8 according to the transfer encoding and content
953
+ // type headers of the underlying MIME part
954
+ $ convertBody = function (string $ body , Horde_Mime_Headers $ mimeHeaders ) use ($ structure ): string {
955
+ /** @var Horde_Mime_Headers_ContentParam_ContentType $contentType */
956
+ $ contentType = $ mimeHeaders ->getHeader ('content-type ' );
957
+ /** @var Horde_Mime_Headers_ContentTransferEncoding $transferEncoding */
958
+ $ transferEncoding = $ mimeHeaders ->getHeader ('content-transfer-encoding ' );
959
+
960
+ if (!$ contentType && !$ transferEncoding ) {
961
+ // Nothing to convert here ...
962
+ return $ body ;
963
+ }
964
+
965
+ if ($ transferEncoding ) {
966
+ $ structure ->setTransferEncoding ($ transferEncoding ->value_single );
967
+ }
968
+
969
+ if ($ contentType ) {
970
+ $ structure ->setType ($ contentType ->value_single );
971
+ if (isset ($ contentType ['charset ' ])) {
972
+ $ structure ->setCharset ($ contentType ['charset ' ]);
973
+ }
974
+ }
975
+
976
+ $ structure ->setContents ($ body );
977
+ return $ this ->converter ->convert ($ structure );
978
+ };
979
+
946
980
947
981
$ htmlBody = ($ htmlBodyId !== null ) ? $ part ->getBodyPart ($ htmlBodyId ) : null ;
948
982
if (!empty ($ htmlBody )) {
949
983
$ mimeHeaders = $ part ->getMimeHeader ($ htmlBodyId , Horde_Imap_Client_Data_Fetch::HEADER_PARSE );
950
- if ($ enc = $ mimeHeaders ->getValue ('content-transfer-encoding ' )) {
951
- $ structure ->setTransferEncoding ($ enc );
952
- $ structure ->setContents ($ htmlBody );
953
- $ htmlBody = $ structure ->getContents ();
954
- }
984
+ $ htmlBody = $ convertBody ($ htmlBody , $ mimeHeaders );
955
985
$ html = new Html2Text ($ htmlBody , ['do_links ' => 'none ' ,'alt_image ' => 'hide ' ]);
956
986
return new MessageStructureData (
957
987
$ hasAttachments ,
@@ -964,11 +994,7 @@ public function getBodyStructureData(Horde_Imap_Client_Socket $client,
964
994
965
995
if (!empty ($ textBody )) {
966
996
$ mimeHeaders = $ part ->getMimeHeader ($ textBodyId , Horde_Imap_Client_Data_Fetch::HEADER_PARSE );
967
- if ($ enc = $ mimeHeaders ->getValue ('content-transfer-encoding ' )) {
968
- $ structure ->setTransferEncoding ($ enc );
969
- $ structure ->setContents ($ textBody );
970
- $ textBody = $ structure ->getContents ();
971
- }
997
+ $ textBody = $ convertBody ($ textBody , $ mimeHeaders );
972
998
return new MessageStructureData (
973
999
$ hasAttachments ,
974
1000
$ textBody ,
0 commit comments