El siguiente es mi código actual para conectar al servidor smtp de gmail en el puerto 587. Después de emitir el comando STARTTLS, ¿cómo terminaría de negociar la sesión TLS y comenzar a emitir comandos como AUTH LOGIN y MAIL FROM? He omitido mi nombre de usuario de gmail codificado en Base64 y lo he reemplazado por xxxxxxxx cerca de la parte inferior de mi código.¿Cómo iniciar TLS en una conexión activa en python?
Mi salida de este programa, ya que es, es:
220 mx.google.com ESMTP y10sm3296641yhd.6
250-mx.google.com a su servicio, [75.66.47.144 ]
250-TAMAÑO 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
220 2.0.0 Listo para empezar a TLS
from socket import *
import ssl
msg = "\r\n smtp.."
endmsg = "\r\n.\r\n"
# Mailserver hostname and port to be used.
mailserver = ("smtp.gmail.com", 587)
# Create a socket and create an active TCP connection with the mailserver
clientSocket = socket(AF_INET, SOCK_STREAM);
clientSocket.connect(mailserver)
# Read server response
recv = clientSocket.recv(1024)
print recv
if recv[:3] != '220':
print '220 reply not received from server.'
# Send EHLO command and print server response.
ehloCommand = 'EHLO smtp.google.com\r\n'
clientSocket.send(ehloCommand)
recv1 = clientSocket.recv(1024)
print recv1
if recv1[:3] != '250':
print '250 reply not received from server.'
# Send STARTTLS command to server and print server response
command = "STARTTLS\r\n"
clientSocket.send(command)
recv1 = clientSocket.recv(1024)
print recv1
if recv[:3] != '220':
print '220 reply not received from server.'
# SEND AUTH LOGIN command and Base64 encoded username
command = "AUTH LOGIN xxxxxxxxxxxxx\r\n"
clientSocket.send(command)
recv1 = clientSocket.recv(1024)
print recv1
¿por qué no usar http://docs.python.org/library/smtplib.html? –
@MK. Quiero hacer esto manualmente como ejercicio. – ripit
Me lo imaginaba. Si no se usa el módulo ssl escrito en C, hay un módulo python ssl puro en alguna parte. quizás comience desde ssl.wrap_socket (self.sock, keyfile, certfile) – swang