1414use Horde_Imap_Client_Data_Fetch ;
1515use Horde_Imap_Client_Fetch_Query ;
1616use Horde_Imap_Client_Ids ;
17+ use Horde_Mail_Rfc822_Address ;
18+ use Horde_Mail_Rfc822_List ;
1719use Horde_Mail_Transport_Null ;
1820use Horde_Mail_Transport_Smtphorde ;
1921use Horde_Mime_Exception ;
4244use OCA \Mail \Exception \ServiceException ;
4345use OCA \Mail \IMAP \IMAPClientFactory ;
4446use OCA \Mail \IMAP \MessageMapper ;
45- use OCA \Mail \Model \Message as ModelMessage ;
4647use OCA \Mail \Model \NewMessageData ;
4748use OCA \Mail \Service \DataUri \DataUriParser ;
4849use OCA \Mail \SMTP \SmtpClientFactory ;
@@ -107,13 +108,13 @@ public function sendMessage(Account $account, LocalMessage $localMessage): void
107108
108109 $ transport = $ this ->smtpClientFactory ->create ($ account );
109110 // build mime body
110- $ headers = [
111- ' From ' => $ from-> toHorde () ,
112- ' To ' => $ to-> toHorde () ,
113- ' Cc ' => $ cc-> toHorde () ,
114- ' Bcc ' => $ bcc-> toHorde () ,
115- ' Subject ' => $ localMessage ->getSubject (),
116- ] ;
111+ $ headers = $ this -> buildHeaders (
112+ $ from ,
113+ $ to ,
114+ $ cc ,
115+ $ bcc ,
116+ $ localMessage ->getSubject ()
117+ ) ;
117118
118119 // The table (oc_local_messages) currently only allows for a single reply to message id
119120 // but we already set the 'references' header for an email so we could support multiple references
@@ -127,11 +128,6 @@ public function sendMessage(Account $account, LocalMessage $localMessage): void
127128 $ headers [Horde_Mime_Mdn::MDN_HEADER ] = $ from ->toHorde ();
128129 }
129130
130- // Exclude headers where the value is empty, null, or just whitespace (to avoid confusing picky servers/clients)
131- $ headers = array_filter ($ headers , function ($ value ) {
132- return !empty ($ value ) && (is_string ($ value ) ? trim ($ value ) !== '' : true );
133- });
134-
135131 $ mail = new Horde_Mime_Mail ();
136132 $ mail ->addHeaders ($ headers );
137133
@@ -202,41 +198,27 @@ public function saveLocalDraft(Account $account, LocalMessage $message): void {
202198
203199 $ perfLogger = $ this ->performanceLogger ->start ('save local draft ' );
204200
205- $ imapMessage = new ModelMessage ();
206- $ imapMessage ->setTo ($ to );
207- $ imapMessage ->setSubject ($ message ->getSubject ());
208- $ from = new AddressList ([
209- Address::fromRaw ($ account ->getName (), $ account ->getEMailAddress ()),
210- ]);
211- $ imapMessage ->setFrom ($ from );
212- $ imapMessage ->setCC ($ cc );
213- $ imapMessage ->setBcc ($ bcc );
214- if ($ message ->isHtml () === true ) {
215- $ imapMessage ->setContent ($ message ->getBodyHtml ());
216- } else {
217- $ imapMessage ->setContent ($ message ->getBodyPlain ());
218- }
201+ $ from = Address::fromRaw ($ account ->getName (), $ account ->getEMailAddress ());
219202
220203 foreach ($ attachments as $ attachment ) {
221204 $ this ->transmissionService ->handleAttachment ($ account , $ attachment );
222205 }
223206
224207 // build mime body
225- $ headers = [
226- 'From ' => $ imapMessage ->getFrom ()->first ()->toHorde (),
227- 'To ' => $ imapMessage ->getTo ()->toHorde (),
228- 'Cc ' => $ imapMessage ->getCC ()->toHorde (),
229- 'Bcc ' => $ imapMessage ->getBCC ()->toHorde (),
230- 'Subject ' => $ imapMessage ->getSubject (),
231- 'Date ' => Horde_Mime_Headers_Date::create (),
232- ];
208+ $ headers = $ this ->buildHeaders (
209+ $ from ,
210+ $ to ,
211+ $ cc ,
212+ $ bcc ,
213+ $ message ->getSubject ()
214+ );
233215
234216 $ mail = new Horde_Mime_Mail ();
235217 $ mail ->addHeaders ($ headers );
236218 if ($ message ->isHtml ()) {
237- $ mail ->setHtmlBody ($ imapMessage -> getContent ());
219+ $ mail ->setHtmlBody ($ message -> getBodyHtml ());
238220 } else {
239- $ mail ->setBody ($ imapMessage -> getContent ());
221+ $ mail ->setBody ($ message -> getBodyPlain ());
240222 }
241223 $ mail ->addHeaderOb (Horde_Mime_Headers_MessageId::create ());
242224 $ perfLogger ->step ('build local draft message ' );
@@ -302,33 +284,22 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
302284 $ perfLogger ->step ('emit pre event ' );
303285
304286 $ account = $ message ->getAccount ();
305- $ imapMessage = new ModelMessage ();
306- $ imapMessage ->setTo ($ message ->getTo ());
307- $ imapMessage ->setSubject ($ message ->getSubject ());
308- $ from = new AddressList ([
309- Address::fromRaw ($ account ->getName (), $ account ->getEMailAddress ()),
310- ]);
311- $ imapMessage ->setFrom ($ from );
312- $ imapMessage ->setCC ($ message ->getCc ());
313- $ imapMessage ->setBcc ($ message ->getBcc ());
314- $ imapMessage ->setContent ($ message ->getBody ());
315-
316- // build mime body
317- $ headers = [
318- 'From ' => $ imapMessage ->getFrom ()->first ()->toHorde (),
319- 'To ' => $ imapMessage ->getTo ()->toHorde (),
320- 'Cc ' => $ imapMessage ->getCC ()->toHorde (),
321- 'Bcc ' => $ imapMessage ->getBCC ()->toHorde (),
322- 'Subject ' => $ imapMessage ->getSubject (),
323- 'Date ' => Horde_Mime_Headers_Date::create (),
324- ];
287+ $ from = Address::fromRaw ($ account ->getName (), $ account ->getEMailAddress ());
288+
289+ $ headers = $ this ->buildHeaders (
290+ $ from ,
291+ $ message ->getTo (),
292+ $ message ->getCc (),
293+ $ message ->getBcc (),
294+ $ message ->getSubject ()
295+ );
325296
326297 $ mail = new Horde_Mime_Mail ();
327298 $ mail ->addHeaders ($ headers );
328299 if ($ message ->isHtml ()) {
329- $ mail ->setHtmlBody ($ imapMessage -> getContent ());
300+ $ mail ->setHtmlBody ($ message -> getBody ());
330301 } else {
331- $ mail ->setBody ($ imapMessage -> getContent ());
302+ $ mail ->setBody ($ message -> getBody ());
332303 }
333304 $ mail ->addHeaderOb (Horde_Mime_Headers_MessageId::create ());
334305 $ perfLogger ->step ('build draft message ' );
@@ -370,6 +341,32 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
370341 return [$ account , $ draftsMailbox , $ newUid ];
371342 }
372343
344+ /**
345+ * @return array{
346+ * From: Horde_Mail_Rfc822_Address,
347+ * To: Horde_Mail_Rfc822_List,
348+ * Subject: string|null,
349+ * Cc?: Horde_Mail_Rfc822_List,
350+ * Bcc?: Horde_Mail_Rfc822_List,
351+ * }
352+ */
353+ private function buildHeaders (Address $ from , AddressList $ to , AddressList $ cc , AddressList $ bcc , ?string $ subject ): array {
354+ $ headers = [
355+ 'From ' => $ from ->toHorde (),
356+ 'To ' => $ to ->toHorde (),
357+ 'Subject ' => $ subject ,
358+ ];
359+
360+ if (count ($ cc ) > 0 ) {
361+ $ headers ['Cc ' ] = $ cc ->toHorde ();
362+ }
363+ if (count ($ bcc ) > 0 ) {
364+ $ headers ['Bcc ' ] = $ bcc ->toHorde ();
365+ }
366+
367+ return $ headers ;
368+ }
369+
373370 #[\Override]
374371 public function sendMdn (Account $ account , Mailbox $ mailbox , Message $ message ): void {
375372 $ query = new Horde_Imap_Client_Fetch_Query ();
0 commit comments