Implementando la seguridad de la capa de transporte en Python – Simple Mail Client

Tengo una tarea para escribir un cliente de correo simple y para conectarme a un servidor smtp de google usando sockets (sin usar smtp lib). Sin embargo, emitir un comando MAIL FROM a un servidor smtp de google requiere ssl o tls, y esta es la parte que no puedo entender. Estoy tratando de usar el método ssl.wrap_socket () de Python de esta manera …

# Create socket called clientSocket and establish a TCP connection with mailserver clientSocket = socket(AF_INET, SOCK_STREAM) ssl_clientSocket = ssl.wrap_socket(clientSocket) ssl_clientSocket.connect((mailserver, port)) 

… que no está funcionando. Estoy bastante seguro de que necesito incluir los parámetros ca_certs y ca_reqs, pero no estoy seguro. Y si esto es así, ¿cómo hago para obtener estos certificados? ¿Tengo que descargar openssl y generar uno? ¿Alguien con experiencia con esto? Aquí está el código completo para estar seguro.

 from socket import * import ssl msg = "\r\n I love computer networks!" endmsg = "\r\n.\r\n" # Choose a mail server (eg Google mail server) and call it mailserver mailserver = "smtp.gmail.com" port = 587 # Create socket called clientSocket and establish a TCP connection with mailserver clientSocket = socket(AF_INET, SOCK_STREAM) ssl_clientSocket = ssl.wrap_socket(clientSocket) ssl_clientSocket.connect((mailserver, port)) recv = ssl_clientSocket.recv(1024) print print recv # If the first three numbers of what we receive from the SMTP server are not # '220', we have a problem if recv[:3] != '220': print '220 reply not received from server.' # Send HELO command and print server response. heloCommand = 'HELO Alice\r\n' ssl_clientSocket.send(heloCommand) recv1 = ssl_clientSocket.recv(1024) print recv1 # If the first three numbers of the response from the server are not # '250', we have a problem if recv1[:3] != '250': print '250 reply not received from server.' # Send MAIL FROM command and print server response. mailFromCommand = 'MAIL From: wgimson@gmail.com\r\n' ssl_clientSocket.send(mailFromCommand) recv2 = ssl_clientSocket.recv(1024) print recv2 # If the first three numbers of the response from the server are not # '250', we have a problem if recv2[:3] != '250': print '250 reply not received from server.' # Send RCPT TO command and print server response. rcptToCommand = 'RCPT To: macyali@gmail.com\r\n' ssl_clientSocket.send(rcptToCommand) recv3 = ssl_clientSocket.recv(1024) print recv3 # If the first three numbers of the response from the server are not # '250', we have a problem if recv3[:3] != '250': print '250 reply not received from server.' # Send DATA command and print server response. dataCommand = 'DATA\r\n' ssl_clientSocket.send(dataCommand) recv4 = ssl_clientSocket.recv(1024) print recv4 # If the first three numbers of the response from the server are not # '250', we have a problem if recv4[:3] != '250': print '250 reply not received from server.' # Send message data. ssl_clientSocket.send(msg) # Message ends with a single period. ssl_clientSocket.send(endmsg) # Send QUIT command and get server response. quitCommand = 'QUIT\r\n' ssl_clientSocket.send(quitCommand) recv5 = ssl_clientSocket.recv(I1024) print recv5 # If the first three numbers of the response from the server are not # '250', we have a problem if recv5[:3] != '221': print '221 reply not received from server.' 

Se está conectando al puerto 587, que es el puerto para STARTTLS. Al usar SMTPS (es decir, envolver el socket antes que cualquier otra comunicación), debe conectarse al puerto 465 en lugar del puerto 587. Si usa STARTTLS, envuelva el socket más tarde, después de usar el comando STARTTLS y recibir una respuesta 220 . Después de hacer STARTTLS , se supone que debes hacer HELO nuevamente, ya que se supone que el servidor debe olvidar todo lo que sucedió antes de STARTTLS .

En cualquier caso, los servidores en smtp.google.com puertos 465 y 587 aún no devolverán una respuesta 250 al comando MAIL , ya que requieren la autenticación antes de enviar el correo. Obtendrá una respuesta 530 lugar. Deberá usar el comando AUTH con sus credenciales de gmail.com para autenticarse antes de poder usar el MAIL correctamente en esos servidores.

Si no quiere autenticarse, y dependiendo de los detalles de lo que necesita hacer, puede intentar usar el puerto 25 del servidor que se encuentra en el registro MX de gmail.com. En este momento, el servidor es gmail-smtp-in.l.google.com y es compatible con STARTTLS.

  recv5 = ssl_clientSocket.recv(I1024) 

tiene una I en el número de puerto, ¿esto le está causando el problema? ¿O ya has arreglado esa parte?