2012-10-12 114 views
12

Estoy intentando conectarme al servidor de correo SMTP de Gmail y realizar las tareas indicadas por el código de esqueleto que se me proporcionó. Solo se permite el uso de socket s (no el smtplib). Necesito: enviar el comando HELO, MAIL FROM, RCPT TO y DATA.Conéctese a SMTP (SSL o TLS) usando Python

Hay muchos casos de problemas similares publicados, pero no han recibido la respuesta adecuada. Por ejemplo: Implementing Transport Layer Security in Python - Simple Mail Client

El programa se requiere para conectarse a través del puerto smtp.gmail.com587. Me he tomado dos enfoques diferentes:

  1. Uso 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. El uso de SSL:

    clientSocketSSL = ssl.wrap_socket(clientSocket) 
    

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

Al usar el primer método, el comando MAIL FROM: no devuelve nada. Estoy recibiendo 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 se usa SSL, estoy recibiendo el mismo que el mensaje vinculado:

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

Me estoy perdiendo algo aquí? 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?

+0

¿Has probado esto? [el envío de correo electrónico con el pitón] [1] [1]: http: // stackoverflow.com/a/399240/986760 – fayyazkl

+0

@fayyazkl, como mencioné, solo puedo usar sockets, no smtplib – user1287523

+0

Comience por corregir la sangría en su código. –

Respuesta

9

Cuando se usa SSL, tiene que conectarse al puerto 465 en lugar del puerto 587. Si utiliza STARTTLS, sigue siendo necesario utilizar ssl.wrap_socket, simplemente lo haces más tarde - en concreto, después de recibir la respuesta al comando 220STARTTLS. Después de hacer STARTTLS, se supone que debe hacer HELO nuevamente, ya que se supone que el servidor debe olvidar todo lo que sucedió antes del STARTTLS.

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

Si no desea 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. Por el momento, el servidor es gmail-smtp-in.l.google.com y es compatible con STARTTLS.

Cuestiones relacionadas