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()
Ответ 2
Мне просто интересно, если вы включили IMAP (несмотря на то, что SMTP не имеет никакого отношения к IMAP)...
Вот старый список с множеством различных решений - Отправка электронной почты через SMTP-сервер Gmail с помощью С#
Ответ 3
Кажется простым, но убедитесь, что Разрешить менее безопасные приложения.