Gmail блокирует попытку входа в систему с Python с конкретным паролем приложения

Я пытаюсь отправить электронное письмо из учетной записи Google, используя Python smtplib, но получаю сообщение об ошибке, и теперь я немного растерялся. Google отвечает на следующее: Please log in via your web browser and then try again. Learn more at https://support.google.com/mail/answer/78754.

У учетной записи включена учетная запись с двумя факторами, поэтому я использую специальный пароль для своего входа. Насколько я понимаю, тогда это должно работать без включения настроек для менее безопасных приложений, не так ли? Я делал то же самое с другой учетной записью во время тестирования без проблем, но теперь я, наконец, получил учетные данные для правильной учетной записи и там не будет принимать аутентификацию.

Я знаю, что есть API Python Gmail, который можно использовать с 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()

Изменить: Существует интересное различие между двумя учетными записями: на https://myaccount.google.com/lesssecureapps мой старый (рабочий) говорит: "Этот параметр недоступен для учетных записей которые активируют двухфакторную аутентификацию", в то время как новый говорит, что "этот параметр управляется вашим администратором домена", хотя оба используют 2FA, а также принудительно в обоих доменах. Поэтому я предполагаю, что есть некоторые настройки, которые администратор домена должен изменить, но я не знаю, какой из них был бы.

Ответ 1

Я попытался реплицировать именно ваш случай (с учетной записью, в которой включена двухфакторная аутентификация). После создания моего пароля приложения я использовал его в коде.

В любом случае, я думаю, что ваша проблема такова:

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()