web-dev-qa-db-ja.com

Python)を使用してSMTP(SSLまたはTLS)に接続します

Gmail SMTPメールサーバーに接続して、与えられたスケルトンコードで概説されているタスクを実行しようとしています。 socketsの使用のみが許可されています(smtplibは許可されていません)。必要なもの:HELOコマンド、MAIL FROMRCPT TO、およびDATAを送信します。

同様の問題が投稿されたケースはたくさんありますが、適切な回答が得られていません。例: Python --Simple Mail Client でのトランスポート層セキュリティの実装

プログラムは、ポートsmtp.gmail.comを介して587に接続する必要があります。私は2つの異なるアプローチを取りました:

  1. 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. SSLの使用:

    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コマンドに何か問題がありますか?

13
user1287523

SSLを使用する場合は、ポート587ではなくポート465に接続する必要があります。STARTTLSを使用する場合でも、ssl.wrap_socketを使用する必要があります。後で、具体的には、220応答を受信した後でSTARTTLSコマンド。 STARTTLSを実行した後、サーバーはHELOの前に発生したことをすべて忘れるはずなので、もう一度STARTTLSを実行することになっています。

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

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

9
Aleksi Torhamo

STARTTLSの後、

clientSocket = ssl.wrap_socket(clientSocket)
0
ChadJiang