Gmail SMTPメールサーバーに接続して、与えられたスケルトンコードで概説されているタスクを実行しようとしています。 socket
sの使用のみが許可されています(smtplib
は許可されていません)。必要なもの:HELO
コマンド、MAIL FROM
、RCPT TO
、およびDATA
を送信します。
同様の問題が投稿されたケースはたくさんありますが、適切な回答が得られていません。例: Python --Simple Mail Client でのトランスポート層セキュリティの実装
プログラムは、ポートsmtp.gmail.com
を介して587
に接続する必要があります。私は2つの異なるアプローチを取りました:
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.'
SSLの使用:
clientSocketSSL = ssl.wrap_socket(clientSocket)
次に、clientSocketSSL
がclientSocket
のすべてのインスタンスを置き換えます。 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
コマンドに何か問題がありますか?
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をサポートしています。
STARTTLS
の後、
clientSocket = ssl.wrap_socket(clientSocket)