Начиная с Python 3.2, выпущенного в ноябре 2011 года, smtplib имеет новую функцию send_message
вместо just 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, которые могут появляться в сообщении.
С 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 обрабатывает все эти заголовки одинаково, что означает, что они будут отправлены (явно) всем пользователям To: и BCC:, что противоречит целям BCC. Решение, как показано во многих других ответах здесь, заключалось в том, чтобы не включать BCC в заголовки, а вместо этого только в список отправленных писем sendmail
.
Предостережение заключается в том, что send_message
требуется объект Message, то есть вам нужно будет импортировать класс из, email.message
а не просто передавать строки в sendmail
.