2008-11-13 11 views
16

Muszę połączyć się ze skrzynką pocztową programu Exchange w skrypcie w języku Python, bez korzystania z żadnych ustawień profilu na komputerze lokalnym (w tym przy użyciu programu Outlook). Jeśli używam win32com do tworzenia sesji MAPI, mogę logować się (za pomocą metody Logon()) z istniejącym profilem, ale chcę podać tylko nazwę użytkownika & hasło.Połącz się ze skrzynką pocztową Exchange za pomocą Pythona

Czy to możliwe? Jeśli tak, czy ktoś może podać przykładowy kod? Wolałbym, gdyby używał tylko standardowej biblioteki i pakietu pywin32. Niestety, włączenie dostępu IMAP do serwera Exchange (a następnie użycie imaplib) nie jest możliwe.

W przypadku, gdy jest to konieczne: cały skrypt będzie wykonywał połączenie ze skrzynką pocztową i przeglądanie wiadomości w skrzynce odbiorczej, pobieranie zawartości. Potrafię napisać kod do tego, jeśli uda mi się uzyskać połączenie w pierwszej kolejności!

Aby wyjaśnić, w odniesieniu do programu Outlook: Outlook zostanie zainstalowany na komputerze lokalnym, ale nie ma żadnych ustawień konta (tj. Wszystkie odpowiednie biblioteki będą dostępne, ale muszę działać niezależnie od niczego, co konfiguruje się w programie Outlook).

Odpowiedz

1

Jestem prawie pewien, że to nie będzie możliwe bez użycia Outlooka i profilu MAPI. Jeśli możesz słodko porozmawiać z administratorem poczty o włączeniu IMAP na serwerze Exchange, znacznie ułatwi Ci to życie.

+0

Włączenie protokołu IMAP nie jest opcją (całość byłaby banalna, gdyby tak było, ale niestety nie jest). –

+0

Tak, właśnie to wymyśliłem, ale warto było spróbować. –

+0

Najprawdopodobniej powinienem umieścić to w pytaniu (dokonałem tego teraz). Dzięki :) –

1

Będziesz musiał znaleźć sposób na uruchomienie procesu jako ten konkretny użytkownik.

See this.

myślę pywin32.CreateProcessAsUser to początek drogi trzeba zejść. Ostatnia edycja. Zalogowanego użytkownika rączką uzyskuje się z zastosowaniem metody

59

Wiem, że to stary wątek win32security.LogonUser, ale ...

Jeśli używasz programu Exchange 2007 lub nowszy, lub Office 365, spojrzeć na Giełdzie Usługi internetowe. Jest to całkiem obszerny interfejs SOAP dla Exchange i można zrobić prawie wszystko, co może zrobić program Outlook, w tym delegować lub podszywać się pod inne konta użytkowników.

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

UPDATE: I wydali Python EWS client na PyPI który obsługuje automatycznego wykrywania, kalendarze, skrzynki, zadania i kontakty:

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, ponieważ powinna to być zaakceptowana odpowiedź. –

+0

Czy istnieje biblioteka pakunku Pythona, która implementuje to? –

+0

Czy ten klient EWS jest dostępny w Pythonie 2.7? – Ryan

21

Ive got it, aby podłączyć do wymiany wychodzącej trzeba połączyć tak:

import smtplib 

url = YOUR_EXCHANGE_SERVER 
conn = smtplib.SMTP(url,587) 
conn.starttls() 
user,password = (EXCHANGE_USER,EXCHANGE_PASSWORD) 
conn.login(user,password) 

teraz można wysłać jak normalne połączenie

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

aby odebrać pocztę ze skrzynki odbiorczej jej trochę innego

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

to daje listę wiadomości id” s, które można użyć, aby uzyskać e-maile

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

teraz raw_email to twój adres e-mail, ale nie jest piękny, jeśli chcesz go przetworzyć, coś takiego, jak to

from email.parser import Parser 

p = Parser() 
msg = p.parsestr(raw_email) 

teraz można zrobić

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

lub za treść

msg.get_payload() 

ale jeśli jego wieloczęściowej wiadomości swój zamiar trzeba zrobić trochę więcej przetwarzania, luckly rekurencyjny rozwiązanie jest idealne do tego sytuacja

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 

teraz

msg_contant = process_multipart_message(msg) 

da ci całą wiadomość za każdym razem.

+0

Potrzebuję połączyć się z portem 443 i ustawić zabezpieczenia na SSL/TLS (akceptuj wszystkie certyfikaty). Jak to zrobić? Szukałem go, ale do tej pory nie osiągnąłem rezultatu. – Timo002

+0

conn.starttls() przed zalogowaniem – lxx

+0

Jeśli potrzebuję obsługi pliku, który jest wysyłany do mojego adresu e-mail za pomocą skryptu - w jaki sposób mogę go pobrać? Dzięki! – Bramat

Powiązane problemy