Экспорт событий из email в Google-календарь в один клик — подводные камни

    image

    Как одну из возможностей сервиса предварительной записи клиентов zabroniruy.com реализовывали идею, чтобы клиент получал всю информацию о предстоящих события в формате, который можно легко экспортировать (желательно в один клик) в существующие планировщики задач. В ходе работы столкнулись с тем, что не все планировщики одинаково “дружелюбны” к разработчикам.

    За основу взяли формат iCalendar — этот формат простой и поддерживается многими приложениями.

    С самим форматом никаких проблем не возникло. Просто добавили вложение в письмо и пользователь Outlook или Evolution (тестировали в этих приложениях) может экспортировать данные в свой календарь в один клик. Но мы хотели, чтобы пользователи Gmail имели возможность так же легко добавлять события в свой Google календарь, вместо того, чтобы скачивать файл и затем экспортировать его в календарь (мало кто станет таким заниматься).

    И вот тут началось самое интересное. Google отображает иконку календаря для письма с вложенным ics файлом, но вложение можно только скачать. Но в Gmail есть опция “Вставить приглашение” и в этом случае получателю отправится письмо с вложением, которое можно импортировать в свой Google календарь в один клик. Вот этого мы и захотели добиться. Поиск в самом Google ничего не дал, пришлось своими силами искать причину того, что наше вложение не обрабатывается так же, как и письмо с приглашением, созданное напрямую из Gmail.

    Код прикрепления файла к письму в этот момент выглядел вот так:
    $mailer->createAttachment(
        $data,
        Zend_Mime::TYPE_OCTETSTREAM,
        Zend_Mime::DISPOSITION_ATTACHMENT,
        Zend_Mime::ENCODING_BASE64,
        'icalendar-file.ics'
    );
    


    До того, как мы получили первую работоспособную версию, испробовали разные подходы, но решение, как часто бывает, оказалось очень простым. Изучив письмо с приглашением из Gmail, мы заметили, что отсутствует загловок Content-Disposition, т.е. вложение добавленно в письмо как inline. Мы установили заголовок Сontent-disposition: inline в письме, сгенерированный нашим сервисом, сменили Content-type у вложения, чтобы указать тип файла, добавили method=REQUEST, чтобы Outlook принимал письмо как приглашение и “свершилось чудо”: в Gmail появилась ссылка “Добавить в календарь”, а Outlook стал отображать письмо как приглашение на событие.

    Решение для ZendFramework:
    $mailer->createAttachment(
        $data,
        'text/calendar; charset=UTF-8; method=REQUEST',
        Zend_Mime::DISPOSITION_INLINE,
        Zend_Mime::ENCODING_BASE64,
        'icalendar-file.ics'
    );
    $mailer->setType(Zend_Mime::MULTIPART_ALTERNATIVE);
    

    multipart/alternative — указывает на то, что в частях сообщения используются разные типы content/type.

    Вот так это выглядит в Evolution:
    image

    И вот так в Outlook:
    image

    Автор решения, наш программист Дмитрий, к сожалению, не имеет аккаунта на хабре, поэтому отвечать на вопросы буду я.
    • +23
    • 9.4k
    • 7
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 7

    • UFO just landed and posted this here
        0
        оффтоп, но Ужас у вас со шрифтами на верхнем скрине!
          +1
          Согласен. Но привык к ним — дефолтные шрифты убунты
            0
            Проблема такая только с хромом. В других приложениях все хорошо.
              +1
              Увеличьте изображение, посмотрите: у вас проблема с субпиксельным антиалиасингом — он вертикальный.
          0
          К сожалению, такие приглашения я не смог переносить в гугл.календаре в другие календари, отличные от основного. Почему-то записи дублируются.
            0
            Вот бы такой же хак для экспорта контактов из VCF и т.п.

            Only users with full accounts can post comments. Log in, please.