constdoc constdoc
constdoc constdoc

Reputation: 74

Using Python and gmail API, how can I send messages with multiple attachements?

Looking to create and send messages with multiple files attached. Per the online gmail api documentation, there is a function for building messages with an attachment but no documentation for howto use it to create a message with multiple attachments.

Can I use the gmail API to send messages with multiple attachments programmatically? How might one do this?

Upvotes: 0

Views: 854

Answers (1)

xiaxio
xiaxio

Reputation: 631

With this function, you can send to one or multiple recipient emails, and also you can attach zero, one or more files. Coding improvement recommendations are welcome, however the way it is now, it works.

Python v3.7

smtplib from https://github.com/python/cpython/blob/3.7/Lib/smtplib.py (download the code and create the smtplib.py on your project folder)

def send_email(se_from, se_pwd, se_to, se_subject, se_plain_text='', se_html_text='', se_attachments=[]):
    """ Send an email with the specifications in parameters

    The following youtube channel helped me a lot to build this function:
    https://www.youtube.com/watch?v=JRCJ6RtE3xU
    How to Send Emails Using Python - Plain Text, Adding Attachments, HTML Emails, and More
    Corey Schafer youtube channel

    Input:
        se_from : email address that will send the email
        se_pwd : password for authentication (uses SMTP.SSL for authentication)
        se_to : destination email. For various emails, use ['[email protected]', '[email protected]']
        se_subject : email subject line
        se_plain_text : body text in plain format, in case html is not supported
        se_html_text : body text in html format
        se_attachments : list of attachments. For various attachments, use ['path1\file1.ext1', 'path2\file2.ext2', 'path3\file3.ext3']. Follow your OS guidelines for directory paths. Empty list ([]) if no attachments

    Returns
    -------
        se_error_code : returns True if email was successful (still need to incorporate exception handling routines)
    """

    import smtplib
    from email.message import EmailMessage

    # Join email parts following smtp structure
    msg = EmailMessage()
    msg['From'] = se_from
    msg['To'] = se_to
    msg['Subject'] = se_subject
    msg.set_content(se_plain_text)
    # Adds the html text only if there is one
    if se_html_text != '':
        msg.add_alternative("""{}""".format(se_html_text), subtype='html')

    # Checks if there are files to be sent in the email
    if len(se_attachments) > 0:
        # Goes through every file in files list
        for file in se_attachments:
            with open(file, 'rb') as f:
                file_data = f.read()
                file_name = f.name
            # Attaches the file to the message. Leaves google to detect the application to open it
            msg.add_attachment(file_data, maintype='application', subtype='octet-stream', filename=file_name)

    # Sends the email that has been built
    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
        smtp.login(se_from, se_pwd)
        smtp.send_message(msg)

    return True

Don't forget to activate less secure apps on your google account (https://myaccount.google.com/lesssecureapps) for this code to work.

Hope this helps

Upvotes: 1

Related Questions