Станом на Python 3.2, що вийшов у листопаді 2011 року, smtplib має нову функцію send_message
замість справедливої sendmail
, що полегшує роботу з To / CC / BCC. Витягуючи з офіційних прикладів електронної пошти Python , з невеликими модифікаціями, ми отримуємо:
# Import smtplib for the actual sending function
import smtplib
# Import the email modules we'll need
from email.message import EmailMessage
# Open the plain text file whose name is in textfile for reading.
with open(textfile) as fp:
# Create a text/plain message
msg = EmailMessage()
msg.set_content(fp.read())
# me == the sender's email address
# you == the recipient's email address
# them == the cc's email address
# they == the bcc's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you
msg['Cc'] = them
msg['Bcc'] = they
# Send the message via our own SMTP server.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()
Використання заголовків працює добре, оскільки send_message поважає BCC, як зазначено в документації :
send_message не передає жодних заголовків Bcc або Resent-Bcc, які можуть з’являтися у msg
Зазвичай sendmail
було додати до повідомлення заголовки CC, роблячи щось таке:
msg['Bcc'] = blind.email@adrress.com
Або
msg = "From: from.email@address.com" +
"To: to.email@adress.com" +
"BCC: hidden.email@address.com" +
"Subject: You've got mail!" +
"This is the message body"
Проблема полягає в тому, що функція sendmail трактує всі ці заголовки однаково, це означає, що вони будуть надіслані (видимо) всім користувачам: та BCC: перемагаючи цілі BCC. Рішення, як показано в багатьох інших відповідях тут, полягала в тому, щоб не включати BCC до заголовків, а натомість лише до списку електронних листів, переданих до sendmail
.
Застереження полягає в тому, що send_message
потрібен об’єкт Message, тобто вам потрібно імпортувати клас, email.message
а не просто передавати рядки в sendmail
.