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

155 投票
8 回答
272707 浏览
提问于 2025-04-15 14:58

我需要给几百个邮箱发送不同的消息,用来测试。我打算用 smtplib 这个工具来实现这个目的。我不仅需要把消息发送到特定的邮箱,还想抄送(CC)和密送(BCC)给其他人。我该怎么做呢?

8 个回答

71

自从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函数会把所有这些头信息都当作一样的处理,这意味着所有的收件人和BCC用户都能看到这些信息,这样就失去了BCC的意义。解决办法是,如许多其他答案所示,不在头信息中包含BCC,而是只在传递给sendmail的邮件列表中包含BCC的邮箱地址。

需要注意的是,send_message需要一个消息对象,这意味着你需要从email.message中导入一个类,而不是仅仅把字符串传给sendmail

76

关键是要在你的发送邮件调用中,把收件人作为一个 邮箱地址的列表 添加进去。

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()
208

邮件的头部信息对SMTP服务器来说并不重要。发送邮件时,只需要把抄送(CC)和密件抄送(BCC)的收件人加到to_addrs里就可以了。对于抄送的收件人,要把他们放在CC头部里。

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\r\n" % fromaddr
        + "To: %s\r\n" % toaddr
        + "CC: %s\r\n" % ",".join(cc)
        + "Subject: %s\r\n" % message_subject
        + "\r\n" 
        + 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()

撰写回答