2011-01-28 15 views
6

Soy bastante nuevo en Python y estoy tratando de crear una secuencia de comandos que recopile datos de nuestra base de datos y convierta los datos en conjuntos. Luego toma esos conjuntos de datos y genera objetos ICS (icalendar) (usando icalendar http://codespeak.net/icalendar/).Enviar invitaciones a reuniones con Python

El problema que me estoy encontrando es la parte del correo electrónico, puedo enviar un correo electrónico y adjuntar el archivo ICS, pero cuando llega el correo electrónico es solo un correo electrónico con un archivo adjunto. Realmente esperaba que el correo electrónico se viera como una invitación a una reunión en la que simplemente presionas "aceptar". ¿Hay algo que pueda hacer para enviar el archivo ICS como una solicitud de reunión?

Gracias

Respuesta

6

Lo que hicimos.

  1. Crear una invitación a una reunión

  2. de correo electrónico a mí mismo. Asegúrese de que haga todas las cosas deseables. ("correo electrónico para ser visto como una invitación a una reunión donde simplemente pulse 'aceptar'")

  3. Guarde ese correo electrónico y los datos adjuntos. Es el punto de referencia.

  4. Construya el archivo ICS en Python que se parece a exactamente como el archivo adjunto de MS-Office. No es completamente estándar. http://en.wikipedia.org/wiki/ICalendar

  5. Asegúrese de que exactamente tipo MIME derecho está en el archivo adjunto, también. IIRC es text/calendar.

12

a continuación es lo que funcionó para mí el envío de invitaciones a través de pitón sobre Gmail (trabajó con Google Calendar, Outlook y 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()