如何在Python中发送隐藏收件人的多份邮件?
解决邮件收件人互相可见的问题
你当前代码的问题在于把所有收件人都塞进了To字段,所以每个收件人打开邮件时都能看到其他收件人的地址。要实现隐藏收件人,有两种靠谱的方法:
方法一:使用密送(Bcc)字段
密送字段里的收件人不会被其他收件人看到,只需调整邮件头的设置即可:
import smtplib from email.message import EmailMessage email_subject = "Good morning" sender_email_address = "user@outlook.com" receivers_email_address = ['reciever1@gmail.com', 'reciever2@gmail.com'] email_smtp = "smtp.office365.com" email_password = "MyPassword" # 创建邮件对象 message = EmailMessage() # 配置邮件头 message['Subject'] = email_subject message['From'] = sender_email_address # 将To设为自己(或占位邮箱),避免收件人看到空的To字段 message['To'] = sender_email_address # 用Bcc存放所有收件人,他们互相看不到对方地址 message['Bcc'] = receivers_email_address # 读取HTML邮件内容 with open('message.html', 'r') as file: file_content = file.read() # 设置HTML格式的邮件内容 message.set_content(file_content, subtype='html') # 连接SMTP服务器 server = smtplib.SMTP(email_smtp, '587') server.ehlo() server.starttls() server.login(sender_email_address, email_password) # 发送邮件 server.send_message(message) # 关闭连接 server.quit()
方法二:逐个单独发送邮件
这种方法会给每个收件人单独发送一封邮件,每封邮件的To字段只有对方自己的地址,完全避免信息泄露:
import smtplib from email.message import EmailMessage email_subject = "Good morning" sender_email_address = "user@outlook.com" receivers_email_address = ['reciever1@gmail.com', 'reciever2@gmail.com'] email_smtp = "smtp.office365.com" email_password = "MyPassword" # 提前读取HTML内容,避免重复打开文件 with open('message.html', 'r') as file: file_content = file.read() # 连接SMTP服务器 server = smtplib.SMTP(email_smtp, '587') server.ehlo() server.starttls() server.login(sender_email_address, email_password) # 循环给每个收件人单独发邮件 for receiver in receivers_email_address: message = EmailMessage() message['Subject'] = email_subject message['From'] = sender_email_address message['To'] = receiver message.set_content(file_content, subtype='html') server.send_message(message) print(f"邮件已发送给 {receiver}") # 关闭连接 server.quit()
注意事项
- 使用Bcc时,部分邮箱服务商可能限制单次密送的人数,若收件人数量较多,建议优先用第二种方法。
- 循环发送时不要过于频繁,避免触发邮箱的反垃圾邮件机制,必要时可添加短暂延时(如
time.sleep(1))。
内容的提问来源于stack exchange,提问作者Juan Jose Acevedo
相关产品推荐
相关产品推荐

