如何发送带有收件人、抄送和密送的邮件?

2025-04-16 08:57:00
admin
原创
16
摘要:问题描述:为了测试,我需要向几百个邮箱发送各种邮件,我打算使用smtplib来实现。我不仅需要向特定邮箱发送邮件,还需要抄送或密送这些邮箱。我该怎么做?解决方案 1:电子邮件标头对 SMTP 服务器来说无关紧要。只需在to_addrs发送电子邮件时添加抄送和密送收件人即可。对于抄送,请将其添加到抄送标头中。t...

问题描述:

为了测试,我需要向几百个邮箱发送各种邮件,我打算使用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())
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用