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


10

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

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

Я использую Mutt 1.5.22 с OfflineIMAP 6.5.5 на Fedora 20 (Heisenbug).

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

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

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

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

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), но опять же, казалось, ничего не было связано с календарями или приглашениями.

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

Фильтр папок моего .offlineimaprc не синхронизирует папку Календаря. Это связано с тем, что каждый раз, когда OfflineIMAP пытался выполнить синхронизацию, при синхронизации папки «Календарь» он сталкивался с более чем сотней экземпляров одной и той же ошибки: «ОШИБКА: IMAP-сервер« удаленный »не имеет сообщения с 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). Если решение потребует от меня написания инструмента, пусть будет так. Толчок в правильном направлении будет принята с благодарностью.


Эта ссылка может быть полезна: blogs.technet.com/b/timmcmic/archive/2013/11/10/…
SEOF

1
@SEoF Я преобразовал ваш ответ в комментарий, содержащий ссылку, на которую вы ссылались. Поскольку ваш ответ объяснял, что у вас не получилось, я удалил его. Пожалуйста, публикуйте только ответы, которые действительно объясняют, как решить проблему, ссылки на внешние ресурсы не считаются ответами.
Terdon

Ответы:


3

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

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

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


Я устал от попыток работать с вложениями электронной почты, чтобы написать свой собственный календарь Outlook, чтобы напомнить программу экспорта. Он напрямую вызывает API-интерфейс Office-365 и может выводить различные вещи, в том числе напоминать отформатированные записи. Назвал его ihol (Я ненавижу OutLook) .. github.com/eikenb/ihol
Джон Эйкенберри

1

Ссылка, предоставленная 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 - идентификатор YOUR@EMAIL.ADDRESS | Format-List
  9. Set-CASMailbox -identity YOUR@EMAIL.ADDRESS -PopUseProtocolDefaults: $ FALSE -ImapUseProtocolDefaults: $ FALSE -PopForceICalForCalendarRetrievalOption: $ TRUE -ImapForceICalForCalendarRetrievalOption: $ TRUE
  10. Remove-PSSession $ Session
  11. Set-ExecutionPolicy -ExecutionPolicy Restricted

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


Это сработало отлично. Спасибо за подробные инструкции.
Джейсон Дэй

0

Не совсем то, что спрашивал OP, но если сторонняя логика разрешена, тогда посмотрите на фантастический exchangelib (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))

Еще одна хорошая библиотека - github.com/Narcolapser/python-o365
Джон Эйкенберри,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.