Skip to content

Commit

Permalink
Fix calendar emails to be outlook compatible
Browse files Browse the repository at this point in the history
Signed-off-by: merlinwoff <merlin.woff@gmail.com>
  • Loading branch information
merlinwoff authored and ChristophWurst committed Jan 12, 2023
1 parent d389b54 commit f7a53e7
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
16 changes: 11 additions & 5 deletions apps/dav/lib/CalDAV/Schedule/IMipPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -268,12 +268,18 @@ public function schedule(Message $iTipMessage) {

$message->useTemplate($template);

$attachment = $this->mailer->createAttachment(
$iTipMessage->message->serialize(),
'event.ics',// TODO(leon): Make file name unique, e.g. add event id
'text/calendar; method=' . $iTipMessage->method
/*
** We choose to work like Thunderbird Lightning.
** using a plain text text/calendar ics.
** This plain text text/calendar part is needed for
** Microsoft Outlook versions <= 2010 to work.
*/
$itip_msg = $iTipMessage->message->serialize();
$message->attachInline(
$itip_msg,
'text/calendar; method=' . $iTipMessage->method,
'UTF-8'
);
$message->attach($attachment);

try {
$failed = $this->mailer->send($message);
Expand Down
24 changes: 24 additions & 0 deletions lib/private/Mail/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,30 @@ public function attach(IAttachment $attachment): IMessage {
return $this;
}

/**
* Can be used to "attach content inline" as message parts with specific MIME type and encoding.
*
* @param $body: body of the MIME part
* @param $content-type: MIME Content-Type (e.g. text/plain or text/calendar)
* @param $charset: Character Set (e.g. UTF-8)
* @return IMessage
* @since 26.0.0
*/
public function attachInline(string $body, string $contentType = null, string $charset = null): IMessage {
# To be sure this works with iCalendar messages, we encode with 8bit instead of
# quoted-printable encoding. We save the current encoder, replace the current
# encoder with an 8bit encoder and after we've finished, we reset the encoder
# to the previous one. Originally intended to be added after the message body,
# as it is curently unknown if all mail clients handle this properly if added
# before.
$encoder = $this->swiftMessage->getEncoder();
$eightbitEncoder = new \Swift_Mime_ContentEncoder_PlainContentEncoder('8bit');
$this->swiftMessage->setEncoder($eightbitEncoder);
$this->swiftMessage->addPart($body, $contentType, $charset);
$this->swiftMessage->setEncoder($encoder);
return $this;
}

/**
* SwiftMailer does currently not work with IDN domains, this function therefore converts the domains
* FIXME: Remove this once SwiftMailer supports IDN
Expand Down
11 changes: 11 additions & 0 deletions lib/public/Mail/IMessage.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ interface IMessage {
*/
public function attach(IAttachment $attachment): IMessage;

/**
* Can be used to "attach content inline" as message parts with specific MIME type and encoding.
*
* @param $body: body of the MIME part
* @param $content-type: MIME Content-Type (e.g. text/plain or text/calendar)
* @param $charset: Character Set (e.g. UTF-8)
* @return IMessage
* @since 26.0.0
*/
public function attachInline(string $body, string $contentType = null, string $charset = null): IMessage;

/**
* Set the from address of this message.
*
Expand Down

0 comments on commit f7a53e7

Please sign in to comment.