Python Sending Email

Sending emails using Python is generally done through the smtplib module, implementing the Simple Mail Transfer Protocol. This means you can send an email from a Python script to one or more recipients. Here’s how:

Requirements

To send emails, you will need:

  1. An email server (e.g., Gmail’s SMTP server).
  2. Credentials (email address and password or an app-specific password).
  3. Python installed on your machine.

Basic Steps to Send an Email

a. Import required libraries

  • smtplib for SMTP connection and email sending.
  • email.message.EmailMessage to create the email content.

b. Create an email

EmailMessage object is used to specify from where, to whom, the subject, and description. You can also attach files wherever necessary.

c. Creating an SMTP Connection

The methods to connect to the email server are smtplib.SMTP() and smtplib.SMTP_SSL().

d. Login to the server

You can log in using your credential details.

e. Sending an Email

By calling the send_message() method, it sends the email.

f. Close Connection

Always close the connection to free the resources.

Code Example

Here’s a step-by-step example of sending a plain-text email:

import smtplib
from email.message import EmailMessage

# Email details
sender_email = "your_email@example.com"
receiver_email = "recipient_email@example.com"
subject = "Test Email"
body = "Hello! This is a test email sent using Python."

# Create the EmailMessage object
msg = EmailMessage()
msg["From"] = sender_email
msg["To"] = receiver_email
msg["Subject"] = subject
msg.set_content(body)

# SMTP server details
smtp_server = "smtp.gmail.com"
smtp_port = 587 # For TLS
password = "your_email_password" # Use an app password for Gmail

# Send the email
try:
   # Connect to the SMTP server
   with smtplib.SMTP(smtp_server, smtp_port) as server:
      server.starttls() # Secure the connection
      server.login(sender_email, password) # Log in to the server
      server.send_message(msg) # Send the email
      print("Email sent successfully!")
except Exception as e:
   print(f"Failed to send email: {e}")

Advanced Features

a. Sending HTML Emails

You can set the content type to HTML:

msg.add_alternative("""
    <html>
        <body>
            <h1>Hello!</h1>
            <p>This is a test email with <b>HTML content</b>.</p>
        </body>
    </html>
""", subtype="html")

b. Attaching Files

To attach a file:

with open("document.pdf", "rb") as file:
   msg.add_attachment(file.read(), maintype="application", subtype="pdf", filename="document.pdf")

c. Sending Emails to Multiple Recipients

Use a list for the “To” field:

msg["To"] = ", ".join(["recipient1@example.com", "recipient2@example.com"])

Common SMTP Servers

Email ProviderSMTP ServerPort (TLS)Port (SSL)
Gmailsmtp.gmail.com587465
Outlooksmtp.office365.com587465
Yahoosmtp.mail.yahoo.com587465

Best Practices

  1. Use App Passwords: Most of the email services, including Gmail, ask for app-specific passwords and not your password.
  2. Environment Variables: Store sensitive information such as email and passwords within environment variables or configuration files, not within the code itself.
  3. Error Handling: Always use try-except blocks to handle errors gracefully.
  4. Limitations: Be aware of your email provider’s sending limits to avoid being flagged as spam.