问题描述
我的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
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收件人以这种方式看到邀请:
看起来还可以。
但是,Outlook收件人的事件邀请如下所示:
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 (将#修改为@)