web-dev-qa-db-fra.com

Connectez-vous à la boîte aux lettres Exchange avec Python

Je dois me connecter à une boîte aux lettres Exchange dans un script Python, sans utiliser de configuration de profil sur la machine locale (y compris avec Outlook). Si j'utilise win32com pour créer une session MAPI, je pourrais me connecter (avec la méthode Logon ()) avec un profil existant, mais je veux simplement fournir un nom d'utilisateur et un mot de passe.

Est-ce possible? Si oui, quelqu'un pourrait-il fournir un exemple de code? Je préférerais qu'il n'utilise que la bibliothèque standard et le paquet pywin32. Malheureusement, il n'est pas possible d'activer l'accès IMAP pour le serveur Exchange (puis d'utiliser imaplib).

Au cas où cela serait nécessaire: tout ce que le script fera, c'est se connecter à la boîte aux lettres, et parcourir les messages dans la boîte de réception, récupérer le contenu. Je peux gérer l'écriture du code pour cela, si je peux obtenir une connexion en premier lieu!

Pour clarifier concernant Outlook: Outlook sera installé sur la machine locale, mais il n'a pas de configuration de comptes (c'est-à-dire que toutes les bibliothèques appropriées seront disponibles, mais j'ai besoin de fonctionner indépendamment de tout ce qui est configuré dans Outlook).

22
Tony Meyer

Je suis sûr que cela va être impossible sans utiliser Outlook et un profil MAPI. Si vous pouvez parler à votre administrateur de messagerie d'activer IMAP sur le serveur Exchange, cela vous faciliterait la vie.

0
Harley Holcombe

Je sais que c'est un vieux fil, mais ...

Si vous utilisez Exchange 2007 ou une version plus récente, ou Office365, jetez un œil aux services Web Exchange. Il s'agit d'une interface SOAP assez complète pour Exchange, et vous pouvez faire à peu près tout ce que Outlook est capable de faire, y compris l'accès délégué ou l'emprunt d'identité à d'autres comptes d'utilisateurs.

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

MISE À JOUR: J'ai publié un client Python EWS sur PyPI qui prend en charge la découverte automatique, les calendriers, la boîte de réception, les tâches, les contacts, etc.:

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)
108
Erik Cederstrand

J'ai compris, pour vous connecter à un échange sortant, vous devez vous connecter comme ceci:

import smtplib

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

vous pouvez maintenant envoyer comme une connexion normale

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))

pour recevoir le courrier de votre boîte de réception, c'est un peu différent

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()

cela vous donne une liste des identifiants de message que vous pouvez utiliser pour obtenir vos e-mails

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

maintenant raw_email est votre message électronique, mais ce n'est pas très joli, si vous voulez l'analyser, faites quelque chose comme ça

from email.parser import Parser

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

maintenant tu peux faire

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

ou pour le contenu

msg.get_payload()

mais si c'est un message en plusieurs parties, vous devrez faire un peu plus de traitement, heureusement une solution récursive est parfaite pour cette situation

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

maintenant

msg_contant = process_multipart_message(msg)

vous donnera le message entier à chaque fois.

28
Kyle Roux

Vous devrez trouver un moyen d'exécuter le processus en tant qu'utilisateur particulier.

Voir ceci.

Je pense que pywin32.CreateProcessAsUser est le début du chemin que vous devez descendre. Une dernière modification. Le handle d'utilisateur connecté est obtenu à l'aide de la méthode win32security.LogonUser

1
Sam Corder