4

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()
Martin Thoma
  • 124,992
  • 159
  • 614
  • 958
Tinkinc
  • 449
  • 2
  • 8
  • 21

1 Answers1

15

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

Martin Thoma
  • 124,992
  • 159
  • 614
  • 958
  • Not sure why it's not working for me. Account object is throwing error: Traceback (most recent call last): exchangelib.errors.AutoDiscoverFailed: All steps in the autodiscover protocol failed – amandeep1991 Jan 15 '19 at 15:00
  • You may have autodiscover turned off for your account by your admin. You can test autodiscover at https://testconnectivity.microsoft.com using the outlook connectivity test. – Isaacnfairplay Sep 20 '22 at 18:40