Python中如何用smtplib群发邮件,让收件人栏只显示自己的邮箱而不暴露其他收件人地址?
问题描述:
1、一开始我发一次邮件,只不过设置收件人是包含多个地址的 list,通过','.join(receivers)来进行群发,这样收件人显示所有 receivers
2、后面又利用循环,发多次邮件,收件人是单个地址,每个人都发一次。但是这样收件人还是显示多个,猜想是服务器根据内容相同把收件人自动合并
解决方法:
1、通过循环,每发完一次,sleep ( 30 )秒,这样应该就不会显示多个 receivers,但是效率很低。
2、看网上说有简单的方法通过 cc/bcc 密送实现,这个群发的话怎么利用 bcc 实现?
Python中如何用smtplib群发邮件,让收件人栏只显示自己的邮箱而不暴露其他收件人地址?
这个需求叫做"群发单显",根据 to/cc/bcc 的定义( https://www.zhihu.com/question/19670232) ,只要把收件人的邮箱都添加在 bcc 列表里就可以保证单个收件人只可以看到自己的邮箱。
实现参考: https://stackoverflow.com/questions/1546367/python-how-to-send-mail-with-to-cc-and-bcc
用smtplib群发邮件时,想让每个收件人只看到自己的地址,不暴露其他人,得用BCC(密送)功能。核心是把所有收件人地址都放到msg["Bcc"]里,而不是To或Cc。然后发邮件时,把msg["Bcc"]的地址列表和msg["From"]自己的地址一起传给smtp.sendmail()。这样服务器会给每个BCC地址单独发一封,收件人栏就只显示To(可以是你自己的邮箱或者一个通用地址)。
下面是个完整例子,假设你用QQ邮箱发:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 发件人邮箱和授权码(QQ邮箱需要授权码,不是密码)
sender = 'your_email@qq.com'
password = 'your_authorization_code' # 注意这里是授权码
# 收件人列表(这些地址会被隐藏)
bcc_receivers = ['recipient1@example.com', 'recipient2@example.com', 'recipient3@example.com']
# 邮件内容
subject = '群发测试主题'
content = '这是一封群发测试邮件,每个收件人看不到其他人的地址。'
# 创建邮件对象
msg = MIMEText(content, 'plain', 'utf-8')
msg['From'] = Header('发件人名称 <%s>' % sender, 'utf-8')
msg['To'] = Header('收件人 <%s>' % sender, 'utf-8') # To字段可以写自己或一个别名,收件人实际看到这个
msg['Subject'] = Header(subject, 'utf-8')
msg['Bcc'] = ', '.join(bcc_receivers) # 关键:把所有真实收件人放在Bcc
try:
# 连接服务器(QQ邮箱SMTP服务器)
smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)
smtp.login(sender, password)
# 发送邮件
# sendmail参数:发件人,收件人列表(这里是所有Bcc地址+自己),邮件内容字符串
# 注意:收件人列表要包含所有Bcc地址,也可以加上自己的地址确保能收到
all_recipients = bcc_receivers + [sender]
smtp.sendmail(sender, all_recipients, msg.as_string())
smtp.quit()
print("群发邮件发送成功!")
except Exception as e:
print(f"发送失败: {e}")
关键点解释:
msg['To']这里我填的是发件人自己(sender),这样每个收件人看到的“收件人”栏就是你这个地址。你也可以填个像undisclosed-recipients:;这样的通用名。msg['Bcc']放所有要密送的收件人地址,用逗号分隔的字符串。smtp.sendmail(sender, all_recipients, msg.as_string())里的all_recipients列表必须包含所有Bcc地址,这样服务器才知道要发给谁。通常也加上发件人自己,方便测试或留底。
一句话总结:用BCC字段隐藏收件人列表,发送时把BCC地址列表传给sendmail。
抄送似乎不行,密送可以实现。
嗯,参考 Stack Overflow 实现了,谢谢

