Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 28 additions & 42 deletions lib/Service/MailTransmission.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Horde_Imap_Client_Data_Fetch;
use Horde_Imap_Client_Fetch_Query;
use Horde_Imap_Client_Ids;
use Horde_Mail_Rfc822_Address;
use Horde_Mail_Rfc822_List;
use Horde_Mail_Transport_Null;
use Horde_Mail_Transport_Smtphorde;
Expand Down Expand Up @@ -235,36 +234,30 @@ public function saveLocalDraft(Account $account, LocalMessage $message): void {
$this->transmissionService->handleAttachment($account, $attachment);
}

// build mime body
$headers = $this->buildHeaders(
$from,
$to,
$cc,
$bcc,
$message->getSubject()
);
$draftHeaders = $this->buildMimeHeaders($from, $to, $cc, $bcc, $message->getSubject());

$mail = new Horde_Mime_Mail();
$mail->addHeaders($headers);
if ($message->isHtml()) {
$mail->setHtmlBody($message->getBodyHtml());
} else {
$mail->setBody($message->getBodyPlain());
}
$mail->addHeaderOb(Horde_Mime_Headers_MessageId::create());
$perfLogger->step('build local draft message');

// 'Send' the message
// Use a null transport to trigger MIME body encoding without sending
$client = $this->imapClientFactory->getClient($account);
try {
$transport = new Horde_Mail_Transport_Null();
$mail->send($transport, false, false);
$mail->send(new Horde_Mail_Transport_Null(), false, false);
$perfLogger->step('create IMAP draft message');
$draftsMailbox = $this->findOrCreateDraftsMailbox($account);
$this->messageMapper->save(
$client,
$draftsMailbox,
$mail->getRaw(false),
$mail->getBasePart()->toString([
'encode' => Horde_Mime_Part::ENCODE_7BIT | Horde_Mime_Part::ENCODE_8BIT | Horde_Mime_Part::ENCODE_BINARY,
'headers' => $draftHeaders,
'stream' => false,
]),
[Horde_Imap_Client::FLAG_DRAFT]
);
$perfLogger->step('save local draft message on IMAP');
Expand Down Expand Up @@ -317,7 +310,7 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
$account = $message->getAccount();
$from = Address::fromRaw($account->getName(), $account->getEMailAddress());

$headers = $this->buildHeaders(
$draftHeaders = $this->buildMimeHeaders(
$from,
$message->getTo(),
$message->getCc(),
Expand All @@ -326,22 +319,19 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
);

$mail = new Horde_Mime_Mail();
$mail->addHeaders($headers);
if ($message->isHtml()) {
$mail->setHtmlBody($message->getBody());
} else {
$mail->setBody($message->getBody());
}
$mail->addHeaderOb(Horde_Mime_Headers_MessageId::create());
$perfLogger->step('build draft message');

// 'Send' the message
// Use a null transport to trigger MIME body encoding without sending
$client = $this->imapClientFactory->getClient($account);
try {
$transport = new Horde_Mail_Transport_Null();
$mail->send($transport, false, false);
$mail->send(new Horde_Mail_Transport_Null(), false, false);
$perfLogger->step('create IMAP message');
// save the message in the drafts folder
// save the message in the drafts mailbox
$draftsMailboxId = $account->getMailAccount()->getDraftsMailboxId();
if ($draftsMailboxId === null) {
throw new ClientException('No drafts mailbox configured');
Expand All @@ -350,7 +340,11 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
$newUid = $this->messageMapper->save(
$client,
$draftsMailbox,
$mail->getRaw(false),
$mail->getBasePart()->toString([
'encode' => Horde_Mime_Part::ENCODE_7BIT | Horde_Mime_Part::ENCODE_8BIT | Horde_Mime_Part::ENCODE_BINARY,
'headers' => $draftHeaders,
'stream' => false,
]),
[Horde_Imap_Client::FLAG_DRAFT]
);
$perfLogger->step('save message on IMAP');
Expand All @@ -372,29 +366,21 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
return [$account, $draftsMailbox, $newUid];
}

/**
* @return array{
* From: Horde_Mail_Rfc822_Address,
* To: Horde_Mail_Rfc822_List,
* Subject: string|null,
* Cc?: Horde_Mail_Rfc822_List,
* Bcc?: Horde_Mail_Rfc822_List,
* }
*/
private function buildHeaders(Address $from, AddressList $to, AddressList $cc, AddressList $bcc, ?string $subject): array {
$headers = [
'From' => $from->toHorde(),
'To' => $to->toHorde(),
'Subject' => $subject,
];

private function buildMimeHeaders(Address $from, AddressList $to, AddressList $cc, AddressList $bcc, ?string $subject): Horde_Mime_Headers {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This new function replaces entirely buildHeaders(), which is no longer used and can be suppressed.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! Missed because I opened this PR when #13180 wasn't in either.

$headers = new Horde_Mime_Headers();
$headers->addHeaderOb(Horde_Mime_Headers_Date::create());
$headers->addHeaderOb(Horde_Mime_Headers_MessageId::create());
$headers->addHeaderOb(new Horde_Mime_Headers_Addresses('From', $from->toHorde()));
$headers->addHeaderOb(new Horde_Mime_Headers_Addresses('To', $to->toHorde()));
if (count($cc) > 0) {
$headers['Cc'] = $cc->toHorde();
$headers->addHeaderOb(new Horde_Mime_Headers_Addresses('Cc', $cc->toHorde()));
}
if (count($bcc) > 0) {
$headers['Bcc'] = $bcc->toHorde();
$headers->addHeaderOb(new Horde_Mime_Headers_Addresses('Bcc', $bcc->toHorde()));
}
if ($subject !== null) {
$headers->addHeader('Subject', $subject);
}

return $headers;
}

Expand Down
Loading