2012-10-12 20 views
12

का उपयोग कर एसएमटीपी (एसएसएल या टीएलएस) से कनेक्ट करें मैं जीमेल एसएमटीपी मेल सर्वर से कनेक्ट करने का प्रयास कर रहा हूं और मुझे दिए गए कंकाल कोड द्वारा उल्लिखित कार्यों को निष्पादित करने का प्रयास कर रहा हूं। केवल socket एस का उपयोग करने की अनुमति है (इसलिए smtplib नहीं)। मुझे यह करना होगा: HELO कमांड, MAIL FROM, RCPT TO, और DATA भेजें।पायथन

इसी तरह की समस्याओं के पोस्ट के कई मामले पोस्ट किए गए हैं, लेकिन उन्हें उचित उत्तर नहीं मिला है। उदाहरण के लिए: Implementing Transport Layer Security in Python - Simple Mail Client

कार्यक्रम बंदरगाह 587 से अधिक smtp.gmail.com से कनेक्ट करने के लिए आवश्यक है।

  1. का उपयोग STARTTLS:

    mailserver = 'smtp.gmail.com' 
    clientSocket = socket(AF_INET, SOCK_STREAM) 
    clientSocket.connect((mailserver, 587)) 
    recv = clientSocket.recv(1024) 
    print recv 
    if recv[:3] != '220': 
        print '220 reply not received from server.' 
    
    #Send HELO command and print server response 
    heloCommand = 'HELO Alice\r\n' 
    clientSocket.send(heloCommand) 
    recv1 = clientSocket.recv(1024) 
    print recv1 
    if recv1[:3] != '250': 
        print '250 reply not received from server.' 
    
    #Send MAIL FROM command and print server response. 
    command = "STARTTLS\r\n" 
    clientSocket.send(command) 
    recvdiscard = clientSocket.recv(1024) 
    print recvdiscard 
    clientSocket.send("MAIL From: email\r\n") 
    recv2 = clientSocket.recv(1024) 
    print recv2 
    if recv2[:3] != '250': 
        print '250 reply not received from server.' 
    
  2. SSL का उपयोग:

    clientSocketSSL = ssl.wrap_socket(clientSocket) 
    

    फिर clientSocketSSLclientSocket के सभी उदाहरणों की जगह मैं दो अलग-अलग दृष्टिकोण लिया है। STARTTLS लाइनों को भी हटा दिया जाता है और import ssl शीर्ष पर जोड़ा जाता है।

पहली विधि का उपयोग करते समय, MAIL FROM: कमांड कुछ भी वापस नहीं कर रहा है। मैं निम्नलिखित उत्पादन हो रही है:

250 mx.google.com at your service 

220 2.0.0 Ready to start TLS 

250 reply not received from server. 

एसएसएल, मैं जुड़ा हुआ पोस्ट के रूप में ही हो रही है का उपयोग करते समय:

ssl.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 

मैं यहाँ कुछ याद आ रही है? मुझे लगता है कि मेरा सबसे अच्छा विकल्प टीएलएस का उपयोग करना है, लेकिन मुझे नहीं पता कि इसके बारे में कैसे जाना है ... क्या मेरे MAIL FROM कमांड में कुछ गड़बड़ है?

+0

क्या आपने यह कोशिश की है? [अजगर के साथ ईमेल भेजने] [1] [1]: http: // stackoverflow।com/a/399240/986760 – fayyazkl

+0

@fayyazkl जैसा कि मैंने उल्लेख किया है, मैं केवल सॉकेट का उपयोग कर सकता हूं, – user1287523

+0

smtplib नहीं, अपने कोड में इंडेंटेशन को ठीक करके प्रारंभ करें। –

उत्तर

9

SSL का उपयोग करते हैं, तो आप पोर्ट 465 के बजाय बंदरगाह 587 आप STARTTLS का उपयोग करते हैं, तब भी आप ssl.wrap_socket उपयोग करने की आवश्यकता से कनेक्ट करने की जरूरत है, तो आप सिर्फ इसे बाद में कर - विशेष रूप से, STARTTLS आदेश को 220 प्रतिक्रिया प्राप्त करने के बाद। STARTTLS करने के बाद, आपको HELO फिर से करना होगा, क्योंकि सर्वर STARTTLS से पहले हुआ कुछ भी भूलना चाहिए।

किसी भी मामले में, smtp.google.com बंदरगाहों 465 और 587 पर सर्वर MAIL कमांड की प्रतिक्रिया वापस नहीं लौटेगा, क्योंकि उन्हें मेल भेजने से पहले आपको प्रमाणित किया जाता है। आपको इसके बजाय 530 प्रतिक्रिया मिलेगी। इससे पहले कि आप उन सर्वरों पर सफलतापूर्वक MAIL का उपयोग कर सकें, आपको अपने gmail.com प्रमाण-पत्रों के साथ AUTH कमांड का प्रमाणीकरण करने की आवश्यकता होगी।

यदि आप प्रमाणित नहीं करना चाहते हैं, और आपको जो करना है, उसके विवरण के आधार पर, आप gmail.com के एमएक्स रिकॉर्ड में मिले सर्वर के पोर्ट 25 का उपयोग करने का प्रयास कर सकते हैं। फिलहाल, सर्वर gmail-smtp-in.l.google.com है और STARTTLS का समर्थन करता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^