Począwszy od Pythona 3.2, wydanego w listopadzie 2011 r., Smtplib ma nową funkcję send_message
zamiast just sendmail
, co ułatwia obsługę To / CC / BCC. Wyciągając z oficjalnych przykładów wiadomości e-mail w języku Python , z niewielkimi modyfikacjami, otrzymujemy:
# 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()
Używanie nagłówków działa dobrze, ponieważ send_message respektuje BCC, jak opisano w dokumentacji :
send_message nie przesyła żadnych nagłówków Bcc ani Resent-Bcc, które mogą pojawić się w msg
Z sendmail
było wspólne, aby dodać nagłówki CC do wiadomości, robi coś, takich jak:
msg['Bcc'] = blind.email@adrress.com
Lub
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"
Problem polega na tym, że funkcja sendmail traktuje wszystkie te nagłówki tak samo, co oznacza, że zostaną one wysłane (widocznie) do wszystkich użytkowników To: i BCC:, pokonując cele BCC. Rozwiązaniem, jak pokazano w wielu innych tutaj odpowiedziach, było nie umieszczanie BCC w nagłówkach, a zamiast tego tylko na liście wiadomości e-mail przekazywanych sendmail
.
Zastrzeżenie polega na tym, że send_message
wymaga obiektu Message, co oznacza, że musisz zaimportować klasę z, email.message
a nie tylko przekazywać ciągi do sendmail
.