2008-09-16 5 views
58

से प्रेषण के माध्यम से मेल भेजना अगर मैं एसएमटीपी के माध्यम से मेल नहीं भेजना चाहता हूं, बल्कि भेजने के माध्यम से, क्या पाइथन के लिए एक पुस्तकालय है जो इस प्रक्रिया को समाहित करता है?पायथन

बेहतर अभी तक, क्या एक अच्छी लाइब्रेरी है जो पूरे 'sendmail -versus-smtp' पसंद को सारणीबद्ध करती है?

मैं इस स्क्रिप्ट को यूनिक्स होस्ट्स के समूह पर चलाऊंगा, जिनमें से कुछ स्थानीयहोस्ट पर सुन रहे हैं: 25; इनमें से कुछ एम्बेडेड सिस्टम का हिस्सा हैं और एसएमटीपी को स्वीकार करने के लिए सेट नहीं किए जा सकते हैं।

गुड प्रैक्टिस के हिस्से के रूप में, मैं वास्तव में पुस्तकालय को हेडर इंजेक्शन भेद्यता का ख्याल रखना चाहता हूं - इसलिए popen('/usr/bin/sendmail', 'w') पर एक स्ट्रिंग को डंप करना धातु की तुलना में थोड़ा करीब है।

जवाब है, तो इसे 'एक पुस्तकालय बारे में जाना है,' तो यह ;-)

उत्तर

97

शीर्षलेख इंजेक्शन यह नहीं है कि आप मेल कैसे भेजते हैं, यह एक कारक है कि आप मेल कैसे बनाते हैं। email पैकेज की जाँच करें, उस के साथ मेल का निर्माण, यह serialise, और subprocess मॉड्यूल का उपयोग कर /usr/sbin/sendmail पर भेज दें:

from email.mime.text import MIMEText 
from subprocess import Popen, PIPE 

msg = MIMEText("Here is the body of my message") 
msg["From"] = "[email protected]" 
msg["To"] = "[email protected]" 
msg["Subject"] = "This is the subject." 
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE) 
p.communicate(msg.as_string()) 
+0

बिल्कुल सही। मेरी वैचारिक समस्या ईमेल के निर्माण और भेजने को अलग कर रही थी। धन्यवाद! – Nate

+3

अच्छा, जवाब के 5 साल बाद, आज मुझे मदद मिली :) – Peter

+10

आपको sendmail को '-oi' पैरामीटर का भी उपयोग करना चाहिए। यह ईमेल को समय-समय पर समाप्त करने से आपके संदेश में एकल '.' रोकता है। –

3

यह काफी आम है सिर्फ अजगर से sendmail आदेश os.popen

व्यक्तिगत रूप से का उपयोग कर उपयोग करने के लिए, के लिए स्क्रिप्ट मैं नहीं था होना खुद को लिखना नहीं, मुझे लगता है कि केवल एसएमटीपी-प्रोटोकॉल का उपयोग करना बेहतर है, क्योंकि इसे विंडोज़ पर चलाने के लिए एक sendmail क्लोन इंस्टॉल करने की आवश्यकता नहीं होगी।

https://docs.python.org/library/smtplib.html

+0

एसएमटीपी ~ nix बक्से पर काम नहीं करता है [डीएमए] (https जैसी चीजों का उपयोग कर universal_newlines=True बिना subrocess.Popen()

from email.mime.text import MIMEText from subprocess import Popen, PIPE msg = MIMEText("Here is the body of my message") msg["From"] = "[email protected]" msg["To"] = "[email protected]" msg["Subject"] = "This is the subject." p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE, universal_newlines=True) p.communicate(msg.as_string()) 

के लिए एक अतिरिक्त universal_newlines=True तर्क जोड़ने के लिए किया था। कॉम/कोरकोड/डीएमए), जो sendmail प्रदान करता है, लेकिन पोर्ट 25 पर नहीं सुनता है ... –

-6

सबसे आसान जवाब है, smtplib है आप इसे here पर डॉक्स पा सकते हैं।

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

+7

प्रश्न कहता है "अगर मैं एसएमटीपी के माध्यम से मेल नहीं भेजना चाहता, बल्कि भेजमेल के माध्यम से ..." – S19N

+1

आपका प्रोग्राम केस में देरी करेगा एसएमटीपी सर्वर के लिए कोई कनेक्शन या अंतराल नहीं है। प्रेषण का उपयोग करके आप एमटीए को संदेश भेजते हैं और आपका कार्यक्रम जारी रहता है। –

30

यह एक साधारण पायथन फ़ंक्शन है जो मेल वितरित करने के लिए यूनिक्स प्रेषण का उपयोग करता है।

def sendMail(): 
    sendmail_location = "/usr/sbin/sendmail" # sendmail location 
    p = os.popen("%s -t" % sendmail_location, "w") 
    p.write("From: %s\n" % "[email protected]") 
    p.write("To: %s\n" % "[email protected]") 
    p.write("Subject: thesubject\n") 
    p.write("\n") # blank line separating headers from body 
    p.write("body of the mail") 
    status = p.close() 
    if status != 0: 
      print "Sendmail exit status", status 
+0

वास्तव में अच्छा पायथन समारोह! – aphex

+0

+1 - बस जो मैं ढूंढ रहा हूं! –

+0

उत्कृष्ट, सरल उदाहरण +1 –

3

यह सवाल बहुत पुराना है, लेकिन यह नोट करने के लिए एक संदेश के निर्माण और ई है कि वहाँ फ़ायदेमंद हो सकता है -मेल वितरण प्रणाली Marrow Mailer (पहले टर्बोमेल) कहा जाता है जो इस संदेश से पहले पूछे जाने से पहले उपलब्ध है।

अब इसे पायथन 3 का समर्थन करने के लिए पोर्ट किया जा रहा है और Marrow सूट के हिस्से के रूप में अपडेट किया गया है।

+0

के बजाय '.as_bytes()' का उपयोग करना चाहिए टर्बोमेल लिंक नहीं जाना है, एक साल बाद – TankorSmash

+2

इसे अब marrow.mailer कहा जाता है। मरो मेलर के लिए https://github.com/marrow/marrow.mailer – amcgregor

+0

+1। मैंने इसे आजमाया, और यह smpt, sendmail, आदि के माध्यम से मेल भेजना बहुत आसान बनाता है, और यह भी बहुत अच्छी मान्यता प्रदान करता है। चूंकि मैरो मेलर "एक अच्छी लाइब्रेरी है जो पूरे 'sendmail -versus-smtp' पसंद को सारणीबद्ध करती है, मुझे लगता है कि यह मूल प्रश्न का सबसे अच्छा जवाब देता है। – tjklemz

-3

मैं सिर्फ एक ही बात के लिए चारों ओर खोज रहा था और अजगर वेबसाइट पर एक अच्छा उदाहरण पाया: http://docs.python.org/2/library/email-examples.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. 
fp = open(textfile, 'rb') 
# Create a text/plain message 
msg = MIMEText(fp.read()) 
fp.close() 

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

नोट यह जरूरी है कि आप sendmail/mailx है "localhost" पर कनेक्शन स्वीकार करने के लिए सही ढंग से सेट अप करें। यह डिफ़ॉल्ट रूप से मेरे मैक, उबंटू और रेडहाट सर्वर पर काम करता है, लेकिन यदि आप किसी भी समस्या में भाग लेते हैं तो आप दोबारा जांचना चाहेंगे।

+0

यह अभी भी एसएमटीपी प्रोटोकॉल के माध्यम से 'लोकलहोस्ट' का उपयोग कर रहा है। और कुछ उपयोगकर्ता पोर्ट 21 खोलना नहीं चाहते हैं, न कि स्थानीयहोस्ट पर भी। – mbirth

6

जिम का जवाब पाइथन 3.4 में मेरे लिए काम नहीं करता था।// GitHub: मैं मैं

TypeError: 'str' does not support the buffer interface