|
14 | 14 | use Horde_Imap_Client_Data_Fetch; |
15 | 15 | use Horde_Imap_Client_Fetch_Query; |
16 | 16 | use Horde_Imap_Client_Ids; |
| 17 | +use Horde_Mail_Rfc822_Address; |
| 18 | +use Horde_Mail_Rfc822_List; |
17 | 19 | use Horde_Mail_Transport_Null; |
18 | 20 | use Horde_Mail_Transport_Smtphorde; |
19 | 21 | use Horde_Mime_Exception; |
|
42 | 44 | use OCA\Mail\Exception\ServiceException; |
43 | 45 | use OCA\Mail\IMAP\IMAPClientFactory; |
44 | 46 | use OCA\Mail\IMAP\MessageMapper; |
45 | | -use OCA\Mail\Model\Message as ModelMessage; |
46 | 47 | use OCA\Mail\Model\NewMessageData; |
47 | 48 | use OCA\Mail\Service\DataUri\DataUriParser; |
48 | 49 | use OCA\Mail\SMTP\SmtpClientFactory; |
@@ -107,13 +108,13 @@ public function sendMessage(Account $account, LocalMessage $localMessage): void |
107 | 108 |
|
108 | 109 | $transport = $this->smtpClientFactory->create($account); |
109 | 110 | // 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 | + ); |
117 | 118 |
|
118 | 119 | // The table (oc_local_messages) currently only allows for a single reply to message id |
119 | 120 | // but we already set the 'references' header for an email so we could support multiple references |
@@ -197,41 +198,27 @@ public function saveLocalDraft(Account $account, LocalMessage $message): void { |
197 | 198 |
|
198 | 199 | $perfLogger = $this->performanceLogger->start('save local draft'); |
199 | 200 |
|
200 | | - $imapMessage = new ModelMessage(); |
201 | | - $imapMessage->setTo($to); |
202 | | - $imapMessage->setSubject($message->getSubject()); |
203 | | - $from = new AddressList([ |
204 | | - Address::fromRaw($account->getName(), $account->getEMailAddress()), |
205 | | - ]); |
206 | | - $imapMessage->setFrom($from); |
207 | | - $imapMessage->setCC($cc); |
208 | | - $imapMessage->setBcc($bcc); |
209 | | - if ($message->isHtml() === true) { |
210 | | - $imapMessage->setContent($message->getBodyHtml()); |
211 | | - } else { |
212 | | - $imapMessage->setContent($message->getBodyPlain()); |
213 | | - } |
| 201 | + $from = Address::fromRaw($account->getName(), $account->getEMailAddress()); |
214 | 202 |
|
215 | 203 | foreach ($attachments as $attachment) { |
216 | 204 | $this->transmissionService->handleAttachment($account, $attachment); |
217 | 205 | } |
218 | 206 |
|
219 | 207 | // build mime body |
220 | | - $headers = [ |
221 | | - 'From' => $imapMessage->getFrom()->first()->toHorde(), |
222 | | - 'To' => $imapMessage->getTo()->toHorde(), |
223 | | - 'Cc' => $imapMessage->getCC()->toHorde(), |
224 | | - 'Bcc' => $imapMessage->getBCC()->toHorde(), |
225 | | - 'Subject' => $imapMessage->getSubject(), |
226 | | - 'Date' => Horde_Mime_Headers_Date::create(), |
227 | | - ]; |
| 208 | + $headers = $this->buildHeaders( |
| 209 | + $from, |
| 210 | + $to, |
| 211 | + $cc, |
| 212 | + $bcc, |
| 213 | + $message->getSubject() |
| 214 | + ); |
228 | 215 |
|
229 | 216 | $mail = new Horde_Mime_Mail(); |
230 | 217 | $mail->addHeaders($headers); |
231 | 218 | if ($message->isHtml()) { |
232 | | - $mail->setHtmlBody($imapMessage->getContent()); |
| 219 | + $mail->setHtmlBody($message->getBodyHtml()); |
233 | 220 | } else { |
234 | | - $mail->setBody($imapMessage->getContent()); |
| 221 | + $mail->setBody($message->getBodyPlain()); |
235 | 222 | } |
236 | 223 | $mail->addHeaderOb(Horde_Mime_Headers_MessageId::create()); |
237 | 224 | $perfLogger->step('build local draft message'); |
@@ -297,33 +284,22 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul |
297 | 284 | $perfLogger->step('emit pre event'); |
298 | 285 |
|
299 | 286 | $account = $message->getAccount(); |
300 | | - $imapMessage = new ModelMessage(); |
301 | | - $imapMessage->setTo($message->getTo()); |
302 | | - $imapMessage->setSubject($message->getSubject()); |
303 | | - $from = new AddressList([ |
304 | | - Address::fromRaw($account->getName(), $account->getEMailAddress()), |
305 | | - ]); |
306 | | - $imapMessage->setFrom($from); |
307 | | - $imapMessage->setCC($message->getCc()); |
308 | | - $imapMessage->setBcc($message->getBcc()); |
309 | | - $imapMessage->setContent($message->getBody()); |
310 | | - |
311 | | - // build mime body |
312 | | - $headers = [ |
313 | | - 'From' => $imapMessage->getFrom()->first()->toHorde(), |
314 | | - 'To' => $imapMessage->getTo()->toHorde(), |
315 | | - 'Cc' => $imapMessage->getCC()->toHorde(), |
316 | | - 'Bcc' => $imapMessage->getBCC()->toHorde(), |
317 | | - 'Subject' => $imapMessage->getSubject(), |
318 | | - 'Date' => Horde_Mime_Headers_Date::create(), |
319 | | - ]; |
| 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 | + ); |
320 | 296 |
|
321 | 297 | $mail = new Horde_Mime_Mail(); |
322 | 298 | $mail->addHeaders($headers); |
323 | 299 | if ($message->isHtml()) { |
324 | | - $mail->setHtmlBody($imapMessage->getContent()); |
| 300 | + $mail->setHtmlBody($message->getBody()); |
325 | 301 | } else { |
326 | | - $mail->setBody($imapMessage->getContent()); |
| 302 | + $mail->setBody($message->getBody()); |
327 | 303 | } |
328 | 304 | $mail->addHeaderOb(Horde_Mime_Headers_MessageId::create()); |
329 | 305 | $perfLogger->step('build draft message'); |
@@ -365,6 +341,32 @@ public function saveDraft(NewMessageData $message, ?Message $previousDraft = nul |
365 | 341 | return [$account, $draftsMailbox, $newUid]; |
366 | 342 | } |
367 | 343 |
|
| 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 | + |
368 | 370 | #[\Override] |
369 | 371 | public function sendMdn(Account $account, Mailbox $mailbox, Message $message): void { |
370 | 372 | $query = new Horde_Imap_Client_Fetch_Query(); |
|
0 commit comments