Как получать приглашения на встречу от Office365, чтобы их можно было разобрать и добавить в календарь?

Как получить iCalendar (.ics или .ical) приглашения на приглашение от outlook.office365.com, чтобы они могли анализироваться и добавляться в календарь (например, напоминать + wyrd)?

Я долго искал ответ, но ничего не нашел, поэтому я задаюсь вопросом, просто ли я пропустил что-то действительно тривиальное.

Я использую Mutt 1.5.22 с автономным интерфейсом 6.5.5 на Fedora 20 (Heisenbug).

Существует множество сценариев для разбора сообщений iCalendar в форматах, которые можно импортировать в календари. Это не моя проблема. Моя проблема в том, что я даже не получаю сообщения iCalendar, поэтому мне нечего разбирать.

Приглашение на собрание поступает в мой почтовый ящик в виде текстового / html-сообщения с базой64. Это не многостраничное сообщение, и нет вложений . Тело сообщения содержит ссылку на Microsoft Outlook Web Access (OWA). После ссылки, похоже, ничего не происходит, кроме как взять меня на веб-почту. Остальная часть тела электронной почты содержит описание приглашения на собрание.

Я попробовал переадресовать приглашение и переслать приглашение в качестве вложения, но ни одно из них не повлияло на формат сообщения.

Я проверил заголовки сообщения, но ничего не выделялось как важное. Я скопировал их здесь, если они что-то означают для кого-то:

Received: from [...] by [...] with Microsoft SMTP Server (TLS) id [...] via Mailbox Transport; [timestamp] Received: from [...] by [...] with Microsoft SMTP Server (TLS) id [...]; [timestamp] Received: from [...] by [...] with Microsoft SMTP Server (TLS) id [...]; [timestamp] Received: from [...] by [...] with mapi id [...]; [timestamp] From: [meeting organiser] To: [meeting attendees] Subject: [meeting subject] Thread-Topic: [meeting subject] Thread-Index: [...] Sender: [sender on behalf of meeting organiser] Date: [timestamp] Message-ID: <[...]> Accept-Language: en-US Content-Language: en-US X-MS-Exchange-Organization-AuthAs: Internal X-MS-Exchange-Organization-AuthMechanism: 03 X-MS-Exchange-Organization-AuthSource: [...] X-MS-Has-Attach: X-MS-Exchange-Organization-SCL: -1 X-MS-TNEF-Correlator: Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 

Я также проверил заголовки сообщения в WebMail. Было больше заголовков (некоторые были связаны с tnef), но опять же, ничто не казалось связанными с календарями или приглашениями.

Я сравнил заголовки «приглашения на встречу» с заголовками обычной электронной почты. Единственное различие заключалось в том, что обычный email содержит дополнительный заголовок: «X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply».

У моего фильтра .offlineimaprc установлен флажок, чтобы не синхронизировать папку «Календарь». Это связано с тем, что каждый раз, когда OfflineIMAP пытался синхронизировать, он запускал более сотни экземпляров одной и той же ошибки при синхронизации папки «Календарь»: «ERROR: IMAP-сервер« remote »не имеет сообщения с UID […] «.

Использование imaplib Python для проверки папки «Календарь»:

 >>> import imaplib >>> i = imaplib.IMAP4_SSL("outlook.office365.com", 993) >>> i.login("NAME@COMPANY.com", "PASSWORD") ('OK', ['LOGIN completed.']) >>> i.select("Calendar") ('OK', ['159']) >>> i.fetch(159, "(RFC822)") ('OK', [None]) >>> i.fetch(159, "(RFC822)") 

Во второй раз, когда я вызываю fetch, он возвращает сообщение: «Сервер не смог получить следующее сообщение. Сообщение не было удалено. Возможно, вы сможете просмотреть его с помощью Outlook или Outlook Web App. отправителя, чтобы узнать, что говорится в сообщении ».

В WebMail я вижу, что папка «Календарь» (доступная на вкладке «Календарь») имеет разрешения для видимости вне организации . В настоящее время установлено значение «Не общий». Другие варианты: «Доступность только», «Ограниченная информация» или «Полная информация». Установка разрешений на «Полная информация», а затем отправка приглашения на собрание мне не повлияла на формат приглашения на собрание.

В качестве обходного пути для получения сообщения iCalendar у меня есть Thunderbird с надстройкой Lightning. Так или иначе, дополнение Lightning знает, как получать приглашения на собрание. Сообщения по-прежнему отображаются как text / html, но есть ссылка в строке состояния Thunderbird. При нажатии на это открывается запрос с просьбой отклонить или принять приглашение.

У кого-нибудь есть идеи, почему приглашения от Outlook 365 поступают как простые текстовые / html-сообщения, а не сообщения iCalendar? Я могу что-нибудь сделать? Если надстройка Lightning может работать с приглашениями, тогда должно быть решение, например, с использованием веб-служб Microsoft Exchange (EWS). Если решение потребует от меня кода для инструмента, пусть будет так. Было бы высоко оценено толчок в правильном направлении.

Ссылка, предоставленная SEoF, была отличным предложением. По-моему, сообщение в блоге неполно, но мне удалось начать с правильного пути. Я сделал еще несколько копаний и подготовил полный список шагов для получения Office 365 для отправки мне приглашений на собрание в формате iCalendar (.ics).

Обратите внимание, что я не администратор, и мне не нужно ни с кем обращаться, чтобы предоставить мне какие-либо привилегии. Единственное предостережение в том, что вам нужен доступ к окну Windows. Как только вы измените настройки через Windows, вы можете вернуться к использованию какой бы ОС вы раньше не использовали. Я сделал это самостоятельно, как обычный пользователь, использующий Windows 7:

  1. Загрузите и установите Microsoft .NET Framework 4.5 с http://www.microsoft.com/en-us/download/details.aspx?id=30653 .
  2. Загрузите и установите Windows Management Framework 4.0 (Windows6.1-KB2819745-x64-MultiPkg.msu) с http://www.microsoft.com/en-us/download/details.aspx?id=40855 .
  3. Запустите PowerShell в качестве администратора.
  4. Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  5. $ UserCredential = Get-Credential
    • Введите свой адрес электронной почты и пароль.
  6. $ Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $ UserCredential -Authentication Basic -AllowRedirection
  7. $ ImportResults = Import-PSSession $ Session
  8. Get-CASMailbox -identity YOUR@EMAIL.ADDRESS | Format-List
  9. Set-CASMailbox -identity YOUR@EMAIL.ADDRESS -PopUseProtocolDefaults: $ FALSE -ImapUseProtocolDefaults: $ FALSE -PopForceICalForCalendarRetrievalOption: $ TRUE -ImapForceICalForCalendarRetrievalOption: $ TRUE
  10. Удалить-PSSession $ Session
  11. Set-ExecutionPolicy -ExecutionPolicy Restricted

Теперь мой mutt в Linux получает приглашения на собрания в формате iCalendar (.ics).

Вы можете установить его так, чтобы Office 365 / Outlook отправил приглашения, отформатированные в формате iCalendar, через веб-интерфейс.

  1. Войдите в свою учетную запись Office 365
  2. Приложение Open Mail (Outlook)
  3. Нажмите на значок шестеренки в правом верхнем углу (настройки)
  4. В поле поиска введите «imap»
  5. Выберите «Pop and IMAP»
  6. Внизу выберите «Отправить приглашения на событие в формате iCalendar» для POP и / или IMAP.
  7. Хит "Сохранить"

Теперь вы должны получить все приглашения в формате iCalendar.

Не совсем то, что задал ОП, но если разрешена третья партийная логика, то ознакомьтесь с фантастическим обменником (python). Быстрый пример py3 для извлечения событий в течение следующих 3 месяцев (обратите внимание, что повторяющиеся элементы были расширены):

 import arrow # not required, but highly recommended lib for time processing import base64 from tzlocal import get_localzone from subprocess import call from exchangelib import DELEGATE, Account, Credentials, EWSDateTime CREDENTIALS = Credentials(username='mymail@company.com', password='topsecret') ACCOUNT = Account(primary_smtp_address='mymail@company.com', credentials=CREDENTIALS, autodiscover=True, access_type=DELEGATE) def sanitize(p): '''some .ical files didn't have proper end:vcalendar closure''' end = 'END:VCALENDAR\n' s = base64.b64decode(p).decode().replace("\r\n", "\n") if not s.endswith(end): s += end return s tz = get_localzone() now = arrow.now() upper_limit = now.replace(months=+3) items = ACCOUNT.calendar.view( start=tz.localize(EWSDateTime(now.year, now.month, now.day)), end=tz.localize(EWSDateTime(upper_limit.year, upper_limit.month, upper_limit.day)), ) cals = [] # list of .ical files' contents for item in items: cals.append(sanitize(item.mime_content))