Question

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 un MAPI.Session, je pourrais ouvrir une session (avec la méthode Logon ()) avec un profil existant, mais je souhaite simplement fournir un nom d'utilisateur & amp; mot de passe.

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

Au cas où cela serait nécessaire: tout ce que le script fera est de se connecter à la boîte aux lettres, puis de parcourir les messages de la boîte de réception et d’en 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 à propos d’Outlook: Outlook sera installé sur la machine locale, mais aucun compte n’a été configuré (c’est-à-dire que toutes les bibliothèques appropriées seront disponibles, mais je dois fonctionner indépendamment de tout élément installé dans Outlook).

Était-ce utile?

La solution

Je suis à peu près sûr que cela sera impossible sans utiliser Outlook et un profil MAPI. Si vous pouviez faire en sorte que votre administrateur de messagerie active l'activation d'IMAP sur le serveur Exchange, cela vous faciliterait grandement la vie.

Autres conseils

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

Si vous utilisez Exchange 2007 ou une version plus récente, ou Office365, consultez les services Web Exchange. C'est une interface assez complète basée sur SOAP pour Exchange, et vous pouvez faire à peu près tout ce que Outlook est capable de faire, y compris un accès de délégué ou d'emprunt d'identité à d'autres comptes d'utilisateur.

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

UPDATE: J'ai publié un client Python EWS sur PyPI prenant en charge l'autodiscover, les calendriers, Boîte de réception, tâches, contacts, etc.:

from exchangelib import DELEGATE, Account, Credentials

credentials = Credentials(
    username='MYWINDOMAIN\\myusername',  # Or myusername@example.com for O365
    password='topsecret'
)
account = Account(
    primary_smtp_address='john@example.com', 
    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)

Je l'ai, 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)

maintenant vous pouvez 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 d'identifiant de message ' s que vous pouvez utiliser pour obtenir vos emails

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 email, 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 vous pouvez faire

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

ou pour le contenu

msg.get_payload()

mais si c'est un message en plusieurs parties, vous aurez besoin de 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.

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. vous devez descendre. Une dernière édition. Le descripteur d'utilisateur connecté est obtenu à l'aide de la méthode win32security.LogonUser .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top