Kể từ Python 3.2, được phát hành vào tháng 11 năm 2011, smtplib có một chức năng mới send_message
thay vì chỉ sendmail
, giúp xử lý To / CC / BCC dễ dàng hơn. Lấy từ các ví dụ email chính thức của Python , với một số sửa đổi nhỏ, chúng tôi nhận được:
# 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()
Sử dụng tiêu đề hoạt động tốt, vì send_message tôn trọng BCC như được nêu trong tài liệu :
send_message không truyền bất kỳ tiêu đề Bcc hoặc Resent-Bcc nào có thể xuất hiện trong tin nhắn
Thông sendmail
thường, việc thêm tiêu đề CC vào thư, thực hiện một số việc như:
msg['Bcc'] = blind.email@adrress.com
Hoặc là
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"
Vấn đề là, hàm sendmail xử lý tất cả các tiêu đề đó như nhau, có nghĩa là chúng sẽ được gửi (hiển thị) đến tất cả người dùng Tới: và BCC:, đánh bại mục đích của BCC. Giải pháp, như được trình bày trong nhiều câu trả lời khác ở đây, là không bao gồm BCC trong tiêu đề, và thay vào đó chỉ trong danh sách email được chuyển đến sendmail
.
Lưu ý là send_message
yêu cầu đối tượng Message, nghĩa là bạn sẽ cần nhập một lớp từ email.message
đó thay vì chỉ chuyển chuỗi vào sendmail
.