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

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

    Многие из нас видели подобные письма в 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.11.2018 07:22:08
    Avatar of ВикторВиктор
    Перезвоните мне пожалуйста 8(495) 230-10-78 Виктор
    22.11.2018 08:13:52
    Avatar of ProFund247ProFund247
    Hi, letting you know that http://ProFund-247.com can find your business a SBA or private loan for $2,000 - $350K Without high credit or collateral.

    Find Out how much you qualify for by clicking here:

    http://ProFund-247.com

    Minimum requirements include your company being established for at least a year and with current gross revenue of at least 120K. Eligibility and funding can be completed in as fast as 48hrs. Terms are personalized for each business so I suggest applying to find out exactly how much you can get on various terms.

    This is a free service from a qualified lender and the approval will be based on the annual revenue of your business. These funds are Non-Restrictive, allowing you to spend the full amount in any way you require including business debt consolidation, hiring, marketing, or Absolutely Any Other expense.

    If you need fast and easy business funding take a look at these programs now as there is limited availability:

    http://ProFund-247.com

    Have a great day,
    The Pro Fund 247 Team

    unsubscribe/remove - http://ProFund-247.com/r.php?url=konservs.com&id=e122
    23.11.2018 02:26:35
    Avatar of ДмитрийДмитрий
    Перезвоните мне пожалуйста 8(499) 322-46-85, не обращайте внимания на робота, просто дождитесь ответа, Дмитрий.
    05.12.2018 07:57:55
    Avatar of ProFunding247ProFunding247
    Hi, letting you know that http://ProFunding247.info can find your business a SBA or private loan for $2,000 - $350K Without high credit or collateral.

    Find Out how much you qualify for by clicking here:

    http://ProFunding247.info

    Minimum requirements include your company being established for at least a year and with current gross revenue of at least 120K. Eligibility and funding can be completed in as fast as 48hrs. Terms are personalized for each business so I suggest applying to find out exactly how much you can get on various terms.

    This is a free service from a qualified lender and the approval will be based on the annual revenue of your business. These funds are Non-Restrictive, allowing you to spend the full amount in any way you require including business debt consolidation, hiring, marketing, or Absolutely Any Other expense.

    If you need fast and easy business funding take a look at these programs now as there is limited availability:

    http://ProFunding247.info

    Have a great day,
    The Pro Funding 247 Team

    unsubscribe/remove - http://ProFunding247.info/r.php?url=konservs.com&id=e122
    Captcha Обновить
    Go Top