Outlook.office365.comからiCalendar(.icsまたは.ical)会議への招待を受信して、それらを解析してカレンダー(メモ+ wyrdなど)に追加する方法を教えてください。
私は長い間懸命に答えを探しましたが、何も見つからなかったので、ほんの些細なことを見逃しているのではないかと思います。
Fedora 20(Heisenbug)のOfflineIMAP 6.5.5でMutt 1.5.22を使用しています。
ICalendarメッセージをカレンダーにインポートできる形式に解析するためのスクリプトはたくさんあります。これはnot私の問題です。私の問題は、iCalendarメッセージも受信していないため、解析するものがないことです。
会議の招待状が、base64でエンコードされたtext/htmlメッセージとして受信トレイに届きます。 notマルチパートメッセージであり、not attachmentがあります。メッセージの本文には、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-Auto-Response-Suppress:DR、RN、NRN、OOF、AutoReply」。
.offlineimaprcのfolderfilterがCalendarフォルダーを同期しないように設定されています。これは、OfflineIMAPが同期しようとするたびに、Calendarフォルダーの同期中に同じエラーが100回以上発生するためです。 」
Pythonのimaplibを使用してCalendarフォルダーを検査します。
>>> import imaplib
>>> i = imaplib.IMAP4_SSL("Outlook.office365.com", 993)
>>> i.login("[email protected]", "PASSWORD")
('OK', ['LOGIN completed.'])
>>> i.select("Calendar")
('OK', ['159'])
>>> i.fetch(159, "(RFC822)")
('OK', [None])
>>> i.fetch(159, "(RFC822)")
2回目にfetchを呼び出すと、「サーバーは次のメッセージを取得できませんでした。メッセージは削除されていません。OutlookまたはOutlook Web Appを使用して表示できる可能性があります。連絡することもできます。送信者にメッセージの内容を確認してもらいます。」
WebMailで、[予定表]タブ([予定表]タブからアクセス可能)に表示権限組織外があることがわかります。現在、「共有しない」に設定されています。その他のオプションは、「可用性のみ」、「限定詳細」、または「完全詳細」です。アクセス許可を[完全な詳細]に設定し、自分に会議への招待を送信しても、会議への招待の形式に影響はありませんでした。
ICalendarメッセージを受信しないための回避策として、ThunderbirdをLightningアドオンで開いています。どういうわけか、Lightningアドオンは会議の招待状を受け取る方法を知っています。メッセージは引き続きtext/htmlとして表示されますが、Thunderbirdのステータスバーにリンクがあります。それをクリックすると、招待を拒否するか受け入れるかを尋ねるプロンプトが開きます。
Outlook 365からの会議への招待がiCalendarメッセージではなく単純なテキスト/ htmlメッセージとして届く理由を誰かが知っていますか?何か私にできることはありますか? Lightningアドオンが招待を処理できる場合、Microsoft Exchange Webサービス(EWS)を使用するなどの解決策が必要です。ソリューションでツールのコーディングが必要になる場合は、そうしてください。正しい方向にプッシュしていただければ幸いです。
SEoFが提供したリンクは素晴らしい提案でした。私の意見では、ブログの投稿は不完全ですが、私は正しい軌道に乗ることができました。さらに掘り下げ、Office 365からiCalendar(.ics)形式の会議招待状を送信するための手順の完全なリストを思い付きました。
私は管理者ではないため、特権を与えるために誰かに連絡する必要はありませんでした。唯一の注意点は、Windowsボックスにアクセスする必要があることです。 Windows経由で設定を変更すると、以前使用していたOSを使用できるようになります。 Windows 7を使用する通常のユーザーとして、自分で次のことを行いました。
現在、Linux上のmuttはiCalendar(.ics)形式で会議の招待状を取得しています。
Office 365/OutlookがWebインターフェイスを介してiCalendar形式でフォーマットされた招待状を送信するように設定できます。
すべての招待状がiCalendar形式で取得されます。
OPが正確に何を要求したかではありませんが、サードパーティのロジックが許可されている場合は、素晴らしい exchangelib (python)を確認してください。今後3か月のイベントを取得する簡単なpy3の例(定期的なアイテムが延長されていることに注意してください):
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='[email protected]', password='topsecret')
ACCOUNT = Account(primary_smtp_address='[email protected]', 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))