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

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

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

    Комментарии

    16.10.2018 10:47:26
    Avatar of GetaBusinessFundedGetaBusinessFunded
    Faster and Easier than the SBA, http://Get-a-Business-Funded.com can get your business a loan for $2K-350,000 With low-credit and no collateral.

    Use our short form to See exactly how much you can get, No-Cost:

    http://Get-a-Business-Funded.com

    If you've been in business for at least 1 year you are already pre-qualified. Our Fast service means funding can be completed within 48hrs. Terms are specific for each business so I suggest applying to find out exactly how much you can get.

    This is a free service from a qualified lender and the approval will be based on the annual revenue of your business. Funds have no Restrictions, allowing you to use the full amount in any way including bills, taxes, hiring, marketing, expansion, or Absolutely Any Other expense.

    There are limited SBA and private funds available so please apply now if interested:

    http://Get-a-Business-Funded.com

    Have a great day,
    The Get a Business Funded Team

    remove here - http://Get-a-Business-Funded.com/r.php?url=konservs.com&id=e119
    16.10.2018 10:48:13
    Avatar of BusinessFunding247BusinessFunding247
    Faster and Easier than the SBA, http://BusinessFunding247.com can get your business a loan for $2K-350,000 With low-credit and without collateral.

    Use our quick form to Find Out exactly how much you can get, No-Cost:

    http://BusinessFunding247.com

    If you've been established for at least a year you are already pre-qualified. Our Fast service means funding can be finished within 48hrs. Terms are specific for each business so I suggest applying to find out exactly how much you can get.

    This is a free service from a qualified lender and the approval will be based on the annual revenue of your business. Funds are also Non-Restrictive, allowing you to use the full amount in any way including bills, taxes, hiring, marketing, expansion, or Absolutely Any Other expense.

    There are limited SBA and private funds available so please apply now if interested:

    http://BusinessFunding247.com

    Have a great day,
    The Business Funding 247 Team

    remove here - http://BusinessFunding247.com/r.php?url=konservs.com&id=e119
    Captcha Обновить
    Go Top