4

シンプルなメールクライアントを作成し、ソケットを使用して(smtp libを使用せずに)Google smtpサーバーに接続するという割り当てがあります。ただし、MAIL FROMコマンドをGoogle smtpサーバーに発行するにはsslまたはtlsが必要であり、これは私が理解できない部分です。したがって、Pythonの ssl.wrap_socket() メソッドを使用しようとしています....

# Create socket called clientSocket and establish a TCP connection with mailserver
clientSocket = socket(AF_INET, SOCK_STREAM)
ssl_clientSocket = ssl.wrap_socket(clientSocket) 
ssl_clientSocket.connect((mailserver, port))

...これは機能していません。ca_certs および ca_reqs パラメータを含める必要があることは確かですが、よくわかりません。その場合、これらの証明書を取得するにはどうすればよいですか? openssl をダウンロードして生成する必要がありますか? これを経験した人はいますか?安全のためにコード全体を次に示します。

from socket import *
import ssl

msg = "\r\n I love computer networks!"
endmsg = "\r\n.\r\n"

# Choose a mail server (e.g. Google mail server) and call it mailserver
mailserver = "smtp.gmail.com"
port = 587

# Create socket called clientSocket and establish a TCP connection with mailserver
clientSocket = socket(AF_INET, SOCK_STREAM)
ssl_clientSocket = ssl.wrap_socket(clientSocket) 
ssl_clientSocket.connect((mailserver, port))

recv = ssl_clientSocket.recv(1024)
print
print recv

# If the first three numbers of what we receive from the SMTP server are not
# '220', we have a problem
if recv[:3] != '220':
    print '220 reply not received from server.'

# Send HELO command and print server response.
heloCommand = 'HELO Alice\r\n'
ssl_clientSocket.send(heloCommand)
recv1 = ssl_clientSocket.recv(1024)
print recv1

# If the first three numbers of the response from the server are not
# '250', we have a problem
if recv1[:3] != '250':
    print '250 reply not received from server.'

# Send MAIL FROM command and print server response.
mailFromCommand = 'MAIL From: wgimson@gmail.com\r\n'
ssl_clientSocket.send(mailFromCommand)
recv2 = ssl_clientSocket.recv(1024)
print recv2

# If the first three numbers of the response from the server are not
# '250', we have a problem
if recv2[:3] != '250':
    print '250 reply not received from server.'

# Send RCPT TO command and print server response.
rcptToCommand = 'RCPT To: macyali@gmail.com\r\n'
ssl_clientSocket.send(rcptToCommand)
recv3 = ssl_clientSocket.recv(1024)
print recv3

# If the first three numbers of the response from the server are not
# '250', we have a problem
if recv3[:3] != '250':
    print '250 reply not received from server.'

# Send DATA command and print server response.
dataCommand = 'DATA\r\n'
ssl_clientSocket.send(dataCommand)
recv4 = ssl_clientSocket.recv(1024)
print recv4

# If the first three numbers of the response from the server are not
# '250', we have a problem
if recv4[:3] != '250':
    print '250 reply not received from server.'

# Send message data.
ssl_clientSocket.send(msg)

# Message ends with a single period.
ssl_clientSocket.send(endmsg)

# Send QUIT command and get server response.
quitCommand = 'QUIT\r\n'
ssl_clientSocket.send(quitCommand)
recv5 = ssl_clientSocket.recv(I1024)
print recv5

# If the first three numbers of the response from the server are not
# '250', we have a problem
if recv5[:3] != '221':
    print '221 reply not received from server.'
4

2 に答える 2

2

STARTTLSのポートであるポート587に接続しています。SMTPSを使用する場合(つまり、他の通信の前にソケットをラップする場合)、ポート587ではなくポート465に接続する必要があります。STARTTLSを使用する場合は、STARTTLSコマンドを使用して220応答を受信した後、後でソケットをラップします。を実行した後、サーバーはの前に発生したすべてのことを忘れるはずなので、もう一度STARTTLS実行することになっています。HELOSTARTTLS

いずれの場合も、smtp.google.comポート465および587のサーバーは、メールを送信する前に認証を受ける必要があるため250、コマンドへの応答を返しません。代わりに応答が返されMAILます。これらのサーバーで正常に使用する前に、gmail.comのクレデンシャルでコマンドを530使用しAUTHて認証する必要があります。MAIL

認証したくない場合、および実行する必要があることの詳細に応じて、gmail.comのMXレコードにあるサーバーのポート25を使用してみることができます。現在、サーバーはgmail-smtp-in.l.google.comであり、STARTTLSをサポートしています。

于 2012-10-21T23:54:29.093 に答える
0
 recv5 = ssl_clientSocket.recv(I1024) 

ポート番号にがI含まれていますが、これが問題の原因ですか? それとも、その部分はもう修正しましたか?

于 2012-10-14T02:47:04.397 に答える