Sending Emails with To, CC, and BCC Using Python SMTP Library

Nov 23, 2025 · Programming · 10 views · 7.8

Keywords: Python | SMTP | Email_Sending | CC | BCC

Abstract: This article provides a comprehensive guide on using Python's smtplib library to send emails with To, CC, and BCC recipients. By analyzing SMTP protocol mechanics, it explains why CC recipients must be added to both email headers and recipient lists, while BCC recipients only need to be in the recipient list. Complete code examples demonstrate proper message construction and recipient parameter settings to ensure accurate delivery to all specified addresses while maintaining BCC privacy.

SMTP Protocol and Email Sending Fundamentals

In email systems, SMTP (Simple Mail Transfer Protocol) handles message transmission. Understanding how SMTP servers process recipient information is crucial for correctly sending emails with To, CC, and BCC fields. SMTP servers primarily focus on recipient addresses specified in the RCPT TO command, without parsing To, CC, or BCC fields in email headers.

Difference Between Email Headers and Recipient Lists

Email headers are displayed to email client users, while recipient lists determine actual message delivery. CC (Carbon Copy) recipients need to appear in both the CC header field and the recipient list to ensure delivery. BCC (Blind Carbon Copy) recipients should not appear in any header fields but must be included in the recipient list.

Python smtplib Implementation Details

When using Python's smtplib library to send emails, proper parameter configuration for the sendmail function is essential. The following code demonstrates a complete implementation:

import smtplib

# Set sender and recipient addresses
fromaddr = 'giles@sunnydale.k12.ca.us'
toaddr = 'buffy@sunnydale.k12.ca.us'
cc = ['alexander@sunnydale.k12.ca.us', 'willow@sunnydale.k12.ca.us']
bcc = ['chairman@slayerscouncil.uk']

# Construct email content
message_subject = "disturbance in sector 7"
message_text = "Three are dead in an attack in the sewers below sector 7."

message = "From: %s\r\n" % fromaddr
        + "To: %s\r\n" % toaddr
        + "CC: %s\r\n" % ",".join(cc)
        + "Subject: %s\r\n" % message_subject
        + "\r\n"
        + message_text

# Combine all recipient addresses
toaddrs = [toaddr] + cc + bcc

# Connect to SMTP server and send email
server = smtplib.SMTP('smtp.sunnydale.k12.ca.us')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()

Key Implementation Points

Several critical aspects require attention during implementation:

Modern Python Version Improvements

Starting from Python 3.2, smtplib provides the send_message method, offering a more streamlined approach to email sending. This method automatically handles BCC fields without including BCC headers in sent messages:

from email.message import EmailMessage
import smtplib

msg = EmailMessage()
msg.set_content("Email body content")
msg['Subject'] = 'Email subject'
msg['From'] = 'sender@address.com'
msg['To'] = 'recipient@address.com'
msg['Cc'] = 'cc@address.com'
msg['Bcc'] = 'bcc@address.com'

s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

The send_message method automatically extracts all recipients (including BCC) from the email object and removes BCC headers during transmission, ensuring BCC privacy.

Practical Application Considerations

When sending bulk test emails, additional factors should be considered:

By properly understanding SMTP protocol mechanics and Python smtplib library usage, reliable email sending functionality with To, CC, and BCC can be implemented to meet various testing and practical application requirements.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.