Skip to content

Commit cfec689

Browse files
Merge pull request #13279 from nextcloud/backport/13182/stable5.10
[stable5.10] fix(drafts): preserve Bcc header when saving drafts
2 parents 92de0b8 + 5e0117e commit cfec689

1 file changed

Lines changed: 28 additions & 42 deletions

File tree

lib/Service/MailTransmission.php

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use Horde_Imap_Client_Data_Fetch;
1515
use Horde_Imap_Client_Fetch_Query;
1616
use Horde_Imap_Client_Ids;
17-
use Horde_Mail_Rfc822_Address;
1817
use Horde_Mail_Rfc822_List;
1918
use Horde_Mail_Transport_Null;
2019
use 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

Comments
 (0)