How to send an email with Gmail as provider using Python?
Как отправить электронное письмо с помощью Gmail в качестве провайдера, используя Python?
Я пытаюсь отправить электронное письмо (Gmail) с помощью python, но я получаю следующую ошибку.
Traceback (most recent call last): File "emailSend.py", line 14, in <module> server.login(username,password) File "/usr/lib/python2.5/smtplib.py", line 554, in login raise SMTPException("SMTP AUTH extension not supported by server.") smtplib.SMTPException: SMTP AUTH extension not supported by server.
FROM = user TO = recipient ifisinstance(recipient, list) else [recipient] SUBJECT = subject TEXT = body
# Prepare actual message message = """From: %s\nTo: %s\nSubject: %s\n\n%s """ % (FROM, ", ".join(TO), SUBJECT, TEXT) try: server = smtplib.SMTP("smtp.gmail.com", 587) server.ehlo() server.starttls() server.login(user, pwd) server.sendmail(FROM, TO, message) server.close() print'successfully sent the mail' except: print"failed to send mail"
если вы хотите использовать порт 465, вам нужно создать SMTP_SSL объект:
# SMTP_SSL Example server_ssl = smtplib.SMTP_SSL("smtp.gmail.com", 465) server_ssl.ehlo() # optional, called by login() server_ssl.login(gmail_user, gmail_pwd) # ssl server doesn't support or need tls, so don't call server_ssl.starttls() server_ssl.sendmail(FROM, TO, message) #server_ssl.quit() server_ssl.close() print'successfully sent the mail'
Ответ 2
Вам нужно сказать, EHLO прежде чем просто перейти прямо в STARTTLS:
server = smtplib.SMTP('smtp.gmail.com:587') server.ehlo() server.starttls()
Также вам действительно следует создать From:, To: и Subject: заголовки сообщений, отделенные от тела сообщения пустой строкой и используемые CRLF в качестве маркеров EOL.
Например.
msg = "\r\n".join([ "From: user_me@gmail.com", "To: user_you@gmail.com", "Subject: Just a message", "", "Why, oh why" ])
Примечание:
Для того, чтобы это сработало, вам необходимо включить опцию "Разрешить менее безопасные приложения" в конфигурации вашей учетной записи gmail. В противном случае вы получите "критическое предупреждение системы безопасности", когда gmail обнаружит, что приложения, отличные от Google, пытаются войти в вашу учетную запись.
Ответ 3
По состоянию на 2024 год, это то, что работает:
Перейдите на страницу https://myaccount.google.com/security и убедитесь, что в вашей учетной записи включена двухэтапная проверка. Итак, для этого вы можете настроить приложение на своем телефоне, например Google Authenticator, authy и т.д..
После настройки "2-шаговой проверки" из раздела "Безопасность" снова перейдите к "2-шаговой проверке" и прокрутите вниз до "Пароли приложений".:
Теперь введите имя вашего приложения, и вам будет выдан пароль для вашего устройства.
Наконец, сохраните свой пароль в безопасном месте и вставьте свой адрес электронной почты и пароль в следующий скрипт:
import smtplib
YOUR_GOOGLE_EMAIL = '<you@gmail.com>'# The email you setup to send the email using app password YOUR_GOOGLE_EMAIL_APP_PASSWORD = '<your-app-password>'# The app password you generated
# Test send mail sent_from = YOUR_GOOGLE_EMAIL sent_to = sent_from # Send it to self (as test) email_text = 'This is a test' smtpserver.sendmail(sent_from, sent_to, email_text)
СТАРЫЙ ответ: (Это больше не работает) Я столкнулся с аналогичной проблемой и наткнулся на этот вопрос. Я получил ошибку аутентификации SMTP, но мое имя пользователя / пароль были правильными. Вот что это исправило. Я прочитал это:
В двух словах, Google не разрешает вам входить в систему через smtplib, потому что он пометил этот тип входа как "менее безопасный", поэтому все, что вам нужно сделать, это перейти по этой ссылке, когда вы входите в свою учетную запись Google, и разрешить доступ:
smtplib.SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted. Learn more at\n5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 g66sm2224117qgf.37 - gsmtp')
Все еще не работает? Если вы по-прежнему получаете ошибку SMTPAuthenticationError, но теперь код равен 534, это потому, что местоположение неизвестно. Перейдите по этой ссылке.:
Нажмите продолжить, и у вас должно быть 10 минут на регистрацию вашего нового приложения. Итак, сделайте еще одну попытку входа в систему, и это должно сработать.
ОБНОВЛЕНИЕ: похоже, это работает не сразу, возможно, вы застряли на некоторое время, получая эту ошибку в smptlib:
В сообщении говорится, что для входа в систему необходимо использовать браузер:
SMTPAuthenticationError: (534, '5.7.9 Please log in with your web browser and then try again. Learn more at\n5.7.9 https://support.google.com/mail/bin/answer.py?answer=78754 qo11sm4014232igb.17 - gsmtp')
После включения "lesssecureapps" сходите выпить кофе, вернитесь и попробуйте снова перейти по ссылке "DisplayUnlockCaptcha". Исходя из опыта пользователя, может потребоваться до часа, чтобы изменения вступили в силу. Затем повторите попытку входа в систему.
Многим из вас теперь также необходимо создать пароль приложения, выполнив шаги в разделе "Создание и использование паролей приложений" здесь: support.google.com/accounts/answer/185833
# ============================================================================= # SET THE INFO ABOUT THE SAID EMAIL # ============================================================================= sent_from = gmail_user sent_to = ['THE-TO@gmail.com', 'THE-TO@gmail.com'] sent_subject = "Hey Friends!" sent_body = ("Hey, what's up? friend!\n\n" "I hope you have been well!\n" "\n" "Cheers,\n" "Jay\n")
print('Email sent!') except Exception as exception: print("Error: %s!\n\n" % exception)
Итак, в случае успеха вы увидите изображение, подобное этому:
Я тестировал, отправляя электронное письмо от и самому себе.
Примечание: В моей учетной записи включена двухэтапная проверка. Пароль приложения работает с этим! (для настройки smtp в gmail необходимо перейти на https://support.google.com/accounts/answer/185833?hl=en и выполнить следующие действия)
Этот параметр недоступен для учетных записей с включенной двухэтапной проверкой. Для таких учетных записей требуется пароль для конкретного приложения для менее безопасного доступа к приложениям.