2012-10-12 33 views
12

Tôi đang cố gắng kết nối với máy chủ thư Gmail SMTP và thực hiện các tác vụ như được nêu trong mã bộ xương được cung cấp cho tôi. Chỉ cho phép sử dụng socket s (không phải là smtplib). Tôi cần phải: gửi lệnh HELO, MAIL FROM, RCPT TODATA.Kết nối với SMTP (SSL hoặc TLS) bằng cách sử dụng Python

Có nhiều trường hợp xảy ra sự cố tương tự nhưng chưa nhận được câu trả lời đúng. Ví dụ: Implementing Transport Layer Security in Python - Simple Mail Client

Chương trình được yêu cầu kết nối với smtp.gmail.com qua cổng 587. Tôi đã lấy hai cách tiếp cận khác nhau:

  1. Sử dụng 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. Sử dụng SSL:

    clientSocketSSL = ssl.wrap_socket(clientSocket) 
    

    Sau đó clientSocketSSL thay thế tất cả các trường hợp của clientSocket. Các dòng STARTTLS cũng bị xóa và import ssl được thêm vào trên cùng.

Khi sử dụng phương pháp đầu tiên, lệnh MAIL FROM: không trả lại bất kỳ thứ gì. Tôi nhận được kết quả như sau:

250 mx.google.com at your service 

220 2.0.0 Ready to start TLS 

250 reply not received from server. 

Khi sử dụng SSL, tôi nhận được giống như các bài liên quan:

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

Tôi có thiếu cái gì ở đây? Tôi đoán lựa chọn tốt nhất của tôi là sử dụng TLS nhưng tôi không có ý tưởng làm thế nào để đi về điều đó ... là có gì sai với lệnh MAIL FROM của tôi?

+0

Bạn đã thử điều này chưa? [gửi email với python] [1] [1]: http: // stackoverflow.com/a/399240/986760 – fayyazkl

+0

@fayyazkl như tôi đã đề cập, tôi chỉ có thể sử dụng ổ cắm chứ không phải smtplib – user1287523

+0

Bắt đầu bằng cách sửa lỗi thụt đầu dòng trong mã của bạn. –

Trả lời

9

Khi sử dụng SSL, bạn cần kết nối với cổng 465 thay vì cổng 587. Nếu bạn sử dụng STARTTLS, bạn vẫn cần sử dụng ssl.wrap_socket, bạn chỉ cần thực hiện sau - cụ thể, sau khi nhận được phản hồi 220 tới lệnh STARTTLS. Sau khi thực hiện STARTTLS, bạn phải làm lại HELO vì máy chủ được cho là quên mọi thứ xảy ra trước STARTTLS.

Trong cả hai trường hợp, các máy chủ tại cổng smtp.google.com 465 và 587 vẫn không trả lại câu trả lời 250 cho lệnh MAIL vì chúng yêu cầu bạn được xác thực trước khi gửi thư. Thay vào đó, bạn sẽ nhận được phản hồi 530. Bạn sẽ cần sử dụng lệnh AUTH với thông tin đăng nhập gmail.com của mình để xác thực trước khi bạn có thể sử dụng thành công MAIL trên các máy chủ đó.

Nếu bạn không muốn xác thực và tùy thuộc vào chi tiết những gì bạn cần làm, bạn có thể thử sử dụng cổng 25 của máy chủ được tìm thấy trong bản ghi MX của gmail.com. Hiện tại, máy chủ là gmail-smtp-in.l.google.com và hỗ trợ STARTTLS.

Các vấn đề liên quan