使用Python发送会议邀请

时间:2011-01-28 00:35:12

标签: python icalendar

我是Python新手,我正在尝试创建一个脚本,从我们的数据库中收集数据并将数据转换为集合。然后它获取这些数据集并生成ICS(icalendar)对象(通过使用icalendar http://codespeak.net/icalendar/)。

我遇到的问题是电子邮件部分,我能够发送电子邮件并附上ICS文件,但是当电子邮件到达时,它只是一封带附件的电子邮件。我真的希望将电子邮件视为会议邀请,您只需点击“接受”即可。为了将ICS文件作为会议请求发送,我能做些什么吗?

由于

2 个答案:

答案 0 :(得分:17)

下面是我通过python通过gmail发送邀请的方法(使用谷歌日历,outlook和outlook.com(live / hotmail):

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os,datetime

CRLF = "\r\n"
login = "yourloging@googlemail.com"
password = "yourpassword"
attendees = ["first@gmail.com",     "second@example.com","third@hotmail.com"]
organizer = "ORGANIZER;CN=organiser:mailto:first"+CRLF+" @gmail.com"
fro = "nickname <first@gmail.com>"

ddtstart = datetime.datetime.now()
dtoff = datetime.timedelta(days = 1)
dur = datetime.timedelta(hours = 1)
ddtstart = ddtstart +dtoff
dtend = ddtstart + dur
dtstamp = datetime.datetime.now().strftime("%Y%m%dT%H%M%SZ")
dtstart = ddtstart.strftime("%Y%m%dT%H%M%SZ")
dtend = dtend.strftime("%Y%m%dT%H%M%SZ")

description = "DESCRIPTION: test invitation from pyICSParser"+CRLF
attendee = ""
for att in attendees:
    attendee += "ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-    PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE"+CRLF+" ;CN="+att+";X-NUM-GUESTS=0:"+CRLF+" mailto:"+att+CRLF
ical = "BEGIN:VCALENDAR"+CRLF+"PRODID:pyICSParser"+CRLF+"VERSION:2.0"+CRLF+"CALSCALE:GREGORIAN"+CRLF
ical+="METHOD:REQUEST"+CRLF+"BEGIN:VEVENT"+CRLF+"DTSTART:"+dtstart+CRLF+"DTEND:"+dtend+CRLF+"DTSTAMP:"+dtstamp+CRLF+organizer+CRLF
ical+= "UID:FIXMEUID"+dtstamp+CRLF
ical+= attendee+"CREATED:"+dtstamp+CRLF+description+"LAST-MODIFIED:"+dtstamp+CRLF+"LOCATION:"+CRLF+"SEQUENCE:0"+CRLF+"STATUS:CONFIRMED"+CRLF
ical+= "SUMMARY:test "+ddtstart.strftime("%Y%m%d @ %H:%M")+CRLF+"TRANSP:OPAQUE"+CRLF+"END:VEVENT"+CRLF+"END:VCALENDAR"+CRLF

eml_body = "Email body visible in the invite of outlook and outlook.com but not google calendar"
eml_body_bin = "This is the email body in binary - two steps"
msg = MIMEMultipart('mixed')
msg['Reply-To']=fro
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = "pyICSParser invite"+dtstart
msg['From'] = fro
msg['To'] = ",".join(attendees)

part_email = MIMEText(eml_body,"html")
part_cal = MIMEText(ical,'calendar;method=REQUEST')

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

ical_atch = MIMEBase('application/ics',' ;name="%s"'%("invite.ics"))
ical_atch.set_payload(ical)
Encoders.encode_base64(ical_atch)
ical_atch.add_header('Content-Disposition', 'attachment; filename="%s"'%("invite.ics"))

eml_atch = MIMEBase('text/plain','')
Encoders.encode_base64(eml_atch)
eml_atch.add_header('Content-Transfer-Encoding', "")

msgAlternative.attach(part_email)
msgAlternative.attach(part_cal)

mailServer = smtplib.SMTP('smtp.gmail.com', 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(login, password)
mailServer.sendmail(fro, attendees, msg.as_string())
mailServer.close()

答案 1 :(得分:7)

我们做了什么。

  1. 创建会议邀请

  2. 给自己发电子邮件。确保它能完成所有令人满意的事情。 (“电子邮件被视为会议邀请,您只需点击'接受'”)

  3. 保存该电子邮件和附件。这是基准。

  4. 使用Python构建ICS文件,该文件看起来像 Office附件一样完全。这不是完全标准的。 http://en.wikipedia.org/wiki/ICalendar

  5. 请确保附件上还包含完全正确的MIME类型。 IIRC是text/calendar