Connexion à la boîte aux lettres Exchange avec Python [fermé]
-
08-07-2019 - |
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).
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.
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 .