Eine Verbindung mit Exchange-Postfach mit Python [geschlossen]
-
08-07-2019 - |
Frage
Ich muss ein Exchange-Postfach in einem Python-Skript verbinden, ohne auf dem lokalen Rechner ein beliebiges Profil Setup mit (einschließlich der Verwendung von Outlook). Wenn ich win32com verwenden, um eine MAPI.Session zu erstellen I (mit dem Logon () -Methode) mit einem bestehenden Profil anmelden konnte, aber ich möchte nur einen Benutzernamen und ein Kennwort eingeben.
Ist das möglich? Wenn ja, könnte jemand Beispielcode zur Verfügung stellen? Ich würde es vorziehen, wenn es nur die Standard-Bibliothek und das pywin32 Paket verwendet. Leider IMAP-Zugriff für den Exchange-Server, so dass (und dann mit imaplib) ist nicht möglich.
Im Fall ist es notwendig: alle das Skript tun werden an die Mailbox verbindet und im Posteingang durch die Nachrichten ausgeführt wird, um den Inhalt abzurufen. Ich handhaben kann den Code für das Schreiben, wenn ich eine Verbindung in erster Linie bekommen!
Um in Bezug auf Outlook zu klären: Outlook wird auf dem lokalen Rechner installiert werden, aber es hat keine Konten Setup (dh alle entsprechenden Bibliotheken verfügbar sein wird, aber ich muss innerhalb von Outlook unabhängig von irgendetwas Setup arbeiten) <. / p>
Lösung
Ich bin mir ziemlich sicher, dass dies ohne die Verwendung von Outlook und ein MAPI-Profil nicht möglich sein wird. Wenn Sie Ihre E-Mail süß Admin in ermöglicht IMAP auf dem Exchange-Server kommunizieren kann, würde es Ihr Leben viel einfacher machen.
Andere Tipps
Ich weiß, das ist ein alter Thread, aber ...
Wenn Sie mit Exchange 2007 oder neuer, oder Office365, werfen Sie einen Blick auf Exchange Web Services. Es ist eine ziemlich umfassende SOAP-basierte Schnittstelle für Exchange, und man kann so ziemlich alles tun Outlook ist in der Lage zu tun, einschließlich der Delegierten oder Identitätswechsel Zugriff auf andere Benutzerkonten.
http://msdn.microsoft.com/en-us/library/ bb204119.aspx
UPDATE: Ich habe eine Python EWS-Client auf PyPI veröffentlicht, die Autoermittlung, Kalender unterstützt, Posteingang, Aufgaben, Kontakte und vieles mehr:
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)
Ive erhielt es, um Outbound-Austausch Sie so verbinden, müssen zu verbinden:
import smtplib
url = YOUR_EXCHANGE_SERVER
conn = smtplib.SMTP(url,587)
conn.starttls()
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD)
conn.login(user,password)
Jetzt können Sie wie eine normale Verbindung senden
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))
, um die E-Mails von Ihrem Posteingang zu erhalten ist es ein wenig anders
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()
das gibt Ihnen eine Liste der Nachrichten-ID‘ s, die Sie verwenden können, um E-Mails erhalten
latest_email_id = msg_id_list[-1]
result,data = conn.fetch(latest_email_id,"(RFC822)")
raw_email = data[0][1]
Jetzt raw_email ist Ihre E-Mail-messsage, aber es ist nicht sehr hübsch, wenn Sie es tun somthing wie folgt
analysieren möchtenfrom email.parser import Parser
p = Parser()
msg = p.parsestr(raw_email)
Jetzt können Sie tun,
msg.get('From')
msg.get('Subject')
oder für den Inhalt
msg.get_payload()
aber wenn du eine mehrteilige Nachricht Ihres brauchen würde ein wenig mehr Verarbeitung zu tun, luckly eine rekursive Lösung ist perfekt für diese 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
Jetzt
msg_contant = process_multipart_message(msg)
werden Sie die ganze Nachricht jedes Mal.
Sie werden einen Weg finden müssen, um den Prozess als dieser bestimmten Benutzer ausgeführt werden.
Ich denke, pywin32.CreateProcessAsUser der Anfang des Weges ist Sie müssen nach unten gehen. Ein zuletzt. Der angemeldete Benutzer Handle wird von der Verwendung des erhaltenen win32security.LogonUser Verfahren