Události do kalendáře z emailové pozvánky

PHP, Laravel, Tipy & triky

Mnoho emailových klientů dokáže zobrazit widget s informace o nadcházející události. Ta se poté může propsat do kalendáře uživatele, ale pouze v případě, že je vložena ve správném formátu.

Události do kalendáře z emailové pozvánky

Article in English can be found on dev.to/arxeiss/adding-events-to-calendar-automatically-from-email-1h0a

Aby emailový klient dokázal zobrazit informace o události a případně ji vložil do kalendáře, musí informace dostat správně naservírované. Základem je příloha ve formátu iCalendar, která splňuje pár jednoduchých podmínek. V článku Email markup je pak popsáno, jak přidat CTA tlačítko, informace o letu nebo rezervaci hotelu. To ale vyžaduje registraci aplikace v Google včetně úprav systému. Pro jednoduchou událost nic z toho naštěstí potřeba není, stačí správně vložena příloha.

Method Request a Attendee

Aby emailový klient událost zobrazil a přidal do kalendáře, je potřeba splnit 3 podmínky níže. Pod nimi je pak kód v PHP s použitím knihovny spatie/icalendar-generator, a odeslání emailem ve frameworku Laravel. Více o emailech v Laravelu lze nalézt v dokumentaci.

  1. Přidání přílohy ve formátu *.ics, tedy iCal, která obsahuje všechny údaje o události.
  2. V souboru *.ics musí být zahrnut atribut METHOD:REQUEST, který musí být obsažen také v hlavičce Content-Type dané přílohy jako method=REQUEST.
  3. V souboru *.ics musí být také vložen atribut Attendee, který obsahuje emailovou adresu příjemce. Případně i jeho jméno, to ale není nutné.
use Carbon\Carbon;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Spatie\IcalendarGenerator\Components\Calendar;
use Spatie\IcalendarGenerator\Components\Event;
use Spatie\IcalendarGenerator\Properties\TextProperty;

class EventCreatedNotification extends Notification
{
    // ...
    
    public function toMail(): MailMessage
    {
        $calendar = Calendar::create()
            ->productIdentifier('Kutac.cz')
            ->event(function (Event $event) {
                $event->name("Email s iCal pozvánkou")
                    ->attendee("attendee@gmail.com")
                    ->startsAt(Carbon::parse("2021-12-15 08:00:00"))
                    ->endsAt(Carbon::parse("2021-12-19 17:00:00"))
                    ->fullDay()
                    ->address('Online - Google Meet');
            });
        $calendar->appendProperty(TextProperty::create('METHOD', 'REQUEST'));        

        return (new MailMessage())
            ->subject("Pozvánka")
            ->markdown('mail.invite.created')
            ->attachData($calendar->get(), 'invite.ics', [
                'mime' => 'text/calendar; charset=UTF-8; method=REQUEST',
            ]);
    }
}

Pak přichází problémy

Vše, co je výše popsáno bude fungovat tak, jak je. Jenže každý emailový klient se chová jinak. V příkladu je záměrně vynecháno volání metody ->organizer(). Jakmile totiž je organizátor specifikován, každé potvrzení události okamžitě odešle na email organizátora zprávu, že daný host pozvánku přijal. A třeba takový webový Outlook tuto zprávu odešle vždy. Pokud není organizátor specifikován, zprávu odešle na adresu odesílatele.

Co je však ještě horší, webový Outlook v základním chování po potvrzení události email smaže! Toto se dá změnit v nastavení. Jenže když v emailu jsou třeba údaje o platbě a další, hodně uživatelům by to život spíše komplikovalo.

Z těchto důvodů proto *.ics přílohy posílám pouze na adresy @gmail.com nebo @seznam.cz. Ani jeden automatické odpovědi neodesílá ani emaily nemaže. 

Automatické odpovědi lze odfiltrovat

Automatické odpovědi, které jsou odesílány při reakci na pozvánku lze odfiltrovat. Filtr ale musí být pokročilejší, než nabízejí běžní klienti. Je tedy potřeba filtraci provést spíše na úrovni poštovního serveru. A to může být omezující především pro menší firmy, které používají webhostingy a jiné. Každá odpověď s reakcí na zprávu totiž opět obsahuje stejnou přílohu. Jen místo REQUEST v metodě je zde method=REPLY v hlavičce přílohy a METHOD:REPLY v těle *.ics souboru.

Další možnost by samozřejmě mohla být dát organizátora s emailem no-reply apod. Jenže tento email pak je i často v kalendáři a jednoduše by se mohlo stát, že na takový email někdo pošle relevantní zprávu. Navíc používání no-reply adres se spíše nedoporučuje.


Máte s pozvánkami v emailu zkušenosti? Našli jste lepší řešení, jak odfiltrovat automatické odpovědi? Podělte se s ostatními v komentářích

K tomuto článku již není možné přidávat další komentáře