1414use Horde_Imap_Client_Data_Fetch ;
1515use Horde_Imap_Client_Fetch_Query ;
1616use Horde_Imap_Client_Ids ;
17- use Horde_Mail_Rfc822_Address ;
1817use Horde_Mail_Rfc822_List ;
1918use Horde_Mail_Transport_Null ;
2019use Horde_Mail_Transport_Smtphorde ;
@@ -235,36 +234,30 @@ public function saveLocalDraft(Account $account, LocalMessage $message): void {
235234 $ this ->transmissionService ->handleAttachment ($ account , $ attachment );
236235 }
237236
238- // build mime body
239- $ headers = $ this ->buildHeaders (
240- $ from ,
241- $ to ,
242- $ cc ,
243- $ bcc ,
244- $ message ->getSubject ()
245- );
237+ $ draftHeaders = $ this ->buildMimeHeaders ($ from , $ to , $ cc , $ bcc , $ message ->getSubject ());
246238
247239 $ mail = new Horde_Mime_Mail ();
248- $ mail ->addHeaders ($ headers );
249240 if ($ message ->isHtml ()) {
250241 $ mail ->setHtmlBody ($ message ->getBodyHtml ());
251242 } else {
252243 $ mail ->setBody ($ message ->getBodyPlain ());
253244 }
254- $ mail ->addHeaderOb (Horde_Mime_Headers_MessageId::create ());
255245 $ perfLogger ->step ('build local draft message ' );
256246
257- // 'Send' the message
247+ // Use a null transport to trigger MIME body encoding without sending
258248 $ client = $ this ->imapClientFactory ->getClient ($ account );
259249 try {
260- $ transport = new Horde_Mail_Transport_Null ();
261- $ mail ->send ($ transport , false , false );
250+ $ mail ->send (new Horde_Mail_Transport_Null (), false , false );
262251 $ perfLogger ->step ('create IMAP draft message ' );
263252 $ draftsMailbox = $ this ->findOrCreateDraftsMailbox ($ account );
264253 $ this ->messageMapper ->save (
265254 $ client ,
266255 $ draftsMailbox ,
267- $ mail ->getRaw (false ),
256+ $ mail ->getBasePart ()->toString ([
257+ 'encode ' => Horde_Mime_Part::ENCODE_7BIT | Horde_Mime_Part::ENCODE_8BIT | Horde_Mime_Part::ENCODE_BINARY ,
258+ 'headers ' => $ draftHeaders ,
259+ 'stream ' => false ,
260+ ]),
268261 [Horde_Imap_Client::FLAG_DRAFT ]
269262 );
270263 $ perfLogger ->step ('save local draft message on IMAP ' );
@@ -317,7 +310,7 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
317310 $ account = $ message ->getAccount ();
318311 $ from = Address::fromRaw ($ account ->getName (), $ account ->getEMailAddress ());
319312
320- $ headers = $ this ->buildHeaders (
313+ $ draftHeaders = $ this ->buildMimeHeaders (
321314 $ from ,
322315 $ message ->getTo (),
323316 $ message ->getCc (),
@@ -326,22 +319,19 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
326319 );
327320
328321 $ mail = new Horde_Mime_Mail ();
329- $ mail ->addHeaders ($ headers );
330322 if ($ message ->isHtml ()) {
331323 $ mail ->setHtmlBody ($ message ->getBody ());
332324 } else {
333325 $ mail ->setBody ($ message ->getBody ());
334326 }
335- $ mail ->addHeaderOb (Horde_Mime_Headers_MessageId::create ());
336327 $ perfLogger ->step ('build draft message ' );
337328
338- // 'Send' the message
329+ // Use a null transport to trigger MIME body encoding without sending
339330 $ client = $ this ->imapClientFactory ->getClient ($ account );
340331 try {
341- $ transport = new Horde_Mail_Transport_Null ();
342- $ mail ->send ($ transport , false , false );
332+ $ mail ->send (new Horde_Mail_Transport_Null (), false , false );
343333 $ perfLogger ->step ('create IMAP message ' );
344- // save the message in the drafts folder
334+ // save the message in the drafts mailbox
345335 $ draftsMailboxId = $ account ->getMailAccount ()->getDraftsMailboxId ();
346336 if ($ draftsMailboxId === null ) {
347337 throw new ClientException ('No drafts mailbox configured ' );
@@ -350,7 +340,11 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
350340 $ newUid = $ this ->messageMapper ->save (
351341 $ client ,
352342 $ draftsMailbox ,
353- $ mail ->getRaw (false ),
343+ $ mail ->getBasePart ()->toString ([
344+ 'encode ' => Horde_Mime_Part::ENCODE_7BIT | Horde_Mime_Part::ENCODE_8BIT | Horde_Mime_Part::ENCODE_BINARY ,
345+ 'headers ' => $ draftHeaders ,
346+ 'stream ' => false ,
347+ ]),
354348 [Horde_Imap_Client::FLAG_DRAFT ]
355349 );
356350 $ perfLogger ->step ('save message on IMAP ' );
@@ -372,29 +366,21 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
372366 return [$ account , $ draftsMailbox , $ newUid ];
373367 }
374368
375- /**
376- * @return array{
377- * From: Horde_Mail_Rfc822_Address,
378- * To: Horde_Mail_Rfc822_List,
379- * Subject: string|null,
380- * Cc?: Horde_Mail_Rfc822_List,
381- * Bcc?: Horde_Mail_Rfc822_List,
382- * }
383- */
384- private function buildHeaders (Address $ from , AddressList $ to , AddressList $ cc , AddressList $ bcc , ?string $ subject ): array {
385- $ headers = [
386- 'From ' => $ from ->toHorde (),
387- 'To ' => $ to ->toHorde (),
388- 'Subject ' => $ subject ,
389- ];
390-
369+ private function buildMimeHeaders (Address $ from , AddressList $ to , AddressList $ cc , AddressList $ bcc , ?string $ subject ): Horde_Mime_Headers {
370+ $ headers = new Horde_Mime_Headers ();
371+ $ headers ->addHeaderOb (Horde_Mime_Headers_Date::create ());
372+ $ headers ->addHeaderOb (Horde_Mime_Headers_MessageId::create ());
373+ $ headers ->addHeaderOb (new Horde_Mime_Headers_Addresses ('From ' , $ from ->toHorde ()));
374+ $ headers ->addHeaderOb (new Horde_Mime_Headers_Addresses ('To ' , $ to ->toHorde ()));
391375 if (count ($ cc ) > 0 ) {
392- $ headers[ 'Cc ' ] = $ cc ->toHorde ();
376+ $ headers-> addHeaderOb ( new Horde_Mime_Headers_Addresses ( 'Cc ' , $ cc ->toHorde ()) );
393377 }
394378 if (count ($ bcc ) > 0 ) {
395- $ headers ['Bcc ' ] = $ bcc ->toHorde ();
379+ $ headers ->addHeaderOb (new Horde_Mime_Headers_Addresses ('Bcc ' , $ bcc ->toHorde ()));
380+ }
381+ if ($ subject !== null ) {
382+ $ headers ->addHeader ('Subject ' , $ subject );
396383 }
397-
398384 return $ headers ;
399385 }
400386
0 commit comments