如何从Office365接收会议邀请,以便可以将其解析并添加到日历中?


10

如何从Outlook.office365.com接收iCalendar(.ics或.ical)会议邀请,以便可以将其解析并添加到日历(如提醒+ wyrd)中?

我已经花了很长时间寻找答案,但是还没有找到答案,所以我想知道我是否只是缺少一些琐碎的东西。

我在Fedora 20(Heisenbug)上使用Mutt 1.5.22和OfflineIMAP 6.5.5。

有很多脚本可以将iCalendar消息解析为可以导入日历的格式。这不是我的问题。我的问题是我什至没有收到iCalendar消息,所以我没有什么可解析的。

会议邀请以base64编码的文本/ html消息的形式到达我的收件箱。它不是多部分消息,没有附件。邮件的正文包含指向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,自动回复”。

我的.offlineimaprc的folderfilter设置为不同步Calendar文件夹。这是因为每次OfflineIMAP尝试进行同步时,在同步Calendar文件夹时都会遇到相同错误的一百多个实例:“错误:IMAP服务器“远程”没有UID为“ [...]”的消息。”

使用Python的imaplib检查Calendar文件夹:

>>> 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中,我看到Calendar文件夹(可通过Calendar选项卡访问)具有组织外部可见性的权限。当前设置为“不共享”。其他选项是“仅限可用性”,“有限详细信息”或“完整详细信息”。将权限设置为“详细信息”,然后向自己发送会议邀请对会议邀请的格式没有任何影响。

作为不接收iCalendar消息的一种解决方法,我在Thunderbird中打开了Lightning插件。以某种方式,Lightning加载项知道如何接收会议邀请。消息仍显示为text / html,但是Thunderbird的状态栏中有一个链接。单击它会打开一个提示,询问是否拒绝或接受邀请。

任何人都有任何想法,为什么来自Outlook 365的会议邀请以简单的text / html消息而不是iCalendar消息到达?有什么我可以做的吗?如果Lightning加载项可以处理邀请,那么必须有解决方案,例如使用Microsoft Exchange Web Services(EWS)。如果解决方案需要我编写工具,那就这样吧。向正确方向的推动将不胜感激。


此链接可能会有所帮助:blogs.technet.com/b/timmcmic/archive/2013/11/10/...
SEOF

1
@SEoF我将您的答案转换为提供您所引用链接的评论。由于您回答的结果正在说明什么对您不起作用,因此我将其删除。请仅发布实际上解释了如何解决问题的答案,不将指向外部资源的链接视为答案。
terdon

Answers:


3

您可以进行设置,以便Office 365 / Outlook通过Web界面发送以iCalendar格式设置的邀请。

  1. 登录到您的Office 365帐户
  2. 打开邮件应用程序(Outlook)
  3. 点击右上角的齿轮图标(设置)
  4. 在搜索框中输入“ imap”
  5. 选择“ Pop and IMAP”
  6. 在底部,为POP和/或IMAP选择“以iCalendar格式发送事件邀请”。
  7. 点击“保存”

现在,您应该以iCalendar格式获取所有邀请。


我已经厌倦了尝试使用电子邮件附件编写自己的Outlook日历以提醒导出程序的烦恼。它直接调用Office-365 API,并可以输出各种内容,包括提醒格式的条目。命名为ihol(I Hate OutLook).. github.com/eikenb/ihol
John Eikenberry,

1

SEoF提供的链接是一个很好的建议。我认为该博客文章不完整,但确实使我步入了正确的轨道。我做了一些进一步的挖掘,并提出了完整的步骤列表,以使Office 365以iCalendar(.ics)格式向我发送会议邀请。

请注意,我不是管理员,不需要联系任何人就可以为我提供任何特权。唯一的警告是您需要访问Windows框。通过Windows更改设置后,您可以返回以前使用的任何操作系统。我使用Windows 7作为普通用户独自执行以下操作:

  1. http://www.microsoft.com/zh-cn/download/details.aspx?id=30653下载并安装Microsoft .NET Framework 4.5 。
  2. http://www.microsoft.com/zh-cn/download/details.aspx?id=40855下载并安装Windows Management Framework 4.0(Windows6.1-KB2819745-x64-MultiPkg.msu)。
  3. 以管理员身份运行PowerShell。
  4. Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  5. $ UserCredential =获取凭据
    • 输入您的电子邮件地址和密码。
  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 | 格式清单
  9. Set-CASMailbox-身份YOUR@EMAIL.ADDRESS -PopUseProtocolDefaults:$ FALSE -ImapUseProtocolDefaults:$ FALSE -PopForceICalForCalendarRetrievalOption:$ TRUE -ImapForceICalForCalendarRetrievalOption:$ TRUE
  10. Remove-PSSession $会话
  11. Set-ExecutionPolicy -ExecutionPolicy受限

现在,我在Linux上的杂技演员正在以iCalendar(.ics)格式检索会议邀请。


这工作得很好。感谢您的详细说明。
杰森·戴

0

并非完全是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='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))

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.