SMTP中的Bcc字段[显示/不显示]问题

4 投票
1 回答
2159 浏览
提问于 2025-04-16 20:45

我正在尝试使用Python的smtplib通过gmail发送一封包含密件抄送(bcc)地址的邮件。我的代码是:

#imports etc...
fromAddr = sender@origin.com
to = [ recpt1@destinationTo.com ]
cc = [ recpt2@destinationCc.com ]
bcc = [ recpt3@destinationBcc.com, recpt4@destinationBcc.com ]
server = SMTP( "smtp.gmail.com", 587)
#starttls, login, etc..
content = "Hello, this is a message."
msg = "From: %s\r\nTo:%s\r\nCc: %s\r\n\r\n%s" % ( from, to, cc, content )
server.sendmail( fromAddr, to + cc + bcc, msg )
#server.quit() etc...

-> 当我查看各个收件箱时,所有在[to+cc+bcc]中的地址都收到了相同的消息,这没问题。但是

我希望每个bcc地址都能在邮件中看到自己的地址,就像在gmail的网页界面中描述的那样,具体可以参考这里

这是我想要实现的效果:

抄送和收件箱:

To: recpt1@destinationTo.com
From: sender@origin.com
Cc: recpt2@destinationCc.com
(...)

recpt3的收件箱:

To: recpt1@destinationTo.com
From: sender@origin.com
Cc: recpt2@destinationCc.com
Bcc: recpt3@destinationBcc.com
(...)

recpt4的收件箱:

To: recpt1@destinationTo.com
From: sender@origin.com
Cc: recpt2@destinationCc.com
Bcc: recpt4@destinationBcc.com
(...)

有没有人成功实现这个功能?我查阅了smtp的相关文档,但没有找到任何信息,我不明白gmail是怎么做到的。

1 个回答

1

我猜,Gmail 对每个密件抄送(BCC)收件人都会单独建立一个 SMTP 会话。如果把你提到的两个评论之间的内容看作一个函数 dosend(fromAddr, toAddr, content, to, cc, bcc=None),你可以这样做:

dosend(fromAddr, to+cc, content, to, cc)
for t in bcc:
    dosend(fromAddr, t, content, to, cc, t)

这样就会先把邮件发送给 tocc 地址,然后再分别发送给每个 bcc 地址,并加上相应的 BCC 头信息。为了更清楚地说明 dosend 的作用:fromAddrtoAddr 是用来设置邮件的发件人和收件人(这两个是 server.sendmail 的第一个和第二个参数)。而 tocc 和(可选的)bcc 是用来设置邮件内容中的头信息的。 (你的代码没有添加 Bcc,如果提供了可选参数 bcc,你需要自己加上。)

(编辑:我删掉了关于可能使用 X-Bcc 的评论。我刚试了一下,确实如上所述工作。我也修正并澄清了 dosend 的描述。)

撰写回答