अजगर: TO, CC और BCC के साथ मेल कैसे भेजें?


102

मुझे विभिन्न संदेशों के साथ कुछ सौ ईमेल बॉक्सों को आबाद करने के लिए परीक्षण के उद्देश्यों की आवश्यकता है, और उसके लिए smtplib का उपयोग करने जा रहा था। लेकिन अन्य चीजों के बीच मुझे न केवल विशिष्ट मेलबॉक्सों को संदेश भेजने में सक्षम होने की आवश्यकता है, बल्कि सीसी और बीसीसी उन्हें भी। ऐसा नहीं लगता है कि ईमेल भेजते समय smtplib CC-ing और BCC-ing का समर्थन करता है।

अजगर स्क्रिप्ट से संदेश भेजने वाले सीसी या बीसीसी कैसे करें, सुझावों की तलाश कर रहा है।

(और - नहीं, मैं अपने परीक्षण वातावरण के बाहर किसी को भी स्पैम करने के लिए स्क्रिप्ट नहीं बना रहा हूं।)

जवाबों:


150

ईमेल हेडर 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()

smtplib.SMTP पते के रूप में सूचियाँ नहीं भेजता है। कम से कम अजगर 2.7.2 पर नहीं
लॉमोहिकॉन

इस मामले में, RFC 2822 में उल्लिखित BCC हेडर का कोई मतलब नहीं है।
चेनएक्सियोनग क्यूई

1
@ विषय के बाद @ABentSpoon एक कॉलोन गायब है।
user891260

3
Bcc हैडर को न जोड़ें। इसे देखें: mail.python.org/pipermail/email-sig/2004-Seture/000151.html और यह: "" ध्यान दें कि भेजने वाले (), प्राप्तकर्ताओं का दूसरा तर्क सूची के रूप में पारित किया गया है। आप इसे शामिल कर सकते हैं। सूची में जितने भी पते हैं, उनमें से प्रत्येक को संदेश बदले में दिया गया है। चूंकि लिफाफा जानकारी संदेश हेडर से अलग है, इसलिए आप किसी को विधि तर्क में नहीं बल्कि संदेश शीर्षलेख में शामिल करके BCC भी कर सकते हैं। " "" pymotw.com/2/smtplib से
लियोनार्डो एंड्रेड

2
यह बीसीसी या सीसी कभी नहीं होगा - यह हमेशा रहेगा
प्रॉस्परस

37

मुख्य बात यह है कि प्राप्तकर्ताओं को आपके सेंडमेल कॉल में ईमेल आईडी की सूची के रूप में जोड़ा जाए ।

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
msg['BCC']बंद छोड़ दें - यह आपके छिपे हुए प्रेषक को प्रकट करता है और इस बात पर कोई प्रभाव नहीं पड़ता है कि संदेश उन्हें भेजा गया है या नहीं ( sendmailऐसा करने के लिए तर्क )।
एरिका केन

2
मैं एरिका और जूलियो से सहमत हूं। Bcc का उद्देश्य रिसीवर को अन्य रिसीवरों को छिपाना है। यदि संदेश में इसकी, कि उद्देश्य को हराता है।
टिमोथी सी। क्विन

19

Bcc हैडर को न जोड़ें।

इसे देखें: http://mail.python.org/pipermail/email-sig/2004-Seture/000151.html

और यह: "" "ध्यान दें कि भेजने वाले (), प्राप्तकर्ताओं के लिए दूसरा तर्क एक सूची के रूप में पारित किया गया है। आप सूची में किसी भी संख्या के पते को शामिल कर सकते हैं ताकि संदेश उनमें से प्रत्येक को बदले में दिया जा सके। लिफाफे के बाद से। जानकारी संदेश शीर्षकों से अलग है, आप विधि तर्क में उन्हें शामिल करके किसी को भी BCC कर सकते हैं, लेकिन संदेश शीर्षलेख में नहीं। "" 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()

फ्लेमर्स के लिए अंगूठे: डी
क्रिस

19

Python 3.2 के रूप में, नवंबर 2011 को जारी की गई, 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 BCC का सम्मान करता है जैसा कि प्रलेखन में उल्लिखित है :

send_message किसी भी Bcc या Resent-Bcc हेडर को प्रेषित नहीं करता है जो संदेश में दिखाई दे सकता है


साथ sendmailयह संदेश के लिए सीसी हेडर को जोड़ने के लिए एक आम बात थी, इस तरह के रूप में कुछ करने के:

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

चेतावनी यह है कि आपको send_messageएक संदेश ऑब्जेक्ट की आवश्यकता है, जिसका अर्थ है कि आपको email.messageकेवल स्ट्रिंग को पास करने के बजाय एक वर्ग आयात करना होगा sendmail


2
बस यह सत्यापित किया गया है कि send_message (msg) cc को EmailMessage में जोड़ा गया है - msg ['cc'] यदि आप Python 3 का उपयोग कर रहे हैं तो यह जाने का मार्ग है।
बीएमएल

@ बेलर यूप, काफी काम। मैंने इस उत्तर को लिखा क्योंकि मैं इसे देख रहा था और डॉक्स और अन्य रेफरी में सरल तरीका पाया, और इसने मेरे लिए अच्छा काम किया, और मुझे लगा कि यह एक जगह के लायक है क्योंकि कई लोग यहां 1 देखेंगे।

न केवल मुझे यह समाधान अधिक सुरुचिपूर्ण लगता है, बल्कि यह पूरी तरह से काम करता है। यह @ABentSpoon द्वारा उत्तर के साथ मेरे पास मौजूद एक समस्या को भी हल करता है, जो यह है कि CC में gmail adresses के लिए, ईमेल इनबॉक्स में नहीं जा रहे थे, लेकिन इसके बजाय उन्होंने "All Mail" को इंट्रोड्यूस किया।
गुइलियूम गैरीगोस

18

TO, CC और BCC के बीच का अंतर केवल पाठ हेडर में होता है। SMTP स्तर पर, हर कोई प्राप्तकर्ता है।

के लिए - वहाँ एक है: इस प्राप्तकर्ता के पते के साथ हैडर

CC - इसमें एक CC: हैडर है जो इस प्राप्तकर्ता के पते के साथ है

BCC - इस प्राप्तकर्ता का उल्लेख हेडर में बिल्कुल नहीं है, लेकिन फिर भी प्राप्तकर्ता है।

यदि आपके पास है

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

आपके पास तीन प्राप्तकर्ता हैं। ईमेल बॉडी के हेडर में केवल TO: और CC शामिल होंगे:


16

आप MIMEText आज़मा सकते हैं

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

उसके बाद msg.as_string () भेजें

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


4
वह उदाहरण CC
hoju

1
मैं सहमत हूं कि उपरोक्त लिंक पर दिए गए उदाहरण Bcc का इलाज नहीं करते हैं। यह @ जोजू का शायद मतलब है।
शैलेन

5

यह मेरे लिए तब तक काम नहीं आया जब तक मैंने बनाया नहीं:

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

और प्राप्तकर्ता की सूची में जोड़ा सीसी से [सूची] जैसे:

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

2

उपरोक्त किसी भी चीज़ ने मेरे लिए काम नहीं किया क्योंकि मेरे पास 'और' और '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())
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.