2026-07-15

Attach a txt file in Python smtplib

Stefan Bogdanescu

Stefan Bogdanescu

Founder & Senior Architect

Attach a txt file in Python smtplib

Mastering Email Attachments in Python: Attaching TXT Files with smtplib

Sending emails is a fundamental task in almost every application, whether you are building a backend service or an internal notification system. While sending plain text bodies is straightforward, attaching files requires understanding the intricacies of the MIME (Multipurpose Internet Mail Extensions) standard.

If you are working with Python's smtplib, you can certainly attach files. The provided snippet focuses on sending simple text; now let’s dive into how to seamlessly integrate file attachments, specifically a .txt file, into that process.

Understanding the MIME Structure for Attachments

When you send an email, it's not just a simple block of text; it's a complex message formatted according to MIME standards. To include an attachment, you need to build this structure correctly. Instead of just putting the file content directly into the main body, you must wrap the file data in a specific MIME part, defining its type and disposition (how the recipient should handle it).

For attachments, we use MIMEApplication. This class allows us to define the file itself as a distinct part of the email message. We need to read the file in binary mode ('rb') because files are transmitted as raw bytes.

Step-by-Step Guide to Attaching a File

To attach your log_file.txt, we will modify your existing function to handle both the text body and the file attachment simultaneously.

Prerequisites

Ensure you have the file you wish to attach in the same directory where your script runs. For this example, let's assume log_file.txt exists.

The Complete Python Implementation

Here is the revised code demonstrating how to read the file content and attach it using smtplib.

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import header

def send_message_with_attachment(smtp_server, smtp_port, username, password, toEmail, fromEmail, attachment_filename):
    # 1. Create the main container message
    msg = MIMEMultipart('mixed') # Use 'mixed' for text and attachments
    msg['From'] = fromEmail
    msg['To'] = toEmail
    msg['Subject'] = 'Email with Attachment'

    # 2. Attach the text body
    body = 'This is the main message content.'
    content = MIMEText(body, 'plain')
    msg.attach(content)

    # 3. Handle the attachment (The core step)
    try:
        with open(attachment_filename, 'rb') as f:
            file_data = f.read()
            
        # Create a MIMEBase object for the file part
        part = MIMEBase('application', 'octet-stream') # General binary stream type
        part.set_payload(file_data)
        
        # Encode the file content to base64 for safe transmission
        from email.mime.base import MIMEBase as MIMEBaseClass
        import base64
        encoded_file = base64.encode(file_data)
        part.add_header(header.Content_Disposition('attachment', filename=attachment_filename))
        part.add_header(header.Content_Type, 'text/plain') # Set content type for the file

        msg.attach(part)
        
    except FileNotFoundError:
        print(f"Error: Attachment file '{attachment_filename}' not found.")
        return
    except Exception as e:
        print(f"An error occurred during attachment: {e}")
        return


    # 4. Send the email via SMTP
    try:
        s = smtplib.SMTP(smtp_server, smtp_port)
        s.starttls() # Secure the connection
        s.login(username, password)
        
        # Send the fully constructed message string
        text = msg.as_string()
        s.sendmail(fromEmail, toEmail, text)
        print("Email sent successfully with attachment!")
    except Exception as e:
        print(f"Failed to send email: {e}")
    finally:
        s.quit()

# Example Usage (Replace placeholders with your actual credentials)
if __name__ == '__main__':
    SMTP_SERVER = 'smtp.sendgrid.net'
    SMTP_PORT = 587
    USERNAME = 'your_username'
    PASSWORD = 'your_password'
    TO_EMAIL = 'recipient@example.com'
    FROM_EMAIL = 'sender@example.com'
    ATTACHMENT = 'log_file.txt'

    send_message_with_attachment(SMTP_SERVER, SMTP_PORT, USERNAME, PASSWORD, TO_EMAIL, FROM_EMAIL, ATTACHMENT)

Best Practices and Developer Notes

The key takeaway here is that attachments require careful handling of MIME headers and data encoding. We read the file in binary mode ('rb'), encode the resulting bytes using Base64 (which is standard practice for embedding binary data within text-based email protocols), and then attach this encoded data to the message object.

When designing robust systems, especially when integrating external services or handling complex data flows—much like how you structure requests and responses in a Laravel application—data integrity is paramount. If your system needs to handle file uploads or attachments frequently, consider using established libraries rather than reinventing MIME encoding from scratch. While Python's smtplib gives us the raw control, ensuring compliance with the full MIME specification is essential for reliable delivery across various email clients.

For more advanced application architecture advice on handling data and services in a structured way, understanding how robust applications manage state and external interactions is key; this focus on secure data transmission mirrors the principles of building solid features within frameworks like Laravel, where data integrity guides every interaction.

Conclusion

Attaching a .txt file to an email via smtplib involves moving beyond simple text composition into the realm of MIME encoding. By correctly reading the file in binary mode, applying appropriate headers (especially Content-Disposition), and Base64 encoding the payload, you transform raw bytes into a properly structured attachment that any mail server can understand. Mastering this process ensures your application not only sends messages but does so reliably and completely.

Tags:

Enhance your marketing setup with your own email marketing platform.

Join the growing number of SaaS platforms using Laravel Mail to offer email marketing solutions to their customers.