Connect to Exchange mailbox with Python [closed] Connect to Exchange mailbox with Python [closed] python python

Connect to Exchange mailbox with Python [closed]


I know this is an old thread, but...

If you're using Exchange 2007 or newer, or Office365, take a look at Exchange Web Services. It's a pretty comprehensive SOAP-based interface for Exchange, and you can do pretty much anything Outlook is able to do, including delegate or impersonation access to other user accounts.

https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/ews-reference-for-exchange

UPDATE: I have released a Python EWS client on PyPI that supports autodiscover, calendars, inbox, tasks, contacts, and more:

from exchangelib import DELEGATE, Account, Credentialscredentials = Credentials(    username='MYWINDOMAIN\\myusername',  # Or myusername@example.com for O365    password='topsecret')a = Account(    primary_smtp_address='john@example.com',     credentials=credentials,     autodiscover=True,     access_type=DELEGATE)# Print first 100 inbox messages in reverse orderfor item in a.inbox.all().only('subject').order_by('-datetime_received')[:100]:    print(item.subject)


Ive got it, to connect to outbound exchange you need to connect like this:

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

now you can send like a normal connection

message = 'From: FROMADDR\nTo: TOADDRLIST\nSubject: Your subject\n\n{}'from, to = fromaddr,toaddrstxt = 'This is my message'conn.sendmail(fromaddr,toaddrs,msg.format(txt))

to get the mail from your inbox its a little different

import imapliburl = YOUR_EXCHANGE_URLconn = 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()

this gives you a list of message id's that you can use to get your emails

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

now raw_email is your email messsage, but its not very pretty, if you want to parse it do somthing like this

from email.parser import Parserp = Parser()msg = p.parsestr(raw_email)

now you can do

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

or for the content

msg.get_payload()

but if its a multipart message your going to need to do a little more processing, luckly a recursive solution is perfect for this situation

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)

will give you the whole message every time.


I'm pretty sure this is going to be impossible without using Outlook and a MAPI profile. If you can sweet talk your mail admin into enabling IMAP on the Exchange server it would make your life a lot easier.