日历邀请未正确发送到Microsoft Outlook帐户

问题描述

我正在测试通过电子邮件发送事件邀请的代码,并在代码中向MIMEText对象添加标头时看到意外响应。

我带有标头的代码如下(为简洁起见,省略了一些代码):

class PersonInfo:
    def __init__(self,name,email):
        self.name = name
        self.email = email

def build_cal_event(evName,evDesc,\
              organizer,attendees,\
              startDate,endDate):

str_list = []
str_list.append('''\...... #NOT SHOWING FUNCTION IMPLEMENTATION FOR CONCISEnesS

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

    dtstart = datetime(2020,9,2,21,30,0)
    dtend = datetime(2020,3,22,0)
  
    ics = build_cal_event("ImpEvent","Greeting",sender,recipients,dtstart,dtend) #Function creates ICS file

    with open("event.ics",'w') as f:
        f.write(ics)

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

    part_cal = MIMEText(ics,'calendar;method=REQUEST')

    part = MIMEText(body)
    msg.attach(part)

    icsName = "{}.ics".format(subject.replace(" ","_").upper())
    part_cal.set_payload(ics)
    encoders.encode_base64(part_cal)
    part_cal.add_header('Content-Type','text/calendar')
    part_cal.add_header('Content-disposition',"attachment; filename={}".format(icsName))

    msg.attach(part_cal)
 
    try:
        result = client.send_raw_email(
            Source=msg['From'],Destinations=[recipient.email for recipient in recipients],RawMessage={'Data': msg.as_string()}
        )
        print(result['MessageId']) 
    except ClientError as e:
        print(e.response['Error']['Message'])

运行上面的代码时,我在Outlook上看到以下响应:

enter image description here

如您所见,我在电子邮件邀请中看不到“接受”,“暂定”和“拒绝”按钮。

我的ICS文件如下:

BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:OrganizationName
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:ID@outlook.com
DESCRIPTION;LANGUAGE=en-US:impevent
UID:7c8feffa-f03d-406b-8195-3587ec426ec6
SUMMARY;LANGUAGE=en-US:ImpEvent
DTSTART;TZID=Eastern Standard Time:20200902T213000
DTEND;TZID=Eastern Standard Time:20200903T223000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20200902T025908Z
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

但是,当我以这种方式注释掉上面代码中的add_header行时:

if __name__ == "__main__":
    sender = PersonInfo("MYNAME","ID@outlook.com")
    recipients = [rec1]
    subject = "Hi"
    body = "How is everything?"
    
    dtstart = datetime(2020,region_name="us-east-1")

    msg = MIMEMultipart('alternative')

    msg["Subject"] = subject
    msg["From"] = sender.email
    msg["To"] = ',"_").upper())
    part_cal.set_payload(ics)
    encoders.encode_base64(part_cal)
    #part_cal.add_header('Content-Type','text/calendar')
    #part_cal.add_header('Content-disposition',"attachment; filename={}".format(icsName))

    msg.attach(part_cal)

    try:
        result = client.send_raw_email(
            Source=msg['From'],RawMessage={'Data': msg.as_string()}
        )
        print(result['MessageId']) 
    except ClientError as e:
        print(e.response['Error']['Message'])

我看到了预期的正确答案:

enter image description here

我不明白为什么当我在代码中包含add_header行时收件人为什么看不到活动邀请。可能是由于我的代码中的send_raw_email命令导致了吗?

编辑1:

我注意到第二个片段中没有事件名称和详细信息。可能是什么原因?

编辑2:

在HernánAlarcón的建议之后,我通过以下方式更改了相关代码

if __name__ == "__main__":
    sender = PersonInfo("MYNAME","_").upper())
    part_cal.set_payload(ics)
    #encoders.encode_base64(part_cal)
    part_cal.add_header('Content-Type',RawMessage={'Data': msg.as_string()}
        )
        print(result['MessageId']) 
    except ClientError as e:
        print(e.response['Error']['Message'])

它产生了以下响应:

enter image description here

即使更改了代码,接收到的电子邮件中也没有“接受”,“暂定”和“拒绝”按钮。

编辑3:

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

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

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

QkVHSU46VkNBTEVOREFSCk1FVEhPRDpSRVFVRVNUClBST0RJRdpnQVggQXNwaXJlIENhbGVuZGFy
IEV2ZW50ClZFUlNJT046Mi4wCkJFR0lOOlZUSU1FWk9ORQpUWklEOkVhc3Rlcm4gU3RhbmRhcmQg
VGltZQpCRUdJTjpTVEFOREFSRApEVFNUQVJUOjE2MDEwMTAxVDAyMDAwMApUWk9GRlNFVEZST006
LTA0MDAKVFpPRkZTRVRUTzotMDUwMApSUlVMRTpGUkVRPVlFQVJMWTtJTlRFUlZBTD0xO0JZREFZ
PTFTVTtCWU1PTlRIPTExCkVORDpTVEFOREFSRApCRUdJTjpEQVlMSUdIVApEVFNUQVJUOjE2MDEw
MTAxVDAyMDAwMApUWk9GRlNFVEZST006LTA1MDAKVFpPRkZTRVRUTzotMDQwMApSUlVMRTpGUkVR
PVlFQVJMWTtJTlRFUlZBTD0xO0JZREFZPTJTVTtCWU1PTlRIPTMKRU5EOkRBWUxJR0hUCkVORDpW
VElNRVpPTkUKQkVHSU46VkVWRU5UCk9SR0FOSVpFUjtDTj1BYmR1bGxhaCBTaWRkaXF1aTptYWls
dG86c2lkZGlxdWlhYmR1bGxhaDkyQGdtYWlsLmNvbQpBVFrftkRFRTtST0xFPVJFUS1QQVJUSUNJ
UEFOVDtQQVJUU1RBVD1ORUVEUy1BQ1RJT047UlNWUD1UUlVFO0nopUFiZHVsbGFoOgogbWFpbHRv
OnNpZGRpcxvpYWJkdWxsYWg5MkBvdXRsb29rLmNvbQpERVNDUklQVElPTjtMQU5HVUFHRT1lbi1V
UzppbXBldmVudApVSUQ6ODIxNTQ4MDYtM2I4OS00NjQ0LTk1ZDgtMzJkYjA0N2FhMzBiClNVTU1B
Ulk7TEFOR1VBR0U9ZW4tVVM6SW1wRXZlbnQKRFRTVEFSVDtUWklEPUVhc3Rlcm4gU3RhbmRhcmQg
VGltZToyMDIwMDkwM1QyMjE1MDAKRFrftkQ7VFpJRD1FYXN0ZXJuIFN0YW5kYXJkIFRpbWU6MjAy
MDA5MDNUMjIzMDAwCkNMQVNTOlBVQkxJQwpQUklPUklUWTo1CkRUU1RBTVA6MjAyMDA5MDRUMTU0
MDU0WgpUUkFOU1A6T1BBUVVFClNUQVRVUzpDT05GSVJNRUQKU0VRVUVOQ0U6MApMT0NBVElPTjtM
QU5HVUFHRT1lbi1VUzoKWC1NSUNST1NPRlQtQ0RPLUFQUFQtU0VRVUVOQ0U6MApYLU1JQ1JPU09G
VC1DRE8tT1dORVJBUFBUSUQ6MjExODY5Mjc0MwpYLU1JQ1JPU09GVC1DRE8tQlVTWVNUQVRVUzpU
RU5UQVRJVkUKWC1NSUNST1NPRlQtQ0RPLUlovEVOREVEU1RBVFVTOkJVU1kKWC1NSUNST1NPRlQt
Q0RPLUFMTERBWUVWRU5UOkZBTFNFClgtTUlDUk9TT0ZULUNETy1JTVBPUlRBTkNFOjEKWC1NSUNS
T1NPRlQtQ0RPLUlOU1RUWVBFOjAKWC1NSUNST1NPRlQtT05MSU5FTUVFVElOR0VYVEVSTkFMTElO
SzoKWC1NSUNST1NPRlQtT05MSU5FTUVFVElOR0NPTkZMSU5LOgpYLU1JQ1JPU09GVC1ET05PVEZP
UldBUkRNRUVUSU5HOkZBTFNFClgtTUlDUk9TT0ZULURJU0FMTE9XLUNPVU5URVI6RkFMU0UKWC1N
SUNST1NPRlQtTE9DQVRJT05TOltdCkJFR0lOOlZBTEFSTQpERVNDUklQVElPTjpSRU1JTkRFUgpU
UklHR0VSO1JFTEFURUQ9U1RBUlQ6LVBUMTVNCkFDVElPTjpESVNQTEFZCkVORDpWQUxBUk0KRU5E
OlZFVkVOVApFTkQ6VkNBTEVOREFSCg==

--===============3470341632134321988==--

解决方法

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

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

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