2011-01-28 40 views
6

Tôi khá mới đối với Python và tôi đang cố gắng tạo tập lệnh thu thập dữ liệu từ cơ sở dữ liệu của chúng tôi và chuyển đổi dữ liệu thành tập hợp. Sau đó, các bộ dữ liệu đó tạo ra các đối tượng ICS (icalendar) (bằng cách sử dụng icalendar http://codespeak.net/icalendar/).Gửi Lời mời Cuộc họp Với Python

Sự cố tôi đang gặp phải là phần email, tôi có thể gửi email và đính kèm tệp ICS nhưng khi email đến thì đó chỉ là một email có tệp đính kèm. Tôi đã thực sự hy vọng cho các email được xem như là một lời mời họp, nơi bạn chỉ cần nhấn "chấp nhận". Có điều gì tôi có thể làm để gửi tệp ICS dưới dạng yêu cầu họp không?

Cảm ơn

Trả lời

6

Chúng tôi đã làm gì.

  1. Tạo mời họp

  2. Email đến bản thân mình. Hãy chắc chắn rằng nó làm tất cả những điều mong muốn. ("email được xem là lời mời họp mà bạn chỉ cần nhấn 'chấp nhận'")

  3. Lưu email đó và tệp đính kèm. Đó là điểm chuẩn.

  4. Tạo tệp ICS bằng Python trông chính xác giống như tệp đính kèm MS-Office. Nó không hoàn toàn tiêu chuẩn. http://en.wikipedia.org/wiki/ICalendar

  5. Đảm bảo rằng chính xác chính xác loại MIME cũng có trên tệp đính kèm. IIRC là text/calendar.

12

dưới đây là những gì làm việc cho tôi gửi lời mời qua python trên gmail (làm việc với google lịch, triển vọng và 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 = "[email protected]" 
password = "yourpassword" 
attendees = ["[email protected]",  "[email protected]","[email protected]"] 
organizer = "ORGANIZER;CN=organiser:mailto:first"+CRLF+" @gmail.com" 
fro = "nickname <[email protected]>" 

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() 
Các vấn đề liên quan