วิธีรับการเชิญประชุมจาก Office365 เพื่อให้สามารถแยกวิเคราะห์และเพิ่มลงในปฏิทินได้


10

วิธีรับ iCalendar (.ics หรือ .ical) คำเชิญเข้าร่วมการประชุมจาก outlook.office365.com เพื่อให้สามารถแยกวิเคราะห์และเพิ่มลงในปฏิทิน (เช่นเตือน + wyrd)

ฉันค้นหาคำตอบที่ยาวและหนักหน่วง แต่ไม่พบอะไรเลยฉันจึงสงสัยว่าฉันขาดอะไรไปซักนิด

ฉันใช้ Mutt 1.5.22 กับ OfflineIMAP 6.5.5 บน Fedora 20 (Heisenbug)

มีสคริปต์มากมายสำหรับการวิเคราะห์ข้อความ iCalendar ในรูปแบบที่สามารถนำเข้าสู่ปฏิทิน นี่ไม่ใช่ปัญหาของฉัน ปัญหาของฉันคือฉันไม่ได้รับข้อความ iCalendar ดังนั้นฉันไม่มีอะไรจะแยกวิเคราะห์

คำเชิญเข้าร่วมประชุมมาถึงกล่องจดหมายเข้าของฉันในรูปแบบข้อความเข้ารหัส / ข้อความ HTML แบบพื้นฐาน มันเป็นไม่ได้ข้อความหลายส่วนและมีสิ่งที่แนบมาไม่มี เนื้อความของข้อความประกอบด้วยลิงค์ไปยัง 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

ฉันตรวจสอบส่วนหัวของข้อความในเว็บเมล์ด้วย มีส่วนหัวเพิ่มเติม (บางส่วนเกี่ยวข้องกับ tnef) แต่อีกครั้งดูเหมือนจะไม่มีอะไรเกี่ยวข้องกับปฏิทินหรือคำเชิญ

ฉันเปรียบเทียบส่วนหัวของ "คำเชิญเข้าร่วมการประชุม" กับส่วนหัวของอีเมลปกติ ข้อแตกต่างเพียงอย่างเดียวคืออีเมลปกติมีส่วนหัวเพิ่มเติม: "X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply"

โฟลเดอร์ตัวกรองของฉัน. offlineimaprc ของฉันถูกตั้งค่าให้ไม่ซิงค์โฟลเดอร์ปฏิทิน นี่เป็นเพราะทุกครั้งที่ OfflineIMAP พยายามทำการซิงค์มันจะทำงานมากกว่าหนึ่งร้อยครั้งของข้อผิดพลาดเดียวกันเมื่อทำการซิงค์โฟลเดอร์ปฏิทิน: "ข้อผิดพลาด: เซิร์ฟเวอร์ IMAP 'ระยะไกล' ไม่มีข้อความด้วย UID '[... ]' ."

ใช้ imaplib ของไพ ธ อนเพื่อตรวจสอบโฟลเดอร์ปฏิทิน:

>>> 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)")

ครั้งที่สองที่ฉันเรียกการดึงข้อมูลจะส่งคืนข้อความ: "เซิร์ฟเวอร์ไม่สามารถดึงข้อความต่อไปนี้ได้ข้อความยังไม่ถูกลบคุณอาจสามารถดูได้โดยใช้ Outlook หรือ Outlook Web App นอกจากนี้คุณยังสามารถติดต่อได้ ผู้ส่งเพื่อค้นหาสิ่งที่ข้อความพูด "

ในเว็บเมล์ผมเห็นว่าโฟลเดอร์ปฏิทิน (เข้าถึงได้ผ่านทางแท็บปฏิทิน) มีสิทธิ์สำหรับการแสดงผลภายนอกองค์กร ขณะนี้ตั้งค่าเป็น "ไม่แชร์" ตัวเลือกอื่น ๆ คือ "ความพร้อมใช้งานเท่านั้น", "รายละเอียดที่ จำกัด " หรือ "รายละเอียดแบบเต็ม" การตั้งค่าสิทธิ์เป็น "รายละเอียดทั้งหมด" จากนั้นส่งคำเชิญเข้าร่วมประชุมให้กับตัวเองไม่มีผลต่อรูปแบบของคำเชิญเข้าร่วมประชุม

เพื่อเป็นการหลีกเลี่ยงปัญหาที่ไม่ได้รับข้อความ iCalendar ฉันเปิด Thunderbird พร้อมกับโปรแกรมเสริม Lightning อย่างใดส่วนเสริม Lightning รู้วิธีรับการเชิญเข้าร่วมประชุม ข้อความยังคงปรากฏเป็น text / html แต่มีลิงก์ในแถบสถานะของธันเดอร์เบิร์ด การคลิกจะเป็นการเปิดพรอมต์ถามว่าจะปฏิเสธหรือยอมรับคำเชิญ

ทุกคนมีแนวคิดใดบ้างที่ทำให้การเชิญเข้าประชุมจาก Outlook 365 มาถึงเป็นข้อความ / ข้อความ html แบบง่าย ๆ แทนที่จะเป็นข้อความ iCalendar มีอะไรที่ฉันพอจะทำได้บ้าง? หาก Add-on Lightning สามารถทำงานกับคำเชิญได้ต้องมีวิธีแก้ไขเช่นใช้ Microsoft Exchange Web Services (EWS) หากการแก้ปัญหาจะต้องให้ฉันใช้รหัสเครื่องมือขึ้นมา แรงผลักดันในทิศทางที่ถูกต้องจะได้รับการชื่นชมอย่างมาก


การเชื่อมโยงนี้อาจจะมีประโยชน์: blogs.technet.com/b/timmcmic/archive/2013/11/10/...
SEoF

1
@SEoF ฉันแปลงคำตอบของคุณเป็นความคิดเห็นที่ให้ลิงก์ที่คุณอ้างถึง เนื่องจากความละเอียดของคำตอบของคุณกำลังอธิบายสิ่งที่ไม่ได้ผลสำหรับคุณฉันจึงลบมัน โปรดโพสต์คำตอบที่อธิบายถึงวิธีการแก้ไขปัญหาจริง ๆ แล้วลิงก์ไปยังแหล่งข้อมูลภายนอกไม่ถือว่าเป็นคำตอบ
terdon

คำตอบ:


3

คุณสามารถตั้งค่าให้ Office 365 / Outlook ส่งคำเชิญในรูปแบบ iCalendar ผ่านทางเว็บอินเตอร์เฟส

  1. เข้าสู่ระบบบัญชี Office 365 ของคุณ
  2. แอปเปิดจดหมาย (Outlook)
  3. กดไอคอนรูปเฟืองที่มุมบนขวา (การตั้งค่า)
  4. ในช่องค้นหาพิมพ์ "imap"
  5. เลือก "ป๊อปและ IMAP"
  6. ที่ด้านล่างเลือก "ส่งคำเชิญกิจกรรมในรูปแบบ iCalendar" สำหรับ POP และ / หรือ IMAP
  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. ดาวน์โหลดและติดตั้ง 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 x 64-MultiPkg.msu) จากhttp://www.microsoft.com/en-us/download/details.aspx?id=40855
  3. เรียกใช้ PowerShell ในฐานะผู้ดูแลระบบ
  4. ตั้งค่า ExecutionPolicy -ExecutionPolicy RemoteSigned
  5. $ UserCredential = รับข้อมูลประจำตัว
    • ป้อนที่อยู่อีเมลและรหัสผ่านของคุณ
  6. $ เซสชัน = ใหม่ -PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $ UserCredential -Authentication พื้นฐาน -AllowRedirection
  7. $ ImportResults = นำเข้า -PSSession $ เซสชัน
  8. รับ-CASMailbox -identity YOUR@EMAIL.ADDRESS | รูปแบบรายการ
  9. Set-CASMailbox -identity YOUR@EMAIL.ADDRESS -PopUseProtocolDefaults: $ FALSE -ImapUseProtocolDefaults: $ FALSE -PopForceICalForCalendarRetrievalOption: $ TRUE
  10. ลบ -PSSession $ เซสชัน
  11. Set-ExecutionPolicy -ExecutionPolicy Restricted

ตอนนี้ mutt ของฉันบน Linux กำลังเรียกค้นคำเชิญประชุมในรูปแบบ iCalendar (.ics)


มันทำงานได้อย่างสมบูรณ์แบบ ขอบคุณสำหรับคำแนะนำโดยละเอียด
Jason Day

0

ไม่ใช่สิ่งที่ OP ขอมาอย่างแน่นอน แต่ถ้าอนุญาตให้ใช้ตรรกะของบุคคลที่สามได้ให้ตรวจสอบการแลกเปลี่ยนที่ยอดเยี่ยม(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
John Eikenberry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.