まず、gmail の SMTP サーバーにアクセスできるのは、何らかの形式の認証を使用したクライアントとしてのみです。推奨される方法は oauth を使用することです。詳しくはこちらのページとこちらのページをご覧ください。したがって、この問題を乗り越えたとしても、コードは機能しません。
ただし、ログインする前に接続を拒否する理由は説明できません.
最も可能性が高いのは、gmail のルーターが IP の動的ホワイトリストを維持していることです。他の種類の適切にログインした接続を使用すると、ホワイトリストに N 秒間追加されます。つまり、ポート 587 への接続が許可されます。そうしないと、拒否されます。これは従来の SMTP-after-IMAP 認証スキームに似ていますが、IMAP に限定されず、SMTP サービスの代わりにルーターで処理されます (おそらく、コストを下げるか、DoS 攻撃をより困難にするため)。
これをテストする良い方法があります: Outlook、Mail.app、または gmail への接続方法を認識し、SMTP を使用して gmail 経由でメールを送信するその他のメール クライアントを構成します。メール クライアントでメールを取得してから数秒後にスクリプトを実行します。それが機能する場合、それが問題です。その場合の修正は、メール クライアントが行うのと同じ種類の接続とログイン (IMAP? Web サービス?) を行うことです。
または、もちろん、基本原則から作業する代わりに、上記のリンクで Google が提供するサンプル コードを使用することもできます。
(もちろん、gmail はサーバーからサーバーへの SMTP 接続も受け入れる必要がありますが、そのための別の認証スキームを簡単に使用できます。サーバーではなく、クライアントからサーバーへの接続を試みていると想定しています。サーバーへ。)
もう 1 つの可能性は、あなたがある種のブラックリストに登録されていることです。たとえば、Gmail はあなたの IP がスパマーのものであると認識しています。これは動的な場合もあります。ポート 587 に接続するが、適切に oauth を行わない人は、次の N 秒間ブロックされる可能性があります。とにかく、これも簡単にテストできます。Outlook や Mail.app などを構成します。これが問題になると、メールを送信することもできなくなります。
3 番目の可能性として、ポート 587 への接続が許可されておらず、Google が代わりにポート 565 または 25 を使用することを望んでいます。
デバッグを容易にするために、smtplib を使用する代わりに、ソケットを作成して接続するだけのさらに単純なスクリプトを作成することを検討してください。
import socket
s = socket.socket()
s.connect(('smtp.gmail.com', 587))
または、さらに単純に、コマンド ラインから netcat を実行するだけです。
nc smtp.gmail.com 587
副次的な質問に答えるには:
Python を通常のブラウザとして機能させるための回避策はありますか?
それは問題ではありません。通常のブラウザは SMTP 接続を行いません。gmail.com からダウンロードした Javascript コードを使用して Web サービス接続を行います。
もちろん、Python は Web サービス接続も作成できます。
また、「通常のブラウザー」(User-Agent、Referer などのヘッダーなど) のように好きなように動作することもできますが、それはおそらく関係ありません。gmail Web サービス API がパブリックであり、自分自身を認証する方法についての明確で公開されたルール (この場合、ルールに記載されていることを実行するだけです)、または非公開であり、軍拡競争に参加したくない場合を除き、彼らが使用している保護をだまそうとするべきではありません.
いずれにせよ、この場合はpublicであることがわかっているので、推測する必要はありません。