Подключиться к почтовому ящику Exchange с помощью Python

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

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

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

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

4 ответа

Решение

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

Я знаю, что это старая тема, но...

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

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

ОБНОВЛЕНИЕ: я выпустил клиент Python EWS для PyPI, который поддерживает автообнаружение, календари, входящие, задачи, контакты и многое другое:

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)

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

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 - это ваше почтовое сообщение, но оно не очень красивое, если вы хотите разобрать его, сделайте что-то подобное

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)

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

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

Видеть это.

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

Другие вопросы по тегам