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