पायथन के साथ एक ईमेल कैसे भेजें?


169

यह कोड काम करता है और मुझे सिर्फ एक ईमेल भेजता है:

import smtplib
#SERVER = "localhost"

FROM = 'monty@python.com'

TO = ["jon@mycompany.com"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP('myserver')
server.sendmail(FROM, TO, message)
server.quit()

हालांकि अगर मैं इसे इस तरह से एक समारोह में लपेटने की कोशिश करता हूं:

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    message = """\
        From: %s
        To: %s
        Subject: %s
        %s
        """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()

और इसे कॉल करें मुझे निम्नलिखित त्रुटियां मिलती हैं:

 Traceback (most recent call last):
  File "C:/Python31/mailtest1.py", line 8, in <module>
    sendmail.sendMail(sender,recipients,subject,body,server)
  File "C:/Python31\sendmail.py", line 13, in sendMail
    server.sendmail(FROM, TO, message)
  File "C:\Python31\lib\smtplib.py", line 720, in sendmail
    self.rset()
  File "C:\Python31\lib\smtplib.py", line 444, in rset
    return self.docmd("rset")
  File "C:\Python31\lib\smtplib.py", line 368, in docmd
    return self.getreply()
  File "C:\Python31\lib\smtplib.py", line 345, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

क्या कोई मुझे समझने में मदद कर सकता है क्यों?


2
आप फ़ंक्शन को कैसे कहते हैं?
जोचेन रिट्जेल

क्या इंडेंटेशन आपने अपनी फ़ाइल में उसी के रूप में पोस्ट किया है?
gddc

@gddc नहीं, मैंने ठीक से इंडेंट करना सुनिश्चित किया है, बस यही तरीका है कि मैंने इसे चिपकाया है।
बादल ३११

मैं फ़ंक्शन को अपने मुख्य मॉड्यूल में आयात करके और उन मापदंडों को पारित कर रहा हूं जिन्हें मैंने इसमें परिभाषित किया है।
बादल 311

4
हालाँकि @ Arrieta के ईमेल पैकेज का उपयोग करने का सुझाव इसे हल करने का सबसे अच्छा तरीका है, आपका दृष्टिकोण काम कर सकता है। आपके दो संस्करणों के बीच अंतर स्ट्रिंग में हैं: (1) जैसा कि @NickODell बताते हैं, आपके पास फ़ंक्शन संस्करण में प्रमुख व्हाट्सएप है। हेडर में कोई अग्रणी स्थान नहीं होना चाहिए (जब तक कि वे लिपटे न हों)। (2) जब तक TEXT में एक प्रमुख रिक्त पंक्ति शामिल नहीं हो जाती, तब तक आपने शीर्षकों और शरीर के बीच विभाजक खो दिया है।
टोनी मेयर

जवाबों:


191

मेरा सुझाव है कि आप मानक पैकेज का उपयोग करें emailऔर smtplibसाथ में ईमेल भेजें। कृपया निम्न उदाहरण देखें ( पायथन प्रलेखन से पुन: प्रस्तुत )। ध्यान दें कि यदि आप इस दृष्टिकोण का अनुसरण करते हैं, तो "सरल" कार्य वास्तव में सरल है, और अधिक जटिल कार्य (जैसे बाइनरी ऑब्जेक्ट्स संलग्न करना या सादे / HTML मल्टीपार्ट संदेश भेजना) बहुत तेजी से पूरा होते हैं।

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
with open(textfile, 'rb') as fp:
    # Create a text/plain message
    msg = MIMEText(fp.read())

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

कई गंतव्यों पर ईमेल भेजने के लिए, आप पायथन प्रलेखन में उदाहरण का अनुसरण कर सकते हैं :

# Import smtplib for the actual sending function
import smtplib

# Here are the email package modules we'll need
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

# Create the container (outer) email message.
msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion'
# me == the sender's email address
# family = the list of all recipients' email addresses
msg['From'] = me
msg['To'] = ', '.join(family)
msg.preamble = 'Our family reunion'

# Assume we know that the image files are all in PNG format
for file in pngfiles:
    # Open the files in binary mode.  Let the MIMEImage class automatically
    # guess the specific image type.
    with open(file, 'rb') as fp:
        img = MIMEImage(fp.read())
    msg.attach(img)

# Send the email via our own SMTP server.
s = smtplib.SMTP('localhost')
s.sendmail(me, family, msg.as_string())
s.quit()

जैसा कि आप देख सकते हैं, ऑब्जेक्ट Toमें हेडर को MIMETextकॉमा द्वारा अलग किए गए ईमेल पतों से युक्त एक स्ट्रिंग होना चाहिए। दूसरी ओर, sendmailफ़ंक्शन का दूसरा तर्क स्ट्रिंग्स की एक सूची (प्रत्येक स्ट्रिंग एक ईमेल पता है) होना चाहिए।

इसलिए, यदि आप तीन ईमेल पते हैं: person1@example.com, person2@example.com, और person3@example.com, आप कर सकते हैं के रूप में इस प्रकार है (स्पष्ट वर्गों छोड़े गए):

to = ["person1@example.com", "person2@example.com", "person3@example.com"]
msg['To'] = ",".join(to)
s.sendmail(me, to, msg.as_string())

",".join(to)भाग सूची, अल्पविराम के द्वारा अलग से बाहर एक एकल स्ट्रिंग बनाता है।

आपके प्रश्नों से मैं इकट्ठा होता हूं कि आप पायथन ट्यूटोरियल से नहीं गुजरे हैं - यह एक जरूरी है कि यदि आप पायथन में कहीं भी जाना चाहते हैं - तो मानक पुस्तकालय के लिए प्रलेखन ज्यादातर उत्कृष्ट है।


1
धन्यवाद, यह एक फ़ंक्शन के भीतर से बहुत अच्छी तरह से काम करता है, हालांकि मैं कई प्राप्तकर्ताओं को कैसे भेज सकता हूं? चूंकि msg [] को लगता है कि यह एक शब्दकोश कुंजी है, मैंने एक अर्धविराम के साथ msg [] को अलग करने की कोशिश की, लेकिन वह काम नहीं करता है।
बादल 311

1
@ Cloud311 ठीक वैसे ही जैसे आपके पास अपने कोड में है। यह कॉमा के साथ सीमांकित एक स्ट्रिंग चाहता है: ", ".join(["a@example.com", "b@example.net"])
टिम मैकनामारा

3
ध्यान दें कि To: शीर्षलेख में लिफाफा प्राप्तकर्ता की तुलना में अलग शब्दार्थ है। उदाहरण के लिए, आप ": टोनी मेयर" <tony.meyer@gmail.com> को To: हैडर में एक पते के रूप में उपयोग कर सकते हैं, लेकिन लिफाफा प्राप्तकर्ता को केवल "tony.meyer@gmail.com" होना चाहिए। 'अच्छा' टू: एड्रेस बनाने के लिए, email.utils.formataddr, जैसे email.utils.formataddr ("टोनी मेयर", "tony.meyer@gmail.com") का उपयोग करें।
टोनी मेयर

1
छोटे सुधार: फ़ाइल का उपयोग कर खोला जाना चाहिए with: with open(textfile, 'rb') as fp:। स्पष्ट पास को गिराया जा सकता है, क्योंकि withब्लॉक फ़ाइल को बंद कर देगा भले ही उसके अंदर कोई त्रुटि हो।
jpmc26

1
इस उत्तर के लिए विशिष्ट नहीं है, लेकिन जब आप किसी एसएमटीपी सर्वर से कनेक्ट नहीं होते हैं जिसे आप नियंत्रित नहीं करते हैं, तो आपको इस संभावना पर विचार करना चाहिए कि यह पहुंच से बाहर है, धीमा है, कनेक्शन अस्वीकार कर रहा है या जो कुछ भी है। कोड-वार आपको एक अपवाद मिलेगा, लेकिन आपको फिर से बाद में भेजने की कोशिश करनी होगी। यदि आप अपने स्वयं के प्रेषक / पोस्टफिक्स से बात करते हैं, तो यह आपके लिए फिर से भेजने का ध्यान रखेगा।
राल्फ बोल्टन

66

खैर, आप एक जवाब चाहते हैं जो अप-टू-डेट और आधुनिक है।

यहाँ मेरा जवाब है:

जब मुझे अजगर में मेल करने की आवश्यकता होती है, तो मैं मेलगुन एपीआई का उपयोग करता हूं जो मेल के बहुत सारे सिरदर्द होते हैं, जो मेल भेजने के साथ होते हैं। उनके पास एक अद्भुत ऐप / एपीआई है जो आपको प्रति माह 10,000 ईमेल मुफ्त में भेजने की अनुमति देता है।

ईमेल भेजना इस तरह होगा:

def send_simple_message():
    return requests.post(
        "https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages",
        auth=("api", "YOUR_API_KEY"),
        data={"from": "Excited User <mailgun@YOUR_DOMAIN_NAME>",
              "to": ["bar@example.com", "YOU@YOUR_DOMAIN_NAME"],
              "subject": "Hello",
              "text": "Testing some Mailgun awesomness!"})

आप ईवेंट ट्रैक भी कर सकते हैं और बहुत कुछ कर सकते हैं , क्विकस्टार्ट गाइड देखें ।

मुझे उम्मीद है कि आपको यह काम का लगेगा!


3
यह वास्तव में "इस तिथि का अधिक" है। हालांकि यह एक बाहरी एपीआई का उपयोग करता है। मैं व्यक्तिगत रूप से इसे आंतरिक रखने के लिए यागमेल जैसी किसी चीज़ का उपयोग करूँगा ।
पास्कलवीकूटेन

6
@PascalvKooten पूरी तरह से यगमेल के लिए आपके निरंतर विज्ञापन का पालन करने से इनकार कर रहा है (हाँ, सर, मैं इसे अगली बार मानूंगा, सर;)। लेकिन मुझे यह बहुत उलझन में लगता है कि लगभग कोई भी ओपी मुद्दे की परवाह नहीं करता है, बल्कि बहुत अलग समाधान सुझाता है। यह ऐसा है जैसे मैं पूछ रहा हूं कि मेरे 2009 के स्मार्ट में बल्ब कैसे बदलें और इसका जवाब है: एक असली मर्सिडीज खरीदें ...
14

महान कि मेरे मिशन में कुछ के लिए कुछ मनोरंजन मूल्य है।
पास्कलवूटेन

4
@flaschbier ओप्स मुद्दे के बारे में कोई भी परवाह नहीं करता है क्योंकि शीर्षक गलत है। "पायथन के साथ एक ईमेल कैसे भेजें?" जब लोग उस प्रश्न पर क्लिक करते हैं तो वास्तविक कारण सामने आते हैं, और वे एक उत्तर की अपेक्षा करते हैं जो यागमेल प्रदान कर सकता है: अच्छा और छोटा। तुम वहाँ जाओ। अधिक yagmail विज्ञापन।
पास्कलवीकूटेन

1
केवल कहने के लिए कि मेलगंज के ग्राहकों के लिए, webservices द्वारा मेल भेजना एसएमटीपी के माध्यम से काफी अधिक बैंडविड्थ के अनुकूल है (विशेषकर यदि किसी अनुलग्नक का उपयोग करके)।
राल्फ बोल्टन

44

मैं आपको yagmail पैकेज की सलाह देकर ईमेल भेजने में मदद करना चाहता हूं (मैं अनुचर हूं, विज्ञापन के लिए क्षमा चाहता हूं, लेकिन मुझे लगता है कि यह वास्तव में मदद कर सकता है!)।

आपके लिए पूरा कोड होगा:

import yagmail
yag = yagmail.SMTP(FROM, 'pass')
yag.send(TO, SUBJECT, TEXT)

ध्यान दें कि मैं सभी तर्कों के लिए डिफॉल्ट प्रदान करता हूं, उदाहरण के लिए यदि आप खुद को भेजना चाहते हैं TO, तो आप छोड़ सकते हैं , यदि आप एक विषय नहीं चाहते हैं , तो आप इसे भी छोड़ सकते हैं।

इसके अलावा, लक्ष्य यह भी है कि HTML कोड या चित्र (और अन्य फाइलें) संलग्न करना वास्तव में आसान हो।

जहां आप सामग्री डालते हैं वहां आप कुछ ऐसा कर सकते हैं:

contents = ['Body text, and here is an embedded image:', 'http://somedomain/image.png',
            'You can also find an audio file attached.', '/local/path/song.mp3']

वाह, अटैचमेंट भेजना कितना आसान है! यह yagmail के बिना 20 लाइनों की तरह लगेगा;)

इसके अलावा, यदि आप इसे एक बार सेट करते हैं, तो आपको कभी भी पासवर्ड दोबारा दर्ज नहीं करना पड़ेगा (और इसे सुरक्षित रूप से संग्रहीत किया गया है)। आपके मामले में आप कुछ ऐसा कर सकते हैं:

import yagmail
yagmail.SMTP().send(contents = contents)

जो बहुत अधिक संक्षिप्त है!

मैं आपको github पर एक नज़र डालने या सीधे इसे स्थापित करने के लिए आमंत्रित करूंगा pip install yagmail


4
यह शीर्ष समाधान होना चाहिए।
रिचर्ड डी री

1
OMG, यह एक मीठा, सरल ईमेल मॉड्यूल है। धन्यवाद!
पेपोलुआन

1
क्या मैं yagmailजीमेल के अलावा अन्य उपयोग कर सकता हूं ? मैं अपने स्वयं के SMTP सर्वर के लिए उपयोग करने का प्रयास कर रहा हूं।
अनिर्बान नाग 'टिनटिनम'

@dtgq आपकी चिंता के लिए धन्यवाद। व्यक्तिगत रूप से, मुझे अटैक वेक्टर नहीं दिखता है। यदि कोई आपके द्वारा भेजे जाने वाले पथ के तहत फ़ाइल को बदलने जा रहा है, तो आपके पास एक Attachmentवर्ग होने से कोई फर्क नहीं पड़ता ; यह अभी भी वही बात है। यदि वे आपके कोड को बदल सकते हैं, तो वे वैसे भी कुछ भी कर सकते हैं जो वे चाहते हैं (रूट के बिना / के साथ, यह वही wrt ईमेल भेज रहा है)। यह मुझे विशिष्ट की तरह लगता है "यह सुविधाजनक / जादुई है इसलिए इसे कम सुरक्षित होना चाहिए"। मैं उत्सुक हूं कि आपको कौन सा वास्तविक खतरा दिख रहा है?
पास्कलवूटेन

14

इंडेंटेशन की समस्या है। नीचे दिया गया कोड काम करेगा:

import textwrap

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    message = textwrap.dedent("""\
        From: %s
        To: %s
        Subject: %s
        %s
        """ % (FROM, ", ".join(TO), SUBJECT, TEXT))
    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()


3
@ समूह में SERVERपारित होने वाले वैरिएबल उपयोगकर्ता क्रेडेंशियल है।
उपयोगकर्ता

मैन्युअल रूप से सरल स्ट्रिंग प्रक्षेप के साथ एक मान्य SMTP संदेश को एक साथ रखने की अनुशंसा नहीं की जाती है, और आपके उत्तर में एक बग है जो इसे पूरी तरह दिखाता है। (इसके लिए शरीर को एक मान्य संदेश होने के लिए एक खाली लाइन के साथ शुरू करने की आवश्यकता है।) 1980 के दशक में केवल 7-बिट अंग्रेजी-एएससीआईआई (संलग्नक, अंतर्राष्ट्रीयकरण, और अन्य माइम समर्थन) में सादे पाठ के अलावा चरित्र सेट के अलावा कुछ भी शामिल है। वास्तव में एक पुस्तकालय का उपयोग करना चाहते हैं जो इस सामान को संभालता है। पाइथन emailलाइब्रेरी यह काफी अच्छी तरह से करता है (विशेष रूप से 3.6 के बाद से) हालांकि इसे अभी भी कुछ समझ की आवश्यकता है कि आप क्या कर रहे हैं।
ट्रिपल

7

यहां पाइथन पर एक उदाहरण दिया गया है 3.x, जो इससे बहुत सरल है 2.x:

import smtplib
from email.message import EmailMessage
def send_mail(to_email, subject, message, server='smtp.example.cn',
              from_email='xx@example.com'):
    # import smtplib
    msg = EmailMessage()
    msg['Subject'] = subject
    msg['From'] = from_email
    msg['To'] = ', '.join(to_email)
    msg.set_content(message)
    print(msg)
    server = smtplib.SMTP(server)
    server.set_debuglevel(1)
    server.login(from_email, 'password')  # user & password
    server.send_message(msg)
    server.quit()
    print('successfully sent the mail.')

इस फ़ंक्शन को कॉल करें:

send_mail(to_email=['12345@qq.com', '12345@126.com'],
          subject='hello', message='Your analysis has done!')

नीचे केवल चीनी उपयोगकर्ता के लिए हो सकता है:

यदि आप 126/163, 16 If का उपयोग करते हैं, तो आपको नीचे की तरह "端 授权 授权 密码" सेट करने की आवश्यकता है:

यहां छवि विवरण दर्ज करें

रेफरी: https://stackoverflow.com/a/41470149/2803344 https://docs.python.org/3/library/email.examples.html#email-examples


4

फ़ंक्शन में अपना कोड इंडेंट करते समय (जो ठीक है), आपने कच्चे संदेश स्ट्रिंग की लाइनों को भी इंडेंट किया। लेकिन प्रमुख श्वेत स्थान का अर्थ है हेडर लाइनों का फोल्डिंग (संघनन), जैसा कि RFC 2822 के खंड 2.2.3 और 3.2.3 में वर्णित है - इंटरनेट संदेश प्रारूप :

प्रत्येक शीर्ष लेख फ़ील्ड तार्किक रूप से फ़ील्ड नाम, बृहदान्त्र और फ़ील्ड बॉडी वाले वर्णों की एकल पंक्ति होती है। हालाँकि, सुविधा के लिए, और प्रति पंक्ति 998/78 वर्ण सीमाओं से निपटने के लिए, हेडर फ़ील्ड के फ़ील्ड बॉडी भाग को कई लाइन प्रतिनिधित्व में विभाजित किया जा सकता है; इसे "फोल्डिंग" कहा जाता है।

आपके sendmailकॉल के फ़ंक्शन रूप में , सभी लाइनें श्वेत स्थान के साथ शुरू हो रही हैं और इसलिए "प्रकट" (संक्षिप्त) हैं और आप भेजने की कोशिश कर रहे हैं

From: monty@python.com    To: jon@mycompany.com    Subject: Hello!    This message was sent with Python's smtplib.

हमारे दिमाग के अलावा, किसी भी और हेडर smtplibको नहीं समझेगा , क्योंकि ये नाम केवल एक लाइन की शुरुआत में पहचाने जाते हैं। इसके बजाय एक बहुत लंबे प्रेषक का ईमेल पता मानेंगे:To:Subject:smtplib

monty@python.com    To: jon@mycompany.com    Subject: Hello!    This message was sent with Python's smtplib.

यह काम नहीं करेगा और इसलिए आपका अपवाद आता है।

समाधान सरल है: बस messageस्ट्रिंग को संरक्षित करें जैसा कि पहले था। यह एक फ़ंक्शन द्वारा किया जा सकता है (जैसा कि जीशान ने सुझाव दिया है) या स्रोत कोड में तुरंत:

import smtplib

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    """this is some test documentation in the function"""
    message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()

अब खुलासा नहीं होता है और आप भेजते हैं

From: monty@python.com
To: jon@mycompany.com
Subject: Hello!

This message was sent with Python's smtplib.

कौन सा काम करता है और आपके पुराने कोड द्वारा क्या किया गया था।

ध्यान दें कि मैं RFC की धारा 3.5 (जो आवश्यक है) को समायोजित करने के लिए हेडर और बॉडी के बीच की खाली लाइन को संरक्षित कर रहा था और पायथन स्टाइल गाइड PEP-0008 (जो वैकल्पिक है) के अनुसार फ़ंक्शन के बाहर शामिल है ।


3

यह शायद आपके संदेश में टैब डाल रहा है। संदेश भेजने से पहले उसका प्रिंट आउट निकाल लें।


1

सुनिश्चित करें कि आपने प्रेषक और प्राप्तकर्ता दोनों को ईमेल भेजने और ईमेल खाते में अज्ञात स्रोतों (बाहरी स्रोतों) से ईमेल प्राप्त करने की अनुमति दी है।

import smtplib

#Ports 465 and 587 are intended for email client to email server communication - sending email
server = smtplib.SMTP('smtp.gmail.com', 587)

#starttls() is a way to take an existing insecure connection and upgrade it to a secure connection using SSL/TLS.
server.starttls()

#Next, log in to the server
server.login("#email", "#password")

msg = "Hello! This Message was sent by the help of Python"

#Send the mail
server.sendmail("#Sender", "#Reciever", msg)

यहां छवि विवरण दर्ज करें


msgएक मान्य SMTP संदेश नहीं है, और यदि आपका मेल सर्वर इसे स्वीकार करता है, तो वह ईथर में गायब हो जाएगा।
ट्रिपल

0

मैंने सोचा कि मैं अपने दो बिट्स यहाँ रख दूं क्योंकि मुझे पता चल गया है कि यह कैसे काम करता है।

ऐसा प्रतीत होता है कि आपके पास अपनी सर्वर कनेक्शन सेटिंग्स पर निर्दिष्ट पोर्ट नहीं है, यह मुझे थोड़ा प्रभावित करता है जब मैं अपने एसएमटीपी सर्वर से कनेक्ट करने की कोशिश कर रहा था जो डिफ़ॉल्ट पोर्ट का उपयोग नहीं कर रहा है: 25।

Smtplib.SMTP डॉक्स के अनुसार, आपके अहलो या हीलो रिक्वेस्ट / रिस्पॉन्स का स्वत: ही ध्यान रखा जाना चाहिए, इसलिए आपको इस बारे में चिंता नहीं करनी चाहिए (लेकिन अगर बाकी सभी विफल हो जाते हैं तो यह पुष्टि करने के लिए कुछ हो सकता है)।

अपने आप से पूछने के लिए एक और बात यह है कि क्या आपने अपने एसएमटीपी सर्वर पर एसएमटीपी कनेक्शन की अनुमति दी है? GMAIL और ZOHO जैसी कुछ साइटों के लिए आपको वास्तव में ईमेल खाते के भीतर IMAP कनेक्शन को सक्रिय करना होगा। आपका मेल सर्वर SMTP कनेक्शन की अनुमति नहीं दे सकता है जो 'लोकलहोस्ट' से नहीं आता है? देखने के लिए कुछ।

अंतिम बात यह है कि आप टीएलएस पर कनेक्शन लेने की कोशिश करना चाहते हैं। अधिकांश सर्वर को अब इस प्रकार के प्रमाणीकरण की आवश्यकता होती है।

आप देखेंगे कि मैंने अपने ईमेल में दो TO फ़ील्ड्स जाम कर दी हैं। संदेश ['TO'] और संदेश [] FROM ’] संदेश शब्दकोश आइटम ईमेल के हेडर में ही दिखाने के लिए सही जानकारी की अनुमति देता है, जिसे कोई भी ई-मेल फ़ील्ड से / में ईमेल प्राप्त करने के अंत में देखता है (आप यहां तक ​​कि उत्तर देने के लिए फ़ील्ड को जोड़ने में भी सक्षम हो सकता है। फ़ील्ड और फ़ील्ड से स्वयं को सर्वर की आवश्यकता होती है। मुझे पता है कि मैंने कुछ ईमेल सर्वरों को ईमेल को अस्वीकार करते हुए सुना है यदि उनके पास उचित ईमेल हेडर नहीं हैं।

यह वह कोड है जिसका मैंने उपयोग किया है, एक फ़ंक्शन में, जो मेरे स्थानीय कंप्यूटर और एक दूरस्थ SMTP सर्वर (ZOHO के रूप में दिखाया गया है) का उपयोग करके * .txt फ़ाइल की सामग्री को ईमेल करने के लिए काम करता है:

def emailResults(folder, filename):

    # body of the message
    doc = folder + filename + '.txt'
    with open(doc, 'r') as readText:
        msg = MIMEText(readText.read())

    # headers
    TO = 'to_user@domain.com'
    msg['To'] = TO
    FROM = 'from_user@domain.com'
    msg['From'] = FROM
    msg['Subject'] = 'email subject |' + filename

    # SMTP
    send = smtplib.SMTP('smtp.zoho.com', 587)
    send.starttls()
    send.login('from_user@domain.com', 'password')
    send.sendmail(FROM, TO, msg.as_string())
    send.quit()

0

यह ध्यान देने योग्य है कि SMTP मॉड्यूल संदर्भ प्रबंधक का समर्थन करता है इसलिए मैन्युअल रूप से कॉल छोड़ने () की आवश्यकता नहीं है, यह गारंटी देगा कि अपवाद होने पर भी इसे हमेशा कहा जाता है।

    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
        server.ehlo()
        server.login(user, password)
        server.sendmail(from, to, body)

-1

जहां तक ​​आपके कोड का संबंध है, इसके साथ मौलिक रूप से कुछ भी गलत नहीं लगता है, इसके अलावा, यह स्पष्ट नहीं है कि आप वास्तव में उस फ़ंक्शन को कैसे बुला रहे हैं। मैं बस यही सोच सकता हूं कि जब आपका सर्वर जवाब नहीं दे रहा है तो आपको यह SMTPServerDisconnected त्रुटि मिलेगी। यदि आप smtplib (नीचे अंश) में getreply () फ़ंक्शन को देखते हैं, तो आपको एक विचार मिलेगा।

def getreply(self):
    """Get a reply from the server.

    Returns a tuple consisting of:

      - server response code (e.g. '250', or such, if all goes well)
        Note: returns -1 if it can't read response code.

      - server response string corresponding to response code (multiline
        responses are converted to a single, multiline string).

    Raises SMTPServerDisconnected if end-of-file is reached.
    """

https://github.com/rreddy80/sendEmails/blob/master/sendEmailAttachments.py जो ईमेल भेजने के लिए एक फ़ंक्शन कॉल का उपयोग करता है, अगर आप ऐसा करने की कोशिश कर रहे हैं (DRY दृष्टिकोण) का एक उदाहरण देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.