32
Adding events to calendar automatically from email
Many email clients can show a small calendar widget with info about event sent in email. That one can also appear in the user's calendar, but only, if is well-formatted.
🇨🇿 V ÄŤeštinÄ› si lze ÄŤlánek pĹ™eÄŤĂst na kutac.cz
The email client can show info about the event based on attached iCalendar (*.ics
) file. However, it must satisfy a few easy requirements:
- Attach
*.ics
file with all information about the event. - Body of the
*.ics
file must contain propertyMETHOD:REQUEST
. - The Content-Type of the attachment must also contain
method=REQUEST
part. - The
Attendee
property must be part of the body of iCal file and must contain the email address of the recipient.
Below is the code in PHP for Laravel framework with spatie/icalendar-generator library. For more about sending emails in Laravel framework check the documentation.
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 with iCal 101")
->attendee("[email protected]")
->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("Invitation")
->markdown('mail.invite.created')
->attachData($calendar->get(), 'invite.ics', [
'mime' => 'text/calendar; charset=UTF-8; method=REQUEST',
]);
}
}
Everything described above is enough to make it work. But every email client behaves differently. And that produces some issues. In the code I skipped the ->organizer()
part, and on purpose. When the organizer is specified, email clients are sending emails when the user accepts or declines the invitation. So it can spam the organizer mailbox. Especially when the system is sending hundreds of emails.
However, web Outlook is sending those emails even if the organizer is not specified. Then the response is sent to the sender email. But what is even worse, Outlook will delete this email after accepting or declining! This can be changed in the settings, but may confuse less skilled users. Especially when the email contains tickets or payment information.
It is possible to filter out those automatic replies. But it is not so easy, so most likely normal filter in the email client will not be enough. And probably some filter on the email server must be used.
The reply contains the same *.ics
file. But instead of REQUEST method, it has method=REPLY
in the Content-Type and METHOD:REPLY
inside the body of the file.
GMail supports much more than just a calendar widget. It can show information about your upcoming flights, hotel reservations, or Call to action button directly in the email list. But that is more complicated and you must register your application to have this available. But it is still possible and more can be found on Email markup page.
I would appreciate, if anyone solved some issues described here and would share them in comment.
32