python: làm thế nào để gửi thư với TO, CC và BCC?


102

Tôi cần cho mục đích thử nghiệm để điền vào 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 mục đích đó. Nhưng trong số những thứ khác, tôi cần có thể gửi tin nhắn không chỉ ĐẾN các hộp thư cụ thể mà còn cả CC và BCC chúng nữa. Có vẻ như smtplib hỗ trợ CC-ing và BCC-ing trong khi gửi email.

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

(Và - không, tôi không tạo tập lệnh để spam bất kỳ ai bên ngoài môi trường thử nghiệm của tôi.)

Câu trả lời:


150

Tiêu đề email không quan trọng đối với máy chủ smtp. Chỉ cần thêm người nhận CC và BCC vào cóc khi bạn gửi email của mình. Đối với CC, hãy thêm chúng vào tiêu đề 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()

smtplib.SMTP không gửi danh sách tới địa chỉ. Ít nhất là không trên python 2.7.2
LostMohican

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

1
@ABentSpoon bị thiếu dấu hai chấm sau 'Chủ đề'.
dùng891260

3
Không thêm tiêu đề bcc. Xem phần này: mail.python.org/pipermail/email-sig/2004-September/000151.html Và điều này: "" "Lưu ý rằng đối số thứ hai cho sendmail (), những người nhận, được chuyển dưới dạng danh sách. Bạn có thể bao gồm bất kỳ số lượng địa chỉ nào trong danh sách để lần lượt gửi thư đến từng người trong số họ. Vì thông tin trên phong bì tách biệt với tiêu đề thư, bạn thậm chí có thể BCC một người nào đó bằng cách đưa họ vào đối số phương thức chứ không phải trong tiêu đề thư. " "" từ pymotw.com/2/smtplib
Leonardo Andrade

2
Điều này sẽ không bao giờ BCC hoặc CC - nó sẽ luôn là Để
Thịnh vượngHeart

37

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

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

4
Bỏ qua msg['BCC']- nó tiết lộ người gửi ẩn của bạn và không ảnh hưởng đến việc liệu thư có được gửi cho họ hay không (các đối số để sendmaillàm điều đó).
Erica Kane

2
Tôi đồng ý với Erica và Julio. Mục đích của Bcc là che giấu đầu thu đối với các đầu thu khác. Nếu nó trong tin nhắn, điều đó đánh bại mục đích.
Timothy C. Quinn

19

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

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

Và điều này: "" "Lưu ý rằng đối số thứ hai cho sendmail (), những người nhận, được chuyển dưới dạng danh sách. Bạn có thể bao gồm bất kỳ số lượng địa chỉ nào trong danh sách để thư được gửi lần lượt đến từng người trong số họ. Kể từ khi có phong bì thông tin tách biệt với tiêu đề thư, bạn thậm chí có thể BCC ai đó bằng cách đưa họ vào đối số phương thức nhưng không phải trong tiêu đề thư. "" "từ 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()

Thumbs up cho flair: D
Chris

19

Kể từ Python 3.2, được phát hành vào tháng 11 năm 2011, smtplib có một chức năng mới send_messagethay vì chỉ sendmail, giúp xử lý To / CC / BCC dễ dàng hơn. Lấy từ các ví dụ email chính thức của Python , với một số sửa đổi nhỏ, chúng tôi nhận được:

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

Sử dụng tiêu đề hoạt động tốt, vì send_message tôn trọng BCC như được nêu trong tài liệu :

send_message không truyền bất kỳ tiêu đề Bcc hoặc Resent-Bcc nào có thể xuất hiện trong tin nhắn


Thông sendmailthường, việc thêm tiêu đề CC vào thư, thực hiện một số việc như:

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

Hoặc là

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"

Vấn đề là, hàm sendmail xử lý tất cả các tiêu đề đó như nhau, có nghĩa là chúng sẽ được gửi (hiển thị) đến tất cả người dùng Tới: và BCC:, đánh bại mục đích của BCC. Giải pháp, như được trình bày trong nhiều câu trả lời khác ở đây, là không bao gồm BCC trong tiêu đề, và thay vào đó chỉ trong danh sách email được chuyển đến sendmail.

Lưu ý là send_messageyêu cầu đối tượng Message, nghĩa là bạn sẽ cần nhập một lớp từ email.messageđó thay vì chỉ chuyển chuỗi vào sendmail.


2
Chỉ cần xác minh rằng send_message (msg) xử lý cc được thêm vào EmailMessage - msg ['Cc'] Nếu bạn đang sử dụng Python 3 thì đây là cách để thực hiện.
bmiller

@bmiller Yup, khá tiện dụng. Tôi đã viết câu trả lời này vì tôi đã xem xét nó và tìm thấy cách đơn giản hơn trong tài liệu và các tài liệu tham khảo khác, và nó hoạt động tốt cho tôi, và tôi nghĩ nó xứng đáng có một vị trí ở đây vì nhiều người sẽ xem ở đây đầu tiên.

không chỉ tôi thấy giải pháp này thanh lịch hơn mà nó hoạt động hoàn hảo. Nó cũng giải quyết một vấn đề mà tôi gặp phải với câu trả lời của @ABentSpoon, đó là đối với địa chỉ gmail trong CC, các email sẽ không đi vào hộp thư đến mà thay vào đó là "Tất cả thư".
Guillaume Garrigos

18

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

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

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

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

Nếu bạn có

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

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



5

Nó không hoạt động với tôi cho đến khi tôi tạo:

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

và thêm cc trong [danh sách] người nhận như:

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

2

Không có điều nào ở trên hiệu quả với tôi vì tôi có nhiều người nhận cả 'to' và 'cc'. Vì vậy, tôi đã thử như dưới đây:

recipients = ['abc@gmail.com', 'xyz@gmail.com']
cc_recipients = ['lmn@gmail.com', 'pqr@gmail.com']
MESSAGE['To'] = ", ".join(recipients)
MESSAGE['Cc'] = ", ".join(cc_recipients)

và mở rộng 'người nhận' bằng 'cc_reciparies' và gửi thư theo cách tầm thường

recipients.extend(cc_recipients)
server.sendmail(FROM,recipients,MESSAGE.as_string())
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.