Как прикрепить календарь к письму?

    Как прикрепить календарь к письму?

    Многие из нас видели подобные письма в Gmail (когда, например, в Google календаре кто-то нам отправляет приглашение). Похожие вложения существуют и в других почтовых клиентах.

    Письма с календарём удобны для назначения встреч, для отправки каких-либо событий. И вовсе не обязательно для этого интегрироваться в «тесную среду» Google.

    Ранее я уже рассказывал о том, как правильно отправлять письма в PHP и как прикреплять к письмам файлы. Теперь мы попробуем расширить наш класс и прикрепить Гугл календарь к письму. Все наши действия аналогичны для всех библиотек для работы с почтой – PHPMailer, Pear или SwiftMailer.

    Формат iCalendar

    Формат iCalendar

    iCalendar – это компьютерный формат, который позволяет интернет-пользователям, отправить приглашения на встречи и задачи других пользователей по электронной почте, или с помощью обмена файлами с расширением .ics. Получатели файла iCalendar (При поддержке почтового клиента или приложения календаря) могут легко реагировать отправителю согласием или предложить другую дату и время встречи. (Стандарт RFC 5545).

    iCalendar используется и поддерживается большим количеством продуктов, в том числе Календарём Google, Apple Календарём (ранее iCal), IBM Lotus Notes, Yahoo! Календарём, Evolution, частично Microsoft Outlook и Novell GroupWise.

    Так что же надо для того, чтобы подключить Google календарь?

    Для начала сформируем библиотеку для работы с календариком в формате iCalendar. Нам понадобятся 2 класса - BCalendar (для работы с календарём) и BCalendarEvent - для подключения событий к календарю.

    Вот наша основная функция, которая формирует набор данных в формате iCalendar:

    1. /**
    2.  * Метод, формирующий календарь в формате iCalendar.
    3.  */
    4.  public function print_icalendar(){
    5.    $data='';
    6.    $data.='BEGIN:VCALENDAR'.PHP_EOL;
    7.    $data.='PRODID:-//Brilliant//Brilliant Mailer 1.0.0//EN'.PHP_EOL;
    8.    $data.='VERSION:2.0'.PHP_EOL;
    9.    $data.='CALSCALE:GREGORIAN'.PHP_EOL;
    10.    $data.='METHOD:REQUEST'.PHP_EOL;
    11.    foreach($this->events as $event){
    12.       $data.='BEGIN:VEVENT'.PHP_EOL;
    13.       //Event start
    14.       $dtstart_utc=clone $event->dtstart;
    15.       $dtstart_utc->setTimezone(new DateTimeZone('UTC'));
    16.       $data.='DTSTART:'.$dtstart_utc->format('Ymd\THis\Z').PHP_EOL;
    17.       //
    18.       $dtend_utc=clone $event->dtend;
    19.       $dtend_utc->setTimezone(new DateTimeZone('UTC'));
    20.       $data.='DTEND:'.$dtend_utc->format('Ymd\THis\Z').PHP_EOL;
    21.       //Date/Time stamp. Looks like current date/time...
    22.       $dtstamp_utc=clone $event->created;
    23.       $dtstamp_utc->setTimezone(new DateTimeZone('UTC'));
    24.       $data.='DTSTAMP:'.$dtstamp_utc->format('Ymd\THis\Z').PHP_EOL;
    25.       //Organizer
    26.       $organizer=$event->organizer_name.':mailto:'.$event->organizer_email;
    27.       $data.='ORGANIZER;CN='.$organizer.PHP_EOL;
    28.       //
    29.       $dtcreated_utc=clone $event->created;
    30.       $dtcreated_utc->setTimezone(new DateTimeZone('UTC'));
    31.       $data.='CREATED:'.$dtcreated_utc->format('Ymd\THis\Z').PHP_EOL;
    32.       //
    33.       $data.='DESCRIPTION:'.$event->description.PHP_EOL;
    34.       //
    35.       $dtmodified_utc=clone $event->modified;
    36.       $dtmodified_utc->setTimezone(new DateTimeZone('UTC'));
    37.       $data.='LAST-MODIFIED:'.$dtmodified_utc->format('Ymd\THis\Z').PHP_EOL;
    38.       //
    39.       $data.='LOCATION:'.$event->location.PHP_EOL;
    40.       $data.='SEQUENCE:0'.PHP_EOL;
    41.       $data.='STATUS:CONFIRMED'.PHP_EOL;
    42.       $data.='SUMMARY:'.$event->summary.PHP_EOL;
    43.       $data.='TRANSP:OPAQUE'.PHP_EOL;
    44.       $data.='END:VEVENT'.PHP_EOL;
    45.       }
    46.    $data.='END:VCALENDAR'.PHP_EOL;
    47.    return $data;
    48.    }

    Также в классе присутствуют методы addEvent и createEvent для добавления событий. Не библиотека, а библиотечка прям какая-то :-).

    Тестируем отправку

    Возьмём за основу библиотеку отправки почты, которую мы писали ранее. Подключить наш календарик не составит труда

    Подключение календаря с нашей новой библиотекой выглядит так:

    1. $calendar=new BCalendar();
    2. $calendar->createEvent(
    3.    new DateTime('2015-08-12 23:00'),
    4.    new DateTime('2015-08-12 23:30'),
    5.    'Название события',
    6.    'Описание события',
    7.    'Записки Консерваторов',
    8.    'noreply@konservs.com',
    9.    '25, улица Комарова, Черновцы');
    10. $email=new TEmail();
    11. $email->from_email='noreply@konservs.com';
    12. $email->from_name='От "Записок Консерваторов"';
    13. $email->to_email='*********';
    14. $email->subject='Письмо с календарём';
    15. $email->body('text/html','<p>Письмо в HTML с вложениями.</p>');
    16. $email->attachdata('text/calendar','event.ics',$calendar->print_icalendar());
    17. $result=$email->send();
    18. echo(($result?'Email успешно отправлен.':'Ошибка отправки email!').'<br>');

    На почту приходит письмо следующего вида:

    Пример письма с календарём

    Послесловие

    Мы рассмотрели наиболее частую потребность - добавление приглашения на событие. На самом же деле, формат iCalendar поддерживает гораздо большие возможности. Стандарт утверждает что можно даже поднять свой маленький сервис календарей / событий и позволить получателям отвечать на них прям из почтовых клиентов. Но это уже тема отдельной статьи.

    Рабочий пример можно скачать тут: email-google-calendar.zip.

    Комментарии

    Пока еще никто не комментировал эту запись. Вы можете быть первым!

    Captcha Обновить
    Go Top