Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:如何使用收件人、抄送和密件抄送发送邮件?_Python_Email_Testing - Fatal编程技术网

python:如何使用收件人、抄送和密件抄送发送邮件?

python:如何使用收件人、抄送和密件抄送发送邮件?,python,email,testing,Python,Email,Testing,出于测试目的,我需要用各种消息填充几百个电子邮件框,并打算使用smtplib实现这一点。但除此之外,我不仅需要能够将消息发送到特定邮箱,还需要将它们抄送和密件抄送。在发送电子邮件时,它看起来不支持抄送和密件抄送 寻找如何从python脚本执行CC或BCC发送消息的建议 (而且-不,我不会创建一个脚本来向测试环境之外的任何人发送垃圾邮件。)to、CC和BCC之间的区别只出现在文本标题中。在SMTP级别,每个人都是收件人 收件人-有一个收件人地址的收件人:标题 CC-有一个带有此收件人地址的CC:h

出于测试目的,我需要用各种消息填充几百个电子邮件框,并打算使用smtplib实现这一点。但除此之外,我不仅需要能够将消息发送到特定邮箱,还需要将它们抄送和密件抄送。在发送电子邮件时,它看起来不支持抄送和密件抄送

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


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

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

收件人-有一个收件人地址的收件人:标题

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

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

如果你有

TO: abc@company.com
CC: xyz@company.com
BCC: boss@company.com
您有三个收件人。电子邮件正文中的标题将仅包括收件人和抄送:

您可以尝试MIMEText

msg = MIMEText('text')
msg['to'] = 
msg['cc'] = 
然后发送msg.as_string()


电子邮件头对smtp服务器并不重要。发送电子邮件时,只需将抄送和密件抄送收件人添加到ToAddress即可。对于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()的第二个参数收件人作为列表传递。您可以在列表中包含任意数量的地址,以便将邮件依次传递给每个收件人。由于信封信息与邮件头是分开的,您甚至可以通过将其包含在方法参数中而不是邮件头中来密件抄送某人。“”


关键是将收件人添加为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()

直到我创建了:

#created cc string
cc = ""someone@domain.com;
#added cc to header
msg['Cc'] = cc
并在收件人[列表]中添加了抄送,如:

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

从2011年11月发布的Python3.2开始,smtplib有了一个新功能
send_message
,而不仅仅是
sendmail
,这使得处理To/CC/BCC变得更容易。从中提取,经过一些轻微的修改,我们得到:

# 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不会传输msg中可能出现的任何密件抄送或重新发送密件抄送标头


使用
sendmail
时,通常会将CC头添加到邮件中,例如:

msg['Bcc'] = blind.email@adrress.com

问题是,sendmail函数对所有这些头都一视同仁,这意味着它们将被(明显地)发送给所有收件人:和密件抄送:用户,从而破坏了密件抄送的目的。正如这里的许多其他答案所示,解决方案是在邮件头中不包含密件抄送,而是只在传递给
sendmail
的电子邮件列表中包含密件抄送


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

中,因为我在“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)
并用“抄送收件人”扩展“收件人”,以简单的方式发送邮件

recipients.extend(cc_recipients)
server.sendmail(FROM,recipients,MESSAGE.as_string())

smtplib.SMTP不发送地址列表。至少在python 2.7.2上没有。在这种情况下,RFC 2822中提到的BCC头没有任何意义。@ABentSpoon“Subject”后面缺少冒号。不要添加BCC头。请参见:和:“”注意sendmail()的第二个参数收件人作为列表传递。您可以在列表中包含任意数量的地址,以便将邮件依次传递给每个收件人。由于信封信息与邮件头是分开的,您甚至可以通过将其包含在方法参数中而不是邮件头中以密件传给某人。”“”从这一点来看,永远不会是密件抄送或抄送-始终会是不使用CCI的示例同意上述链接上的示例不处理密件抄送。这就是@hoju可能的意思。竖起大拇指来炫耀自己的才华:这实际上就像一个符咒,库多斯把
msg['BCC']
关上——它会显示你隐藏的发件人,对邮件是否发送给他们没有影响(sendmail的参数就是这样做的)。我同意埃里卡和胡里奥的观点。Bcc的目的是向其他接收器隐藏接收器。如果它在信息中,那就违背了目的。这真是一个很好的建议!非常感谢。刚刚验证了send_message(msg)处理添加到EmailMessage的抄送-msg['cc'],如果您使用的是Python 3,这是一种方法。@bmiller是的,非常方便。我写下这个答案是因为我在研究它,并在文档和其他参考文献中找到了更简单的方法,它对我很有效,我认为它应该在这里占有一席之地,因为很多人会首先看这里。我不仅发现这个解法更优雅,而且它工作得非常完美。它还解决了我在@ABentSpoon的回答中遇到的一个问题,即对于CC中的gmail地址,电子邮件不会进入收件箱,而是进入“所有邮件”。
recipients = ['abc@gmail.com', 'xyz@gmail.com']
cc_recipients = ['lmn@gmail.com', 'pqr@gmail.com']
MESSAGE['To'] = ", ".join(recipients)
MESSAGE['Cc'] = ", ".join(cc_recipients)
recipients.extend(cc_recipients)
server.sendmail(FROM,recipients,MESSAGE.as_string())