在Microsoft Outlook的电子邮件邀请中看不到事件标题

问题描述

我的python代码发送给Microsoft Outlook的事件邀请没有显示事件标题和描述。

if __name__ == "__main__":
    sender = PersonInfo("MY NAME","ID@gmail.com")
    rec1= PersonInfo("MY NAME","ID@outlook.com")
    rec2= PersonInfo("NAME","ID2gmail.com")
    recipients = [rec1,rec2]
    subject = "Hi"
    body = "How is everything?"


    dtstart = datetime(2020,9,3,22,15,0)
    dtend = datetime(2020,30,0)

    ics = build_cal_event("ImpEvent","Greeting",sender,recipients,dtstart,dtend) #Creates ICS file

    with open("event.ics",'w') as f:
        f.write(ics)
        
    SendCalendarInvite(sender,subject,body,ics)

函数build_cal_event如下(为简洁起见,省略了一些代码):

def build_cal_event(event_name,event_description,\
                  organizer,attendees,\
                  dtstart,dtend):
    # cal = icalendar.Calendar()
    str_list = []
    str_list.append('''\
BEGIN:VCALENDAR
METHOD:REQUEST
..........
END:VEVENT
END:VCALENDAR
'''.format(datetime.Now().strftime("%Y%m%dT%H%M%sZ")))

    
    cal = ''.join(str_list)
    return cal

它将生成以下ICS文件(替换后的ID和名称以保持机密性):

BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:myOrgName
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Eastern Standard Time
BEGIN:STANDARD
DTSTART:16010101T020000
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T020000
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ORGANIZER;CN=ID:mailto:ID@gmail.com
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=ID:
 mailto:ID@outlook.com
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=ID:
 mailto:ID@gmail.com
DESCRIPTION;LANGUAGE=en-US:impevent
UID:81d19fd7-833d-4d56-8d2d-1a343dee77b1
SUMMARY;LANGUAGE=en-US:ImpEvent
DTSTART;TZID=Eastern Standard Time:20200903T221500
DTEND;TZID=Eastern Standard Time:20200903T223000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20200903T215335Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=en-US:
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:2118692743
X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-ONLINEMEETINGEXTERNALLINK:
X-MICROSOFT-ONLINEMEETINGCONFLINK:
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-disALLOW-COUNTER:FALSE
X-MICROSOFT-LOCATIONS:[]
BEGIN:VALARM
DESCRIPTION:REMINDER
TRIGGER;RELATED=START:-PT15M
ACTION:disPLAY
END:VALARM
END:VEVENT
END:VCALENDAR

SendCalendarInvite函数如下:

def SendCalendarInvite(sender,ics=None):
    aws_region = "us-east-1"
    client = boto3.client('ses',region_name=aws_region)
    
    msg = MIMEMultipart('mixed')
    
    msg["Subject"] = subject
    msg["From"] = sender.email
    msg["To"] = ','.join(map(lambda x: x.email,recipients))
    msg["Content-class"] = "urn:content-classes:calendarmessage"

    ics_name = "{}.ics".format(subject.replace(" ","_").upper())


    part_email = MIMEText(body,"html")
    part_cal = MIMEText(ics,'calendar;method=REQUEST')

    msgalternative = MIMEMultipart('alternative')
    msg.attach(msgalternative)
    

    ics_name = "{}.ics".format(subject.replace(" ","_").upper())
    ical_atch = MIMEBase('text','calendar',**{'method' : 'REQUEST','name' : ics_name})    
    ical_atch.set_payload(ics)
    ical_atch.set_type('text/calendar; charset=UTF-8; method=REQUEST; component = VEVENT')
    encoders.encode_base64(ical_atch)
    ical_atch.add_header('Content-Type','text/calendar')
    ical_atch.add_header('charset','UTF-8')
    ical_atch.add_header('component','VEVENT')
    ical_atch.add_header('method','REQUEST')
    ical_atch.add_header('Content-class','urn:content-classes:calendarmessage')
    ical_atch.add_header('Content-disposition',"attachment; filename={}".format(ics_name))
    ical_atch.add_header('Content-ID','calendar_message')
    ical_atch.add_header('Content Description',ics_name)
    ical_atch.add_header("Filename",ics_name)
    ical_atch.add_header("Path",ics_name)

    eml_atch = MIMEText('','plain')
    encoders.encode_base64(eml_atch)
    eml_atch.add_header('Content-transfer-encoding',"")
    msgalternative.attach(part_email)
    msgalternative.attach(part_cal)
    
    try:
        result = client.send_raw_email(
            Source=msg['From'],Destinations=[recipient.email for recipient in recipients],RawMessage={'Data': msg.as_string()}
        )
    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        print("Email sent! Message ID:"),print(result['MessageId'])

gmail收件人以这种方式看到邀请:

enter image description here

看起来还可以。

但是,Outlook收件人的事件邀请如下所示:

enter image description here

Outlook收到的邀请中缺少事件名称和事件描述。如何确保Outlook正确处理我的代码发送的事件邀请并显示事件名称和描述?

编辑1:

哑剧电子邮件如下:

Content-Type: multipart/mixed; boundary="===============1597738219983052864=="
MIME-Version: 1.0
Subject: Hi
From: ID@gmail.com
To: ID@outlook.com,ID@gmail.com
Content-class: urn:content-classes:calendarmessage

--===============1597738219983052864==
Content-Type: multipart/alternative; boundary="===============6779992366809651548=="
MIME-Version: 1.0

--===============6779992366809651548==
Content-Type: text/html; charset="us-ascii"
MIME-Version: 1.0
Content-transfer-encoding: 7bit

How is everything?
--===============6779992366809651548==
MIME-Version: 1.0
Content-Type: text/calendar; method="REQUEST"; charset="us-ascii"
Content-transfer-encoding: 7bit

BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:OrgName
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Eastern Standard Time
BEGIN:STANDARD
DTSTART:16010101T020000
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T020000
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
ORGANIZER;CN=MYNAME:mailto:ID@gmail.com
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=MYNAME:
 mailto:MYNAME@outlook.com
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=NAME:
 mailto:ID@gmail.com
DESCRIPTION;LANGUAGE=en-US:impevent
UID:f250a41d-84c0-4f12-be83-38d2d51f5586
SUMMARY;LANGUAGE=en-US:ImpEvent
DTSTART;TZID=Eastern Standard Time:20200903T221500
DTEND;TZID=Eastern Standard Time:20200903T223000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20200904T122939Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION;LANGUAGE=en-US:
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-OWNERAPPTID:2118692743
X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:0
X-MICROSOFT-ONLINEMEETINGEXTERNALLINK:
X-MICROSOFT-ONLINEMEETINGCONFLINK:
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-disALLOW-COUNTER:FALSE
X-MICROSOFT-LOCATIONS:[]
BEGIN:VALARM
DESCRIPTION:REMINDER
TRIGGER;RELATED=START:-PT15M
ACTION:disPLAY
END:VALARM
END:VEVENT
END:VCALENDAR

--===============6779992366809651548==--

--===============1597738219983052864==--

编辑2:

我担心的是,当哑剧电子邮件包含以下事件名称时,为什么未检测到该事件名称DESCRIPTION;LANGUAGE=en-US:impevent

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)