
Многие из нас видели подобные письма в Gmail (когда, например, в Google календаре кто-то нам отправляет приглашение). Похожие вложения существуют и в других почтовых клиентах.
Письма с календарём удобны для назначения встреч, для отправки каких-либо событий. И вовсе не обязательно для этого интегрироваться в «тесную среду» Google.
Ранее я уже рассказывал о том, как правильно отправлять письма в PHP и как прикреплять к письмам файлы. Теперь мы попробуем расширить наш класс и прикрепить Гугл календарь к письму. Все наши действия аналогичны для всех библиотек для работы с почтой – PHPMailer, Pear или SwiftMailer.
Формат 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:
/**
* Метод, формирующий календарь в формате iCalendar.
*/
public function print_icalendar(){
$data='';
$data.='BEGIN:VCALENDAR'.PHP_EOL;
$data.='PRODID:-//Brilliant//Brilliant Mailer 1.0.0//EN'.PHP_EOL;
$data.='VERSION:2.0'.PHP_EOL;
$data.='CALSCALE:GREGORIAN'.PHP_EOL;
$data.='METHOD:REQUEST'.PHP_EOL;
foreach($this->events as $event){
$data.='BEGIN:VEVENT'.PHP_EOL;
//Event start
$dtstart_utc=clone $event->dtstart;
$dtstart_utc->setTimezone(new DateTimeZone('UTC'));
$data.='DTSTART:'.$dtstart_utc->format('Ymd\THis\Z').PHP_EOL;
//
$dtend_utc=clone $event->dtend;
$dtend_utc->setTimezone(new DateTimeZone('UTC'));
$data.='DTEND:'.$dtend_utc->format('Ymd\THis\Z').PHP_EOL;
//Date/Time stamp. Looks like current date/time...
$dtstamp_utc=clone $event->created;
$dtstamp_utc->setTimezone(new DateTimeZone('UTC'));
$data.='DTSTAMP:'.$dtstamp_utc->format('Ymd\THis\Z').PHP_EOL;
//Organizer
$organizer=$event->organizer_name.':mailto:'.$event->organizer_email;
$data.='ORGANIZER;CN='.$organizer.PHP_EOL;
//
$dtcreated_utc=clone $event->created;
$dtcreated_utc->setTimezone(new DateTimeZone('UTC'));
$data.='CREATED:'.$dtcreated_utc->format('Ymd\THis\Z').PHP_EOL;
//
$data.='DESCRIPTION:'.$event->description.PHP_EOL;
//
$dtmodified_utc=clone $event->modified;
$dtmodified_utc->setTimezone(new DateTimeZone('UTC'));
$data.='LAST-MODIFIED:'.$dtmodified_utc->format('Ymd\THis\Z').PHP_EOL;
//
$data.='LOCATION:'.$event->location.PHP_EOL;
$data.='SEQUENCE:0'.PHP_EOL;
$data.='STATUS:CONFIRMED'.PHP_EOL;
$data.='SUMMARY:'.$event->summary.PHP_EOL;
$data.='TRANSP:OPAQUE'.PHP_EOL;
$data.='END:VEVENT'.PHP_EOL;
}
$data.='END:VCALENDAR'.PHP_EOL;
return $data;
}
Также в классе присутствуют методы addEvent и createEvent для добавления событий. Не библиотека, а библиотечка прям какая-то :-).
Тестируем отправку
Возьмём за основу библиотеку отправки почты, которую мы писали ранее. Подключить наш календарик не составит труда
Подключение календаря с нашей новой библиотекой выглядит так:
$calendar=new BCalendar();
$calendar->createEvent(
new DateTime('2015-08-12 23:00'),
new DateTime('2015-08-12 23:30'),
'Название события',
'Описание события',
'Записки Консерваторов',
'noreply@konservs.com',
'25, улица Комарова, Черновцы');
$email=new TEmail();
$email->from_email='noreply@konservs.com';
$email->from_name='От "Записок Консерваторов"';
$email->to_email='*********';
$email->subject='Письмо с календарём';
$email->body('text/html','<p>Письмо в HTML с вложениями.</p>');
$email->attachdata('text/calendar','event.ics',$calendar->print_icalendar());
$result=$email->send();
echo(($result?'Email успешно отправлен.':'Ошибка отправки email!').'<br>');
На почту приходит письмо следующего вида:

Послесловие
Мы рассмотрели наиболее частую потребность - добавление приглашения на событие. На самом же деле, формат iCalendar поддерживает гораздо большие возможности. Стандарт утверждает что можно даже поднять свой маленький сервис календарей / событий и позволить получателям отвечать на них прям из почтовых клиентов. Но это уже тема отдельной статьи.
Рабочий пример можно скачать тут: email-google-calendar.zip.
Комментарии
Пока еще никто не комментировал эту запись. Вы можете быть первым!
Adding comments is temporarily disabled for unregistered users.