繁体   English   中英

python:如何使用TO,CC和BCC发送邮件?

[英]python: how to send mail with TO, CC and BCC?

为了测试目的,我需要用各种消息填充数百个电子邮件框,并打算为此使用 smtplib。 但除此之外,我不仅需要能够向特定邮箱发送消息,还需要能够向它们发送 CC 和 BCC。 看起来smtplib在发送电子邮件时不支持 CC-ing 和 BCC-ing。

寻找建议如何从 python 脚本执行 CC 或 BCC 发送消息。

(而且 - 不,我不会创建一个脚本来向我的测试环境之外的任何人发送垃圾邮件。)

电子邮件标头与 smtp 服务器无关。 只需在发送电子邮件时将 CC 和 BCC 收件人添加到 toaddrs 中即可。 对于 CC,将它们添加到 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()

关键是在 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()

从 2011 年 11 月发布的 Python 3.2 开始,smtplib 有一个新函数send_message而不仅仅是sendmail ,这使得处理 To/CC/BCC 更容易。 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,而仅在传递给sendmail的电子邮件列表中包含。

需要注意的是, send_message需要一个 Message 对象,这意味着您需要从email.message导入一个类,而不仅仅是将字符串传递给sendmail

不要添加密件抄送标头。

看到这个: 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\r\n" % fromaddr
    + "To: %s\r\n" % toaddr
    + "CC: %s\r\n" % ",".join(cc)
    # don't add this, otherwise "to and cc" receivers will know who are the bcc receivers
    # + "BCC: %s\r\n" % ",".join(bcc)
    + "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()

TO、CC 和 BCC 之间的区别仅出现在文本标题中。 在 SMTP 级别,每个人都是收件人。

TO - 有一个带有此收件人地址的 TO: 标头

CC - 有一个带有此收件人地址的 CC: 标头

密件抄送 - 标题中根本没有提到此收件人,但仍然是收件人。

如果你有

TO: abc@company.com
CC: xyz@company.com
BCC: boss@company.com

您有三个收件人。 电子邮件正文中的标题将仅包含 TO: 和 CC:

你可以试试 MIMEText

msg = MIMEText('text')
msg['to'] = 
msg['cc'] = 

然后发送 msg.as_string()

https://docs.python.org/3.6/library/email.examples.html

直到我创建它才对我有用:

#created cc string
cc = ""someone@domain.com;
#added cc to header
msg['Cc'] = cc

然后在收件人 [list] 中添加 cc ,例如:

s.sendmail(me, [you,cc], msg.as_string())

由于我在“to”和“cc”中都有多个收件人,因此上述所有内容都不适合我。 所以我尝试如下:

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.extend(cc_recipients)
server.sendmail(FROM,recipients,MESSAGE.as_string())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM