2012-10-12 2 views
12

Gmail SMTP 메일 서버에 연결하고 나에게 주어진 스켈레톤 코드에 설명 된대로 작업을 시도하고 있습니다. socket의 사용 만 허용됩니다 (따라서 smtplib 아님). 나는 : HELO 명령, MAIL FROM, RCPT TODATA을 보내야한다.Python을 사용하여 SMTP (SSL 또는 TLS)에 연결

유사한 문제가 게시 된 경우가 많이 있지만 적절한 답변을받지 못했습니다. 예 : Implementing Transport Layer Security in Python - Simple Mail Client

587을 통해 smtp.gmail.com에 연결하려면 프로그램이 필요합니다.

  1. 사용 STARTTLS : SSL을 사용하여

    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) 
    

    그런 다음 clientSocketSSLclientSocket의 모든 인스턴스를 대체 나는 두 개의 서로 다른 접근 방식을 촬영했습니다. STARTTLS 줄도 제거되고 import ssl이 맨 위에 추가됩니다.

첫 번째 방법을 사용할 때 MAIL FROM: 명령은 아무 것도 반환하지 않습니다. 나는 다음과 같은 출력을 받고 있어요 :

250 mx.google.com at your service 

220 2.0.0 Ready to start TLS 

250 reply not received from server. 

SSL, 내가 링크 된 포스트와 같은납니다 사용 :

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

내가 여기서 뭔가를 놓치고 있습니까? 내 최선의 선택 TLS를 사용하는 것 같아요하지만 난 그것에 대해 갈 생각이 ... 내 무언가가 내 MAIL FROM 잘못인가? 특히, STARTTLS 명령에 220 응답을받은 후 - SSL을 사용하는 경우

+0

시도해 보셨습니까? [파이썬으로 이메일을 보내] [1] [1] : HTTP : // 유래.com/a/399240/986760 – fayyazkl

+0

@fayyazkl 언급 한대로 소켓 만 사용할 수 있으며 smtplib은 사용할 수 없습니다. – user1287523

+0

코드에서 들여 쓰기를 수정하여 시작하십시오. –

답변

9

, 당신은 당신은 나중에 그것을 할, 포트 465 대신 포트는 STARTTLS를 사용하는 경우, 당신은 여전히 ​​ssl.wrap_socket를 사용할 필요가 587에 연결해야합니다. STARTTLS을 수행 한 후 서버가 STARTTLS 이전에 발생한 모든 것을 잊어 버렸기 때문에 다시 HELO을 수행해야합니다. 그들은 당신이 메일을 보내 전에 인증 할 것을 요구하고 있기 때문에

포트 465 smtp.google.com에서 어느 경우

, 서버와 587는 여전히 MAIL 명령에 250 응답을 반환하지 않습니다. 대신 530 응답을 받게됩니다. MAIL을 해당 서버에서 사용하려면 먼저 gmail.com 자격증 명과 함께 AUTH 명령을 사용하여 인증해야합니다.

인증을 원하지 않는 경우, 수행해야 할 작업의 세부 사항에 따라 gmail.com의 MX 레코드에있는 서버의 포트 25를 사용해 볼 수 있습니다. 현재 서버는 gmail-smtp-in.l.google.com이며 STARTTLS를 지원합니다.