2008-11-13 5 views
16

Мне нужно подключиться к почтовому ящику Exchange в сценарии Python, без использования какой-либо настройки профиля на локальном компьютере (в том числе с использованием Outlook). Если я использую win32com для создания MAPI.Session, я могу выполнить вход (с помощью метода Logon()) с существующим профилем, но я хочу просто указать имя пользователя &.Подключиться к почтовому ящику Exchange с Python

Возможно ли это? Если да, может ли кто-нибудь предоставить пример кода? Я бы предпочел, чтобы он использовал только стандартную библиотеку и пакет pywin32. К сожалению, включение IMAP-доступа для сервера Exchange (а затем с помощью imaplib) невозможно.

В случае необходимости: весь скрипт будет подключаться к почтовому ящику и запускать сообщения в папке «Входящие», извлекая содержимое. Я могу обработать код для этого, если я смогу получить соединение в первую очередь!

Чтобы уточнить, касательно Outlook: Outlook будет установлен на локальном компьютере, но у него нет настроек учетных записей (т. Е. Все соответствующие библиотеки будут доступны, но мне нужно работать независимо от любой настройки внутри Outlook).

ответ

1

Я уверен, что это будет невозможно без использования Outlook и профиля MAPI. Если вы можете приветствовать своего почтового администратора в включении IMAP на сервере Exchange, это облегчит вашу жизнь.

+0

Включение IMAP не является вариантом (все было бы тривиально, если бы это было так, но, к сожалению, это не так). – 2008-11-13 22:32:41

+0

Да, это то, что я понял, но это стоило того. – 2008-11-13 22:40:00

+0

Я, наверное, должен был поставить это в вопросе в первую очередь (сделал это редактирование сейчас). Спасибо :) – 2008-11-13 22:50:41

1

Вам нужно будет найти способ запуска процесса как конкретного пользователя.

See this.

Я думаю pywin32.CreateProcessAsUser это начало пути, который вы должны пойти вниз. Последнее редактирование. Вошедшего в систему пользователя ручки получают от использования win32security.LogonUser метода

59

Я знаю, что это старый нить, но ...

Если вы используете Exchange 2007 или более поздней версии, или Office365, посмотрите на бирже Веб-сервисы. Это довольно всеобъемлющий интерфейс на основе SOAP для Exchange, и вы можете делать практически все, что может сделать Outlook, в том числе делегировать или выдавать себя за другие учетные записи пользователей.

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

UPDATE: Я выпустил Python EWS client на PyPI, который поддерживает автообнаружения, календари, входящие, задачи и контакты:

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

Ive получил его, чтобы подключиться к исходящему обмена необходимо подключить как это:

import smtplib 

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

теперь вы можете отправить как обычный связи

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

, чтобы получить почту из почтового ящика его немного иначе

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

это дает вам список сообщений ид» с, что вы можете использовать, чтобы получить ваши письма

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

теперь raw_email - это ваш почтовый messsage, но его не очень красиво, если вы хотите его разобрать, что-то вроде этого

from email.parser import Parser 

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

теперь вы можете сделать

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

или для содержания

msg.get_payload() 

, но если его составного сообщения вы двигаетесь, нужно сделать немного больше обработки, воистину счастлив рекурсивное решение идеально подходит для этого ситуация

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 

Теперь

msg_contant = process_multipart_message(msg) 

предоставит вам все сообщение каждый раз.

Смежные вопросы