python - पायथन smtplib का उपयोग कर एकाधिक प्राप्तकर्ताओं को ईमेल कैसे भेजें?




email message (8)

अधिक खोज के बाद मुझे यह नहीं पता था कि smtplib.sendmail का उपयोग एकाधिक प्राप्तकर्ताओं को भेजने के लिए कैसे किया जाए। समस्या तब होती थी जब मेल भेजा जाएगा मेल हेडर में कई पते होंगे, लेकिन असल में केवल पहले प्राप्तकर्ता को ईमेल प्राप्त होगा।

समस्या यह है कि email.Messageemail.Message मॉड्यूल smtplib.sendmail() फ़ंक्शन से कुछ अलग की अपेक्षा करता है।

संक्षेप में, एकाधिक प्राप्तकर्ताओं को भेजने के लिए आपको हेडर को अल्पविराम सीमांकित ईमेल पते की स्ट्रिंग के रूप में सेट करना चाहिए। sendmail() पैरामीटर to_addrs हालांकि ईमेल पते की एक सूची होना चाहिए।

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib

msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "[email protected]"
msg["To"] = "[email protected],[email protected],[email protected]"
msg["Cc"] = "[email protected],[email protected]"
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
smtp.sendmail(msg["From"], msg["To"].split(",") + msg["Cc"].split(","), msg.as_string())
smtp.quit()

आपको ईमेल के दृश्य पते और वितरण के बीच अंतर को समझने की आवश्यकता है।

msg["To"] अनिवार्य रूप से पत्र पर मुद्रित किया जाता है। इसका वास्तव में कोई प्रभाव नहीं पड़ता है। सिवाय इसके कि आपका ईमेल क्लाइंट, नियमित पोस्ट ऑफिसर की तरह ही, यह मान लेगा कि यह वह है जिसे आप ईमेल भेजना चाहते हैं।

वास्तविक वितरण हालांकि काफी अलग काम कर सकते हैं। तो आप किसी के पोस्ट बॉक्स में ईमेल (या प्रतिलिपि) को पूरी तरह से अलग कर सकते हैं।

इसके कई कारण हैं। उदाहरण के लिए अग्रेषणTo: हेडर फ़ील्ड अग्रेषण पर नहीं बदलता है, हालांकि ईमेल को एक अलग मेलबॉक्स में गिरा दिया गया है।

smtp.sendmail कमांड अब वास्तविक वितरण का ख्याल रखता है। email.Message केवल पत्र की सामग्री है, डिलीवरी नहीं।

निम्न स्तर के SMTP , आपको एक-एक-एक प्राप्तकर्ताओं को एक-एक करके देना होगा, यही कारण है कि एड्रेस की सूची (नामों सहित नहीं!) समझदार एपीआई है।

शीर्षलेख के लिए, इसमें उदाहरण के लिए नाम भी शामिल हो सकता है, उदाहरण के To: First Last <[email protected]>, Other User <[email protected]>इसलिए आपका कोड उदाहरण अनुशंसित नहीं है , क्योंकि यह इस मेल को वितरित करने में विफल रहेगा, क्योंकि इसे अभी विभाजित करके , आपके पास अभी भी मान्य एड्रेस नहीं हैं!


इससे मेरा काम बनता है।

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = '[email protected]'
recipients = '[email protected],[email protected]'
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = recipients
s.sendmail(sender, recipients.split(','), msg.as_string())

जब आप टेक्स्ट फ़ाइल पर रिक्त ईमेल लिखते हैं तो आप इसे आजमा सकते हैं

from email.mime.text import MIMEText
from email.header import Header
import smtplib

f =  open('emails.txt', 'r').readlines()
for n in f:
     emails = n.rstrip()
server = smtplib.SMTP('smtp.uk.xensource.com')
server.ehlo()
server.starttls()
body = "Test Email"
subject = "Test"
from = "[email protected]"
to = emails
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] =  Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
text = msg.as_string()
try:
   server.send(from, emails, text)
   print('Message Sent Succesfully')
except:
   print('There Was An Error While Sending The Message')

तो वास्तव में समस्या यह है कि SMTP.sendmail और ईमेल। MIMEText को दो अलग-अलग चीजों की आवश्यकता है।

ईमेल। MIMEText ई-मेल के निकाय के लिए "To:" शीर्षलेख सेट अप करता है। इसका उपयोग केवल मानव के दूसरे छोर पर परिणाम प्रदर्शित करने के लिए किया जाता है, और सभी ई-मेल शीर्षकों की तरह, एक स्ट्रिंग होना चाहिए। (ध्यान दें कि वास्तव में उन लोगों के साथ कुछ भी नहीं करना है जो वास्तव में संदेश प्राप्त करते हैं।)

दूसरी तरफ, SMTP.sendmail, SMTP प्रोटोकॉल के लिए संदेश का "लिफाफा" सेट करता है। इसे तारों की एक पायथन सूची की आवश्यकता है, जिनमें से प्रत्येक का एक ही पता है।

तो, आपको जो दो जवाब मिलना है वह आपको प्राप्त दो उत्तरों को संयोजित करना है। Msgstr "एक से स्ट्रिंग में संदेश ['to'] सेट करें, लेकिन कच्चे सूची को sendmail को पास करें:

emails = ['a.com','b.com', 'c.com']
msg['To'] = ', '.join( emails ) 
....
s.sendmail( msg['From'], emails, msg.as_string())

मैं इसे इस तरह करता हूं:

def send_mail
    msg['Subject'] = subject
    msg['From']    = sender
    msg['To']      = [[email protected],[email protected]]
    msg['Cc']      = [[email protected],[email protected]]
    msg['Bcc']     = [[email protected],[email protected]]
    recips  = [[email protected],[email protected],[email protected],[email protected],[email protected],[email protected]]
    sendmail(sender, recips, msg.as_string())


msg['From']    = sender
msg['To']      = [[email protected],[email protected]]
msg['Cc']      = [[email protected],[email protected]]
msg['Bcc']     = [[email protected],[email protected]]
recips  = [[email protected],[email protected],[email protected],[email protected],[email protected],[email protected]]
sendmail(sender, recips, msg.as_string())

मैंने कुछ महीनों पहले इसे समझ लिया और इसके बारे में ब्लॉग किया । सारांश है:

यदि आप एकाधिक प्राप्तकर्ताओं को ईमेल भेजने के लिए smtplib का उपयोग करना चाहते हैं, तो उन्हें जोड़ने के लिए email.Message.add_header('To', eachRecipientAsString) का उपयोग करें, और फिर जब आप sendmail विधि का आह्वान करते हैं, तो ईमेल का use email.Message.get_all('To') उन सभी को संदेश भेजें। सीसी और बीसीसी प्राप्तकर्ताओं के लिए डिट्टो।


यह वास्तव में काम करता है , मैंने कई प्रकारों को आजमाने में बहुत समय बिताया।

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = '[email protected]'
recipients = ['[email protected]', '[email protected]']
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = ", ".join(recipients)
s.sendmail(sender, recipients, msg.as_string())





smtplib