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

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

Многие из нас видели подобные письма в 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.

Комментарии

14.09.2017 12:40:20
Avatar of RobertHaklyRobertHakly
гостиная Роза
http://pronews24.ru/

----------
21.09.2017 02:03:49
Avatar of wElenaFutwElenaFut
Работа в интернете
11.10.2017 01:29:12
Avatar of
http://w.w/
Captcha Обновить
Go Top