2008-11-13 42 views
16

Necesito conectarme a un buzón de Exchange en un script de Python, sin utilizar ninguna configuración de perfil en el equipo local (incluido el uso de Outlook). Si uso win32com para crear una sesión MAPI.Session podría iniciar sesión (con el método Logon()) con un perfil existente, pero solo quiero proporcionar un nombre de usuario & contraseña.Conectarse al buzón de Exchange con Python

¿Esto es posible? Si es así, ¿podría alguien proporcionar un código de ejemplo? Preferiría que solo usara la biblioteca estándar y el paquete pywin32. Desafortunadamente, no es posible habilitar el acceso IMAP para el servidor Exchange (y luego usar imaplib).

En caso de que sea necesario: todo lo que hará la secuencia de comandos será conectarse al buzón y ejecutar los mensajes en la Bandeja de entrada, recuperando los contenidos. ¡Puedo manejar la escritura del código para eso, si puedo obtener una conexión en primer lugar!

Para aclarar con respecto a Outlook: Outlook se instalará en la máquina local, pero no tiene ninguna configuración de cuentas (es decir, todas las bibliotecas apropiadas estarán disponibles, pero necesito operar independientemente de cualquier configuración dentro de Outlook).

Respuesta

1

Estoy bastante seguro de que esto será imposible sin usar Outlook y un perfil MAPI. Si puede convencer a su administrador de correo para que habilite IMAP en el servidor de Exchange, su vida será mucho más fácil.

+0

Habilitar IMAP no es una opción (todo sería trivial si lo fuera, pero lamentablemente no lo es). –

+0

Sí, eso es lo que pensé, pero valió la pena intentarlo. –

+0

Probablemente debería haber puesto eso en la pregunta en primer lugar (hice esa edición ahora). Gracias :) –

59

Sé que esto es un hilo viejo, pero ...

Si está utilizando Exchange 2007 o posterior, o Office365, echar un vistazo a Cambio Servicios web. Es una interfaz bastante completa basada en SOAP para Exchange, y usted puede hacer prácticamente todo lo que Outlook puede hacer, incluido el acceso de delegado o suplantación a otras cuentas de usuario.

http://msdn.microsoft.com/en-us/library/bb204119.aspx

ACTUALIZACIÓN: He publicado una Python EWS client en PyPI que soporta la detección automática, calendarios, bandeja de entrada, tareas y contactos:

from exchangelib import DELEGATE, Account, Credentials 

credentials = Credentials(
    username='MYWINDOMAIN\\myusername', # Or [email protected] for O365 
    password='topsecret' 
) 
account = Account(
    primary_smtp_address='[email protected]', 
    credentials=credentials, 
    autodiscover=True, 
    access_type=DELEGATE 
) 
# Print first 100 inbox messages in reverse order 
for item in account.inbox.all().order_by('-datetime_received')[:100]: 
    print(item.subject, item.body, item.attachments) 
+0

+1 ya que esta debería ser la respuesta aceptada. –

+0

¿Hay una biblioteca de contenedor de Python que implemente eso? –

+0

¿Este cliente EWS está disponible en Python 2.7? – Ryan

21

Ive consiguió, para conectar con el intercambio saliente es necesario conectar de esta manera:

import smtplib 

url = YOUR_EXCHANGE_SERVER 
conn = smtplib.SMTP(url,587) 
conn.starttls() 
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD) 
conn.login(user,password) 

ahora puede enviar como una conexión normal

message = 'From: FROMADDR\nTo: TOADDRLIST\nSubject: Your subject\n\n{}' 
from, to = fromaddr,toaddrs 
txt = 'This is my message' 
conn.sendmail(fromaddr,toaddrs,msg.format(txt)) 

para obtener el correo de la bandeja de entrada es un poco diferente

import imaplib 

url = YOUR_EXCHANGE_URL 
conn = imaplib.IMAP4_SSL(url,993) 
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD) 
conn.login(user,password) 
conn.select('INBOX') 
results,data = conn.search(None,'ALL') 
msg_ids = data[0] 
msg_id_list = msg_ids.split() 

esto le da una lista de ID de mensaje' s que se pueden utilizar para obtener sus mensajes de correo electrónico

latest_email_id = msg_id_list[-1] 
result,data = conn.fetch(latest_email_id,"(RFC822)") 
raw_email = data[0][1] 

ahora raw_email es su mensaje de correo electrónico, pero no es muy bonito, si quiere analizarlo, haga algo como esto

from email.parser import Parser 

p = Parser() 
msg = p.parsestr(raw_email) 

ahora se puede hacer

msg.get('From') 
msg.get('Subject') 

o del contenido

msg.get_payload() 

pero si es un mensaje de varias partes de su va a tener que hacer un poco más procesamiento, por suerte una solución recursiva es perfecto para este situación

def process_multipart_message(message): 
    rtn = '' 
    if message.is_multipart(): 
     for m in message.get_payload(): 
      rtn += process_multipart_message(m) 
    else: 
     rtn += message.get_payload() 
    return rtn 

ahora

msg_contant = process_multipart_message(msg) 

le dará todo el mensaje todo el tiempo.

+0

Necesito conéctese al puerto 443 y establezca la seguridad en SSL/TLS (acepte todos los certificados). ¿Como podría hacerlo? Lo he estado buscando pero ningún resultado hasta el momento. – Timo002

+0

conn.starttls() antes de iniciar sesión – lxx

+0

Si necesito manejar un archivo que se envía a mi correo electrónico usando la secuencia de comandos, ¿cómo puedo recuperarlo? ¡Gracias! – Bramat

Cuestiones relacionadas