簡體   English   中英

在Python中包裝套接字時,GMail STARTLS錯誤的版本號

[英]GMail STARTLS wrong version number when wraping socket in Python

我正在嘗試使用Python3中的套接字連接到Gmail的SMTP。 使用此代碼(省略響應接收部分):

import ssl
import base64
from socket import *

cs = socket(AF_INET, SOCK_STREAM)
cs.connect(("smtp.gmail.com", 587))
cs.send(b'EHLO smtp.google.com\r\n')
cs.send(b'STARTTLS\r\n')
ws = ssl.wrap_socket(cs, ssl_version=ssl.PROTOCOL_TLSv1, ciphers="ADH-AES256-SHA")

但是在最后一行的do_handshake中出現以下錯誤:

ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:645)

我也在最后一行嘗試了以下版本:

ssl_version=ssl.PROTOCOL_SSLv23
            ssl.PROTOCOL_TLSv1
            ssl.OP_NO_SSLv3
            ssl.OP_NO_TLSv1
            ssl.PROTOCOL_SSLv2
            ssl.PROTOCOL_SSLv23
            ssl.PROTOCOL_SSLv3
            ssl.PROTOCOL_TLSv1

難道我做錯了什么 ? 謝謝。

問題是您永遠不會收到套接字。 您也許可以在某些服務器上解決該問題(我對此表示懷疑),但Google的服務器不喜歡它。 真的不認為它可以與任何服務器一起使用,因為我很確定您需要一個干凈的接收緩沖區,因此TLS協商可以在沒有大量先前垃圾的情況下進行。

您的代碼對我來說具有以下更改:

import ssl
import base64
from socket import *

cs = socket(AF_INET, SOCK_STREAM)
cs.connect(("smtp.gmail.com", 587))
print(cs.recv(4096))
cs.send(b'EHLO smtp.google.com\r\n')
print(cs.recv(4096))
cs.send(b'STARTTLS\r\n')
print(cs.recv(4096))
ws = ssl.wrap_socket(cs, ssl_version=ssl.PROTOCOL_TLSv1)
ws.send(b'MAIL FROM: abc@def.com\r\n')
print(ws.recv(4096))

但是,正如評論中已經提到的那樣,除非這只是出於娛樂和/或學習目的,否則您應該使用python的smtplib。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM