2012-10-12 18 views
12

kullanarak (SSL veya TLS). Sadece socket s kullanımına izin verilir (smtplib değil). İhtiyacım olan: HELO komutu, MAIL FROM, RCPT TO ve DATA.Bağlan SMTP Gmail SMTP posta sunucusuna bağlanmak ve bana verilen iskelet kodu tarafından belirtilen görevleri yerine getirmeye çalışıyorum Python

yayınlanan benzer sorunların çoğunu durum vardır, ancak doğru cevap almadık. Örneğin: Implementing Transport Layer Security in Python - Simple Mail Client

programı noktası 587 fazla smtp.gmail.com bağlanmak için gereklidir.

  1. kullanma STARTTLS: SSL kullanarak

    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. :

    clientSocketSSL = ssl.wrap_socket(clientSocket) 
    

    Sonra clientSocketSSLclientSocket tüm örneklerini değiştirir İki farklı yaklaşımlar aldık. STARTTLS satırları da kaldırılır ve en üstüne import ssl eklenir.

İlk yöntem kullanıldığında, MAIL FROM: komutu hiçbir şey döndürmez. Aşağıdaki çıktıyı alıyorum:

250 mx.google.com at your service 

220 2.0.0 Ready to start TLS 

250 reply not received from server. 

SSL, ben bağlantılı yazı ile aynı alıyorum kullanarak:

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

Burada bir şey eksik? Sanırım en iyi seçeneğim TLS kullanmaktır ama bunun hakkında nasıl bir fikrim yok? MAIL FROM komutumda bir sorun var mı? Özellikle, STARTTLS komuta 220 yanıtı aldıktan sonra - SSL kullanırken

+0

Bunu denediniz mi? [piton ile e-posta gönderme] [1] [1]: http: // stackoverflow.com/a/399240/986760 – fayyazkl

+0

@fayyazkl bahsettiğim gibi sadece soketleri kullanabilirim, değil smtplib – user1287523

+0

Kodunuzdaki girintiyi sabitleyerek başlayın. –

cevap

9

, az önce geç yapmak, liman 465 yerine limanından Eğer STARTTLS kullanmak, hala ssl.wrap_socket kullanmak gerekir 587. bağlanmak gerekir. STARTTLS'u yaptıktan sonra, STARTTLS'dan önce gerçekleşen herhangi bir şeyi unutması gerektiğinden, tekrar HELO yapmalısınız.

Her iki durumda da, smtp.google.com bağlantı noktaları 465 ve 587'deki sunucular, posta göndermeden önce kimliğinizin doğrulanmasını gerektirdiğinden, MAIL komutuna hala bir 250 yanıt vermez. Bunun yerine bir 530 yanıtı alırsınız. MAIL'u bu sunucularda başarılı bir şekilde kullanabilmeniz için önce kimlik doğrulaması yapmak üzere, gmail.com kimlik bilgilerinizle AUTH komutunu kullanmanız gerekir.

kimlik doğrulaması için istemiyoruz, ve yapmanız gerekenler ayrıntılarına bağlı olarak, gmail.com MX kaydında bulunan sunucu portunu 25 kullanılarak deneyebilirsek

. Şu anda sunucu gmail-smtp-in.l.google.com ve STARTTLS'yi destekliyor.

İlgili konular