Python中如何用smtplib群发邮件,让收件人栏只显示自己的邮箱而不暴露其他收件人地址?

问题描述:

1、一开始我发一次邮件,只不过设置收件人是包含多个地址的 list,通过','.join(receivers)来进行群发,这样收件人显示所有 receivers

2、后面又利用循环,发多次邮件,收件人是单个地址,每个人都发一次。但是这样收件人还是显示多个,猜想是服务器根据内容相同把收件人自动合并

解决方法:

1、通过循环,每发完一次,sleep ( 30 )秒,这样应该就不会显示多个 receivers,但是效率很低。

2、看网上说有简单的方法通过 cc/bcc 密送实现,这个群发的话怎么利用 bcc 实现?


Python中如何用smtplib群发邮件,让收件人栏只显示自己的邮箱而不暴露其他收件人地址?

4 回复

这个需求叫做"群发单显",根据 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"]里,而不是ToCc。然后发邮件时,把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}")

关键点解释:

  1. msg['To'] 这里我填的是发件人自己(sender),这样每个收件人看到的“收件人”栏就是你这个地址。你也可以填个像 undisclosed-recipients:; 这样的通用名。
  2. msg['Bcc'] 放所有要密送的收件人地址,用逗号分隔的字符串。
  3. smtp.sendmail(sender, all_recipients, msg.as_string()) 里的 all_recipients 列表必须包含所有Bcc地址,这样服务器才知道要发给谁。通常也加上发件人自己,方便测试或留底。

一句话总结:用BCC字段隐藏收件人列表,发送时把BCC地址列表传给sendmail。

抄送似乎不行,密送可以实现。

嗯,参考 Stack Overflow 实现了,谢谢

回到顶部