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

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

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

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

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

Ответы

Ответ 1

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

Ответ 2

Я знаю, что это старый поток, но...

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

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

UPDATE: я выпустил

python noreferrer → 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)

Ответ 3

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

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

это дает вам список идентификаторов сообщений ' s, которые вы можете использовать для получения своих писем

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

now

msg_contant = process_multipart_message(msg)

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

Ответ 4

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

Смотрите это.

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