Skip to content
Draft
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
58 changes: 36 additions & 22 deletions lib/Service/MailTransmission.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use Horde_Mime_Headers_Subject;
use Horde_Mime_Mail;
use Horde_Mime_Mdn;
use Horde_Mime_Part;
use Horde_Smtp_Exception;
use OCA\Mail\Account;
use OCA\Mail\Address;
Expand Down Expand Up @@ -211,36 +212,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 @@ -293,7 +288,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 @@ -302,22 +297,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 @@ -326,7 +318,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 @@ -348,6 +344,24 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul
return [$account, $draftsMailbox, $newUid];
}

private function buildMimeHeaders(Address $from, AddressList $to, AddressList $cc, AddressList $bcc, ?string $subject): Horde_Mime_Headers {
$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->addHeaderOb(new Horde_Mime_Headers_Addresses('Cc', $cc->toHorde()));
}
if (count($bcc) > 0) {
$headers->addHeaderOb(new Horde_Mime_Headers_Addresses('Bcc', $bcc->toHorde()));
}
if ($subject !== null) {
$headers->addHeader('Subject', $subject);
}
return $headers;
}

/**
* @return array{
* From: Horde_Mail_Rfc822_Address,
Expand Down
Loading