web-dev-qa-db-ja.com

GmailはPythonからのログイン試行をアプリ固有のパスワードでブロックします

Pythonのsmtplibを使用してGoogleアカウントからメールを送信しようとしていますが、エラーが発生し、今はちょっと困っています。 Googleは次のように応答します:Please log in via your web browser and then try again. Learn more at https://support.google.com/mail/answer/78754

アカウントでは2要素認証が有効になっているため、ログインにアプリ固有のパスワードを使用しています。私の理解では、これは安全性の低いアプリの設定を有効にしなくても機能するはずですよね。問題なくテストしている間、私は別のアカウントで同じことをしてきましたが、適切なアカウントの認証情報を取得しましたが、認証を受け入れません。

Python Gmail APIをOAuthで使用するために用意されていることは承知していますが、可能であれば、パッケージを追加して多くを書き直したくありません。 「安全性の低いアプリ」設定も有効にしたいのですが、どちらも設定せずにこれを機能させる方法はありますか?

違いがある場合は、ここに私がメールを送信するために使用するコードを示します。前述のように、これは別のアカウントで問題なく機能していたため、実際に関連性があるかどうかはわかりません。

def send_mail(to_address, subject, body):
    smtp_user = "[email protected]"
    smtp_password = "MyAppPasswordFromGoogle"
    server = "smtp.gmail.com"
    port = 587

    msg = MIMEMultipart("alternative")
    msg["Subject"] = subject
    msg["From"] = smtp_user
    msg["To"] = to_address
    msg.attach(MIMEText(body, "html"))
    s = smtplib.SMTP(server, port)
    s.connect(server, port)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(smtp_user, smtp_password)
    s.sendmail(smtp_user, to_address, msg.as_string())
    s.quit()

編集:2つのアカウントには興味深い違いがあります: https://myaccount.google.com/lesssecureapps で、私の古い(機能している)アカウントは「この設定は、どちらも2FAを使用していて、両方のドメインで強制されている場合でも、新しい要素は「この設定はドメイン管理者によって管理されています」と表示されます。したがって、ドメイン管理者が変更する必要がある設定があると思いますが、どの設定になるかわかりません。

15
Christian

私はあなたのケースを正確に複製しようとしました(2要素認証が有効になっているアカウントで)。アプリパスワードを作成した後、コードで使用しました。

とにかく、私はあなたの問題はこれだと思います:

s = smtplib.SMTP(server, port)
s.connect(server, port)

接続を2回実行します。

で試す

s = smtplib.SMTP()
s.connect(server, port)

またはこれだけ

s = smtplib.SMTP(server, port)

コード全体:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


smtp_user = '[email protected]'
smtp_password = 'my16charactersAppPassword'
server = 'smtp.gmail.com'
port = 587
msg = MIMEMultipart("alternative")
msg["Subject"] = 'Why,Oh why!'
msg["From"] = smtp_user
msg["To"] = "[email protected]"
msg.attach(MIMEText('\nsent via python', 'plain'))
s = smtplib.SMTP(server, port)
s.ehlo()
s.starttls()
s.login(smtp_user, smtp_password)
s.sendmail(smtp_user, "[email protected]", msg.as_string())
s.quit()
4
Davide Patti

シンプルに見えますが、 安全性の低いアプリを許可する が有効になっていることを確認してください。

3
bboynton97

IMAPを有効にしているかどうかを知りたい(SMTPはIMAPとは関係がないという事実にもかかわらず)...

これは、多くの異なるソリューションを含む古いリストです- Gmail SMTPサーバーを介してC#でメールを送信

0
V-Mark