8

以下は、ポート 587 で gmail の smtp サーバーに接続するための現在のコードです。STARTTLS コマンドを発行した後、TLS セッションのネゴシエーションを終了し、AUTH LOGIN や MAIL FROM などのコマンドの発行を開始するにはどうすればよいですか? Base64 でエンコードされた gmail ユーザー名を省略し、コードの下部にある xxxxxxxx に置き換えました。

このプログラムからの私の出力は次のとおりです。

220 mx.google.com ESMTP y10sm3296641yhd.6

250-mx.google.com [75.66.47.144]

250サイズ 35882577

250-8BITMIME

250-STARTTLS

250 拡張ステータスコード

220 2.0.0 TLS を開始する準備ができました

from socket import *
import ssl
msg = "\r\n smtp.."
endmsg = "\r\n.\r\n"

# Mailserver hostname and port to be used.
mailserver = ("smtp.gmail.com", 587)


# Create a socket and create an active TCP connection with the mailserver
clientSocket = socket(AF_INET, SOCK_STREAM);
clientSocket.connect(mailserver)

# Read server response
recv = clientSocket.recv(1024)
print recv
if recv[:3] != '220':
    print '220 reply not received from server.'

# Send EHLO command and print server response.
ehloCommand = 'EHLO smtp.google.com\r\n'
clientSocket.send(ehloCommand)

recv1 = clientSocket.recv(1024)
print recv1
if recv1[:3] != '250':
    print '250 reply not received from server.'

# Send STARTTLS command to server and print server response
command = "STARTTLS\r\n"
clientSocket.send(command)

recv1 = clientSocket.recv(1024)
print recv1
if recv[:3] != '220':
    print '220 reply not received from server.'

# SEND AUTH LOGIN command and Base64 encoded username
command = "AUTH LOGIN xxxxxxxxxxxxx\r\n"
clientSocket.send(command)

recv1 = clientSocket.recv(1024)
print recv1
4

1 に答える 1

12

接続されたソケットを SSL ラップできます。これにより、次のようなアイデアが得られます。

import ssl
import base64
from socket import *


cc = socket(AF_INET, SOCK_STREAM)
cc.connect(("smtp.gmail.com", 587))
# cc.read(..)

cc.send('helo tester.com\r\n')
cc.send('starttls\r\n')
# cc.read(..) If the server responds ok to starttls
#             tls negotiation needs to happen and all
#             communication is then over the SSL socket 

scc = ssl.wrap_socket(cc, ssl_version=ssl.PROTOCOL_SSLv23)
scc.send('auth login\r\n')
# scc.read(..)

scc.send(base64.b64encode('username')+'\r\n')
scc.send(base64.b64encode('password')+'\r\n')

# css.send(
#  mail from:
#  rcpt to:
#  data
#  etc

ユーザー名/パスワードのエンコーディングに関する情報については、このページの AUTH LOGIN セクションを参照してください: http://www.samlogic.net/articles/smtp-commands-reference-auth.htm

AUTH LOGIN コマンドがサーバーに送信された後、サーバーは BASE64 でエンコードされたテキスト (質問) をクライアントに送信して、ユーザー名とパスワードを要求します。上記の例では、「VXNlcm5hbWU6」は単語「ユーザー名」の BASE64 エンコード テキストであり、「UGFzc3dvcmQ6」は単語「パスワード」の BASE64 エンコード テキストです。クライアントは、ユーザー名とパスワードも BASE64 エンコーディングを使用して送信します。上記の例の「adlxdkej」は BASE64 でエンコードされたユーザー名であり、「lkujsefxlj」は BASE64 でエンコードされたパスワードです。

于 2012-09-26T03:03:46.640 に答える