2009-10-09 71 views
68

Tôi cần cho mục đích thử nghiệm để điền vài trăm hộp email với nhiều thông điệp khác nhau và sẽ sử dụng smtplib cho điều đó. Nhưng trong số những thứ khác tôi cần để có thể gửi tin nhắn không chỉ cho hộp thư cụ thể, nhưng CC và BCC họ là tốt. Nó không giống như smtplib hỗ trợ CC-ing và BCC-ing trong khi gửi email.python: cách gửi thư bằng TO, CC và BCC?

Tìm kiếm đề xuất cách thực hiện CC hoặc BCC gửi thư từ tập lệnh python.

(Và - không, tôi không tạo ra một kịch bản cho bất cứ ai rác bên ngoài môi trường thử nghiệm của tôi.)

Trả lời

106

tiêu đề Email don' t vấn đề với máy chủ SMTP. Chỉ cần thêm người nhận CC và BCC vào toaddrs khi bạn gửi email của mình. Đối với CC, thêm chúng vào tiêu đề CC.

toaddr = '[email protected]' 
cc = ['[email protected]','[email protected]'] 
bcc = ['[email protected]'] 
fromaddr = 'giles[email protected]' 
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() 
+0

smtplib.SMTP không gửi danh sách đến địa chỉ. Ít nhất không phải trên trăn 2.7.2 – LostMohican

+0

Trong trường hợp này, tiêu đề BCC được đề cập trong RFC 2822 không có ý nghĩa gì. –

+1

@ABentSpoon dấu hai chấm bị thiếu sau 'Chủ đề'. – user891260

15

Sự khác biệt giữa TO, CC và BCC chỉ xảy ra trong các tiêu đề văn bản. Ở cấp SMTP, mọi người đều là người nhận.

TO - Có một TO: tiêu đề với địa chỉ của người nhận này

CC - Có một CC: tiêu đề với địa chỉ của người nhận này

BCC - Người nhận này không được đề cập trong các tiêu đề ở tất cả, nhưng vẫn là người nhận.

Nếu bạn có

TO: [email protected] 
CC: [email protected] 
BCC: [email protected] 

Bạn có ba người nhận. Các tiêu đề trong cơ thể email sẽ chỉ bao gồm TO: và CC:

15

Bạn có thể thử MIMEText

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

sau đó gửi msg.as_string()

http://docs.python.org/library/email-examples.html

+3

rằng ví dụ không sử dụng CC – hoju

+1

Tôi đồng ý rằng các ví dụ trên liên kết trên không xử lý Bcc. Đây là những gì @hoju có thể có nghĩa là. – shailenTJ

10

Không thêm tiêu đề bcc.

Xem này: http://mail.python.org/pipermail/email-sig/2004-September/000151.html

Và điều này: "" "Chú ý rằng đối số thứ hai để sendmail(), người nhận, được thông qua như là một danh sách Bạn có thể bao gồm bất kỳ số lượng địa chỉ trong danh sách để có. nhắn gửi đến mỗi người trong số họ lần lượt. kể từ khi thông tin phong bì là tách biệt với các tiêu đề tin nhắn, bạn thậm chí có thể BCC một người nào đó bằng cách bao gồm chúng trong đối số phương pháp nhưng không phải trong tiêu đề thư. """ từ http://pymotw.com/2/smtplib

toaddr = '[email protected]' 
cc = ['[email protected]','[email protected]'] 
bcc = ['[email protected]'] 
fromaddr = '[email protected]' 
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() 
+0

Thumbs up cho sự tinh tế: D – Chris

10

Điều quan trọng là thêm người nhận dưới dạng danh sách id email trong cuộc gọi sendmail của bạn.

import smtplib 
from email.mime.multipart import MIMEMultipart 

me = "[email protected]" 
to = "[email protected]" 
cc = "[email protected],[email protected]" 
bcc = "[email protected],[email protected]" 

rcpt = cc.split(",") + bcc.split(",") + [to] 
msg = MIMEMultipart('alternative') 
msg['Subject'] = "my subject" 
msg['To'] = to 
msg['Cc'] = cc 
msg['Bcc'] = bcc 
msg.attach(my_msg_body) 
server = smtplib.SMTP("localhost") # or your smtp server 
server.sendmail(me, rcpt, msg.as_string()) 
server.quit() 
+0

Trường bcc cũng được yêu cầu trong câu hỏi này. –

+1

Bạn cũng có thể thêm bcc theo cách tương tự. Tôi đã cập nhật đoạn mã. – helios

+0

Để lại 'msg ['BCC']' off - nó cho thấy người gửi bị ẩn của bạn và không có tác động đến việc thư có được gửi cho họ hay không (đối số cho 'sendmail' làm điều đó). –

1

Nó không làm việc cho tôi cho đến khi tôi tạo ra:

#created cc string 
cc = ""[email protected]; 
#added cc to header 
msg['Cc'] = cc 

và hơn cc thêm vào trong nhận [list] như:

s.sendmail(me, [you,cc], msg.as_string()) 
Các vấn đề liên quan