Conéctate a SMTP (SSL o TLS) usando Python

Estoy intentando conectarme con el servidor de correo SMTP de Gmail y realizar las tareas tal como se describe en el código de esqueleto que se me dio. Solo se permite el uso de socket s (por lo tanto, no el smtplib ). Necesito: enviar el comando HELO , MAIL FROM , RCPT TO y DATA .

Hay muchos casos de problemas similares publicados, pero no han recibido la respuesta adecuada. Por ejemplo: Implementar la seguridad de la capa de transporte en Python – Simple Mail Client

El progtwig es necesario para conectarse a smtp.gmail.com través del puerto 587 . He tomado dos enfoques diferentes:

  1. Utilizando 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. Utilizando SSL:

     clientSocketSSL = ssl.wrap_socket(clientSocket) 

    Luego, clientSocketSSL reemplaza todas las instancias de clientSocket . Las líneas de STARTTLS también se eliminan y la import ssl se agrega a la parte superior.

Cuando se usa el primer método, el comando MAIL FROM: no devuelve nada. Estoy obteniendo el siguiente resultado:

 250 mx.google.com at your service 220 2.0.0 Ready to start TLS 250 reply not received from server. 

Cuando uso SSL, obtengo lo mismo que la publicación vinculada:

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

¿Me estoy perdiendo de algo? Supongo que mi mejor opción es usar TLS pero no tengo idea de cómo hacerlo … ¿hay algún problema con mi comando MAIL FROM ?

Al usar SSL, debe conectarse al puerto 465 en lugar del puerto 587. Si usa STARTTLS, todavía necesita usar ssl.wrap_socket , solo debe hacerlo más tarde, específicamente, después de recibir la respuesta 220 al comando STARTTLS . 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.

Después de STARTTLS , llame

 clientSocket = ssl.wrap_socket(clientSocket)