如何发送带有收件人、抄送和密送的邮件?
- 2025-04-16 08:57:00
- admin 原创
- 19
问题描述:
为了测试,我需要向几百个邮箱发送各种邮件,我打算使用smtplib来实现。我不仅需要向特定邮箱发送邮件,还需要抄送或密送这些邮箱。我该怎么做?
解决方案 1:
电子邮件标头对 SMTP 服务器来说无关紧要。只需在to_addrs
发送电子邮件时添加抄送和密送收件人即可。对于抄送,请将其添加到抄送标头中。
toaddr = 'buffy@sunnydale.k12.ca.us'
cc = ['alexander@sunydale.k12.ca.us','willow@sunnydale.k12.ca.us']
bcc = ['chairman@slayerscouncil.uk']
fromaddr = 'giles@sunnydale.k12.ca.us'
message_subject = "disturbance in sector 7"
message_text = "Three are dead in an attack in the sewers below sector 7."
message = "From: %s
" % fromaddr
+ "To: %s
" % toaddr
+ "CC: %s
" % ",".join(cc)
+ "Subject: %s
" % message_subject
+ "
"
+ message_text
toaddrs = [toaddr] + cc + bcc
server = smtplib.SMTP('smtp.sunnydale.k12.ca.us')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()
解决方案 2:
关键是要将收件人添加为sendmail 调用中的电子邮件 ID 列表。
import smtplib
from email.mime.multipart import MIMEMultipart
me = "user63503@gmail.com"
to = "someone@gmail.com"
cc = "anotherperson@gmail.com,someone@yahoo.com"
bcc = "bccperson1@gmail.com,bccperson2@yahoo.com"
rcpt = cc.split(",") + bcc.split(",") + [to]
msg = MIMEMultipart('alternative')
msg['Subject'] = "my subject"
msg['To'] = to
msg['Cc'] = cc
msg.attach(my_msg_body)
server = smtplib.SMTP("localhost") # or your smtp server
server.sendmail(me, rcpt, msg.as_string())
server.quit()
解决方案 3:
自 2011 年 11 月发布的 Python 3.2 开始,smtplib 新增了一个函数,send_message
取代了之前的sendmail
,这使得处理收件人/抄送/密送邮件更加容易。从Python 官方电子邮件示例中抽取一些代码,稍加修改后,我们得到:
# 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()
使用标题工作正常,因为send_message 尊重文档中概述的 BCC:
send_message 不会传输任何可能出现在 msg 中的 Bcc 或 Resent-Bcc 标头
常见的做法sendmail
是将 CC 标头添加到邮件中,例如:
msg['Bcc'] = blind.email@adrress.com
或者
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"
问题在于,sendmail 函数会将所有这些邮件头一视同仁,这意味着它们会(以可见的方式)发送给所有 To: 和 BCC: 用户,从而违背了 BCC 的初衷。正如这里许多其他答案所示,解决方案是不在邮件头中包含 BCC,而是仅在传递给 的电子邮件列表中包含 BCC sendmail
。
需要注意的是,send_message
需要一个 Message 对象,这意味着您需要从中导入一个类,email.message
而不是仅仅将字符串传递进去sendmail
。
解决方案 4:
不要添加 bcc 标头。
请参阅:http ://mail.python.org/pipermail/email-sig/2004-September/000151.html
还有这个:“请注意,sendmail() 的第二个参数,即收件人,是以列表形式传递的。您可以在列表中包含任意数量的地址,以便将邮件依次发送给每个地址。由于信封信息与邮件头是分开的,您甚至可以通过将收件人信息包含在方法参数中(而不是邮件头中)来密送某人。”””摘自http://pymotw.com/2/smtplib
toaddr = 'buffy@sunnydale.k12.ca.us'
cc = ['alexander@sunydale.k12.ca.us','willow@sunnydale.k12.ca.us']
bcc = ['chairman@slayerscouncil.uk']
fromaddr = 'giles@sunnydale.k12.ca.us'
message_subject = "disturbance in sector 7"
message_text = "Three are dead in an attack in the sewers below sector 7."
message = "From: %s
" % fromaddr
+ "To: %s
" % toaddr
+ "CC: %s
" % ",".join(cc)
# don't add this, otherwise "to and cc" receivers will know who are the bcc receivers
# + "BCC: %s
" % ",".join(bcc)
+ "Subject: %s
" % message_subject
+ "
"
+ message_text
toaddrs = [toaddr] + cc + bcc
server = smtplib.SMTP('smtp.sunnydale.k12.ca.us')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()
解决方案 5:
TO、CC 和 BCC 之间的区别仅在于文本标头。在 SMTP 级别,每个人都是收件人。
TO - 有一个 TO: 标题,其中包含此收件人的地址
CC - 有一个 CC: 标题,其中包含此收件人的地址
密件抄送——标题中根本没有提及此收件人,但仍然是收件人。
如果你有
TO: abc@company.com
CC: xyz@company.com
BCC: boss@company.com
您有三个收件人。邮件正文中的标题将仅包含“收件人”和“抄送”:
解决方案 6:
您可以尝试 MIMEText
msg = MIMEText('text')
msg['to'] =
msg['cc'] =
然后发送 msg.as_string()
https://docs.python.org/3.6/library/email.examples.html
解决方案 7:
以上方法都不起作用,因为我的“收件人”和“抄送”里都有多个收件人。所以我尝试了以下方法:
recipients = ['abc@gmail.com', 'xyz@gmail.com']
cc_recipients = ['lmn@gmail.com', 'pqr@gmail.com']
MESSAGE['To'] = ", ".join(recipients)
MESSAGE['Cc'] = ", ".join(cc_recipients)
并使用“cc_recipients”扩展“recipients”,并以简单的方式发送邮件
recipients.extend(cc_recipients)
server.sendmail(FROM,recipients,MESSAGE.as_string())
解决方案 8:
直到我创建它才对我起作用:
#created cc string
cc = ""someone@domain.com;
#added cc to header
msg['Cc'] = cc
然后在收件人[列表]中添加抄送,例如:
s.sendmail(me, [you,cc], msg.as_string())
扫码咨询,免费领取项目管理大礼包!