2008-11-13 13 views
16

Ich muss eine Verbindung zu einem Exchange-Postfach in einem Python-Skript ohne Verwendung von Profil-Setup auf dem lokalen Computer (einschließlich Outlook). Wenn ich win32com verwende, um eine MAPI.Session zu erstellen, könnte ich mich (mit der Logon() Methode) mit einem bestehenden Profil anmelden, aber ich möchte nur einen Benutzernamen & Passwort angeben.Verbinden mit Exchange-Postfach mit Python

Ist das möglich? Wenn ja, könnte jemand Beispielcode bereitstellen? Ich würde es vorziehen, wenn es nur die Standardbibliothek und das pywin32-Paket verwendet. Leider ist das Aktivieren des IMAP-Zugriffs für den Exchange-Server (und dann das Verwenden von imaplib) nicht möglich.

Für den Fall, dass es notwendig ist: das ganze Skript wird tun, ist die Verbindung mit dem Postfach und durch die Nachrichten im Posteingang, Abrufen der Inhalte. Ich kann den Code dafür schreiben, wenn ich überhaupt eine Verbindung bekomme!

Um in Bezug auf Outlook zu klären: Outlook wird auf dem lokalen Rechner installiert, aber es hat keine Konten Setup (d. H. Alle entsprechenden Bibliotheken werden verfügbar sein, aber ich muss unabhängig von Setup in Outlook funktionieren).

Antwort

1

Ich bin mir ziemlich sicher, dass dies ohne Outlook und ein MAPI-Profil unmöglich sein wird. Wenn Sie Ihren Mail-Administrator dazu bringen können, IMAP auf dem Exchange-Server zu aktivieren, wird Ihr Leben viel einfacher.

+0

Aktivieren von IMAP ist keine Option (die ganze Sache wäre trivial, wenn es war, aber leider ist es nicht). –

+0

Ja, das ist, was ich dachte, aber es war einen Versuch wert. –

+0

Ich hätte das wohl in die Frage stellen sollen (machte das jetzt editieren). Danke :) –

1

Sie müssen einen Weg finden, um den Prozess als dieser bestimmte Benutzer auszuführen.

See this.

Ich denke pywin32.CreateProcessAsUser der Anfang des Weges ist, dass Sie nach unten gehen müssen. Eine letzte Bearbeitung. Der angemeldete Benutzer Griff ist aus mit dem win32security.LogonUser Verfahren erhalten

59

Ich weiß, das ist ein alter Thread, aber ...

Wenn Sie mit Exchange 2007 oder neuer, oder Office365, werfen Sie einen Blick auf Austausch Internetdienste. Es ist eine ziemlich umfassende SOAP-basierte Schnittstelle für Exchange, und Sie können so gut wie alles tun, was Outlook zu tun in der Lage ist, einschließlich Delegate oder Identitätswechsel Zugriff auf andere Benutzerkonten.

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

UPDATE: Ich habe ein Python EWS client auf PyPI veröffentlicht, die Autoermittlung, Kalender, Posteingang, Aufgaben und Kontakte unterstützt:

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

+1, da dies die akzeptierte Antwort sein sollte. –

+0

Gibt es eine Python-Wrapper-Bibliothek, die das implementiert? –

+0

Ist dieser EWS-Client in Python 2.7 verfügbar? – Ryan

21

Ive erhielt es, um Outbound-Austausch verbinden Sie verbinden müssen dies wie:

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

die E-Mail aus Ihrem Posteingang seines 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 zu erhalten, die Sie Ihre E-Mails erhalten

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

verwenden können jetzt raw_email ist Ihre E-Mail messagesage, aber es ist nicht sehr schön, wenn Sie es analysieren wollen, tun etwas wie diese

from 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 ihr eine mehrteilige Nachricht ein wenig mehr Verarbeitung, Sie gehen zu müssen luckly ist für diese perfekte eine rekursive Lösung zu tun 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) 

gibt Ihnen die ganze Nachricht jedes Mal.

+0

Ich muss Verbinden Sie sich mit Port 443 und setzen Sie die Sicherheit auf SSL/TLS (alle Zertifikate akzeptieren). Wie würde ich das tun? Habe bisher aber kein Ergebnis gesucht. – Timo002

+0

conn.starttls() vor dem Einloggen – lxx

+0

Wenn ich eine Datei bearbeiten muss, die mit dem Skript an meine E-Mail gesendet wird - wie kann ich ihn holen? Danke !! – Bramat