Подключиться к почтовому ящику 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