Skip to content

Commit ff8e777

Browse files
committed
fixup! fix(MailTransmission): Handle clients/servers picky about empty headers
1 parent 28ab357 commit ff8e777

1 file changed

Lines changed: 56 additions & 59 deletions

File tree

lib/Service/MailTransmission.php

Lines changed: 56 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
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;
18+
use Horde_Mail_Rfc822_List;
1719
use Horde_Mail_Transport_Null;
1820
use Horde_Mail_Transport_Smtphorde;
1921
use Horde_Mime_Exception;
@@ -42,7 +44,6 @@
4244
use OCA\Mail\Exception\ServiceException;
4345
use OCA\Mail\IMAP\IMAPClientFactory;
4446
use OCA\Mail\IMAP\MessageMapper;
45-
use OCA\Mail\Model\Message as ModelMessage;
4647
use OCA\Mail\Model\NewMessageData;
4748
use OCA\Mail\Service\DataUri\DataUriParser;
4849
use 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

Comments
 (0)