Skip to content
Advertisement

How can I send an email with an attachment with Python and Microsoft Exchange?

Can someone help me send an email from my exchange account and add attachments. SMTP doesnt work, I get immediate timeout issues. 0365 doesn’t save a copy to my sent folder. The only other one I know is exchangelib

from exchangelib import Account, Credentials, Message, Mailbox, FileAttachment
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders

email = 'XXXXXXXX'
password = 'XXXXXXXX'

a = Account(email, credentials=Credentials(email, password), autodiscover=True)



dir_path = ('C:/Users/Istcrmt/Documents/Python/PythonforAnaconda3.5/')
excel_name = 'test.xlsx'

#attach an excel file:


for i in email_list.itertuples():
# if you want a copy in the 'Sent' folder
    m = Message(
        account=a 
        ,folder=a.sent
        ,subject=(i.AGENCY_NAME + ' I made an email script.')
        ,body='All bodies are beautiful' 
        ,to_recipients=[Mailbox(email_address=i.NEW_MAIL)])

#attach files
    m.attachments.append(part) 
   # m.attach(cover_letter)

    m.send_and_save()

Advertisement

Answer

This is how you send emails with an attachment with exchangelib:

from exchangelib import ServiceAccount, Configuration, Account, DELEGATE
from exchangelib import Message, Mailbox, FileAttachment

from config import cfg  # load your credentials


def send_email(account, subject, body, recipients, attachments=None):
    """
    Send an email.

    Parameters
    ----------
    account : Account object
    subject : str
    body : str
    recipients : list of str
        Each str is and email adress
    attachments : list of tuples or None
        (filename, binary contents)

    Examples
    --------
    >>> send_email(account, 'Subject line', 'Hello!', ['info@example.com'])
    """
    to_recipients = []
    for recipient in recipients:
        to_recipients.append(Mailbox(email_address=recipient))
    # Create message
    m = Message(account=account,
                folder=account.sent,
                subject=subject,
                body=body,
                to_recipients=to_recipients)

    # attach files
    for attachment_name, attachment_content in attachments or []:
        file = FileAttachment(name=attachment_name, content=attachment_content)
        m.attach(file)
    m.send_and_save()


credentials = ServiceAccount(username=cfg['user'],
                             password=cfg['password'])

config = Configuration(server=cfg['server'], credentials=credentials)
account = Account(primary_smtp_address=cfg['smtp_address'], config=config,
                  autodiscover=False, access_type=DELEGATE)

# Read attachment
attachments = []
with open('filestorage/numbers-test-document.pdf', 'rb') as f:
    content = f.read()
attachments.append(('whatever.pdf', content))

# Send email
send_email(account, 'Test 14:35', 'works', ['info@example.com'],
           attachments=attachments)

Related: Read emails and download attachment from an Exchange Server

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement