Ответ 1
Я уверен, что это будет невозможно без использования Outlook и профиля MAPI. Если вы можете приветствовать своего администратора почты, включив IMAP на сервере Exchange, это облегчит вам жизнь.
Мне нужно подключиться к почтовому ящику Exchange в Python script без использования каких-либо настроек профиля на локальном компьютере (в том числе с использованием Outlook). Если я использую win32com для создания MAPI.Session, я мог бы войти в систему (с помощью метода Logon()) с существующим профилем, но я хочу просто указать имя пользователя и пароль.
Возможно ли это? Если да, может ли кто-нибудь предоставить пример кода? Я бы предпочел, чтобы он использовал только стандартную библиотеку и пакет pywin32. К сожалению, включение IMAP-доступа для сервера Exchange (а затем с помощью imaplib) невозможно.
В случае необходимости: все script будет подключаться к почтовому ящику и запускать сообщения в папке "Входящие", извлекая содержимое. Я могу обработать код для этого, если я могу получить соединение в первую очередь!
Чтобы прояснить Outlook: Outlook будет установлен на локальном компьютере, но у него нет настроек учетных записей (т.е. будут доступны все соответствующие библиотеки, но мне нужно работать независимо от любой настройки внутри Outlook).
Я уверен, что это будет невозможно без использования Outlook и профиля MAPI. Если вы можете приветствовать своего администратора почты, включив IMAP на сервере Exchange, это облегчит вам жизнь.
Я знаю, что это старый поток, но...
Если вы используете 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)
Я получил его, чтобы подключиться к исходящему обмену, вам нужно подключиться следующим образом:
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)
предоставит вам все сообщение каждый раз.
Вам нужно найти способ запуска процесса как конкретного пользователя.
Я думаю, pywin32.CreateProcessAsUser - это начало пути, по которому вам нужно идти вниз. Последнее редактирование. Обработанный пользовательский дескриптор получается из метода win32security.LogonUser