Integrating Python with Email Delivery

Use Python to send emails through the Email Delivery service.

You can use Python to send emails through Email Delivery. Before you can send email you must configure Email Delivery in Python.

Important

These instructions contain sample code for your convenience and should be used as a reference. For client support, you must contact Python. These steps were tested on an Oracle Linux Server release 7.9 compute instance and Python 3.6. These steps assume you are logged into an Oracle Linux instance. Other distributions of Linux may have different commands and file locations. Java applications (including JavaMail) must be updated to the latest version to ensure that the latest protocols, ciphers, and security patches are in compliance with Oracle's supported security policies and ciphers.

Configure Python to Send Email Through Email Delivery

To enable Python to test the configuration of Email Delivery:

  1. Ensure Email Delivery is configured to send email. See Getting Started.
    Note

    The SMTP credentials are required to configure Python to use Email Delivery. Be sure to note the user name and password when you generate the SMTP credentials.
  2. Ensure Python is installed. The installation process differs depending on which operating system you are using. For example, run the following command to install Python on Oracle Linux:
    sudo yum install python3 -y
  3. In a file editor such as vi, create a python script to test Email Delivery.

    Run the following command:

    sudo vi ociemail.py
  4. In the ociemail.py file, replace the variables with your own values.
    For example:
    # python script for sending SMTP configuration with Oracle Cloud Infrastructure Email Delivery
    import smtplib 
    import email.utils
    from email.message import EmailMessage
    import ssl
    
    # Replace sender@example.com with your "From" address.
    # This address must be verified.
    # this is the approved sender email
    SENDER = 'sender@example.com'
    SENDERNAME = 'Sender Name'
     
    # Replace recipient@example.com with a "To" address. If your account
    # is still in the sandbox, this address must be verified.
    RECIPIENT = 'recipient@example.com'
     
    # Replace the USERNAME_SMTP value with your Email Delivery SMTP username.
    USERNAME_SMTP = 'ocid1.user.oc1..<unique_ID>@ocid1.tenancy.oc1..<unique_ID>.vf.com'
     
    # Put the PASSWORD value from your Email Delivery SMTP password into the following file.
    PASSWORD_SMTP_FILE = 'ociemail.config'
     
    # If you're using Email Delivery in a different region, replace the HOST value with an appropriate SMTP endpoint.
    # Use port 25 or 587 to connect to the SMTP endpoint.
    HOST = "smtp.us-ashburn-1.oraclecloud.com"
    PORT = 587
     
    # The subject line of the email.
    SUBJECT = 'Email Delivery Test (Python smtplib)'
     
    # The email body for recipients with non-HTML email clients.
    BODY_TEXT = ("Email Delivery Test\r\n"
                 "This email was sent through the Email Delivery SMTP "
                 "Interface using the Python smtplib package."
                )
     
    # The HTML body of the email.
    BODY_HTML = """<html>
    <head></head>
    <body>
      <h1>Email Delivery SMTP Email Test</h1>
      <p>This email was sent with Email Delivery using the
        <a href='https://www.python.org/'>Python</a>
        <a href='https://docs.python.org/3/library/smtplib.html'>
        smtplib</a> library.</p>
    </body>
    </html>"""
    
    # get the password from a named config file ociemail.config
    with open(PASSWORD_SMTP_FILE) as f:
        password_smtp = f.readline().strip()
    
    # create message container
    msg = EmailMessage()
    msg['Subject'] = SUBJECT
    msg['From'] = email.utils.formataddr((SENDERNAME, SENDER))
    msg['To'] = RECIPIENT
    
    # make the message multi-part alternative, making the content the first part
    msg.add_alternative(BODY_TEXT, subtype='text')
    # this adds the additional part to the message
    # According to RFC 2046, the last part of a multipart message, in this case
    # the HTML message, is best and preferred.
    msg.add_alternative(BODY_HTML, subtype='html')
    
    # Try to send the message.
    try: 
        server = smtplib.SMTP(HOST, PORT)
        server.ehlo()
        # most python runtimes default to a set of trusted public CAs that will include the CA used by OCI Email Delivery.
        # However, on platforms lacking that default (or with an outdated set of CAs), customers may need to provide a capath that includes our public CA.
        server.starttls(context=ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=None, capath=None))
        # smtplib docs recommend calling ehlo() before & after starttls()
        server.ehlo()
        server.login(USERNAME_SMTP, password_smtp)
        # our requirement is that SENDER is the same as From address set previously
        server.sendmail(SENDER, RECIPIENT, msg.as_string())
        server.close()
    # Display an error message if something goes wrong.
    except Exception as e:
        print(f"Error: {e}")
    else:
        print("Email successfully sent!")
    Note

    Python 2 and legacy email APIs should not be used with Email Delivery.
  5. In a file editor such as vi, create a file that contains the SMTP password. Run the following command and replace the contents with your SMTP password:
    sudo vi ociemail.config
  6. To send a test email with Python, run the following command from the directory the script is located in:
    python3 ociemail.py

More Information

More Python script examples can be found on GitHub.