Вопрос-Ответ

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.

Сценарий Python следующий.

import smtplib

fromaddr = 'user_me@gmail.com'
toaddrs = 'user_you@gmail.com'
msg = 'Why,Oh why!'
username = 'user_me@gmail.com'
password = 'pwd'
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
Переведено автоматически
Ответ 1
def send_email(user, pwd, recipient, subject, body):
import smtplib

FROM = user
TO = recipient if isinstance(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

smtpserver = smtplib.SMTP_SSL('smtp.gmail.com', 465)
smtpserver.ehlo()
smtpserver.login(YOUR_GOOGLE_EMAIL, YOUR_GOOGLE_EMAIL_APP_PASSWORD)

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

# Close the connection
smtpserver.close()

Для получения дополнительной информации см. Пароли аутентификации Google.

СТАРЫЙ ответ: (Это больше не работает) Я столкнулся с аналогичной проблемой и наткнулся на этот вопрос. Я получил ошибку аутентификации SMTP, но мое имя пользователя / пароль были правильными. Вот что это исправило. Я прочитал это:

https://support.google.com/accounts/answer/6010255

В двух словах, Google не разрешает вам входить в систему через smtplib, потому что он пометил этот тип входа как "менее безопасный", поэтому все, что вам нужно сделать, это перейти по этой ссылке, когда вы входите в свою учетную запись Google, и разрешить доступ:

https://www.google.com/settings/security/lesssecureapps

Как только это будет установлено (см. Мой Скриншот ниже), это должно сработать.

введите описание изображения здесь

Теперь работает вход в систему:

smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('me@gmail.com', 'me_pass')

Ответ после изменения:

(235, '2.7.0 Accepted')

Предыдущий ответ:

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, это потому, что местоположение неизвестно. Перейдите по этой ссылке.:

https://accounts.google.com/DisplayUnlockCaptcha

Нажмите продолжить, и у вас должно быть 10 минут на регистрацию вашего нового приложения. Итак, сделайте еще одну попытку входа в систему, и это должно сработать.

ОБНОВЛЕНИЕ: похоже, это работает не сразу, возможно, вы застряли на некоторое время, получая эту ошибку в smptlib:

235 == 'Authentication successful'
503 == 'Error: already authenticated'

В сообщении говорится, что для входа в систему необходимо использовать браузер:

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

Ответ 4

Это работает

Создайте пароль для приложения Gmail!

После того, как вы создадите это, создайте файл с именем sendgmail.py

Затем добавьте этот код:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
# Created By : Jeromie Kirchoff
# Created Date: Mon Aug 02 17:46:00 PDT 2018
# =============================================================================
# Imports
# =============================================================================
import smtplib

# =============================================================================
# SET EMAIL LOGIN REQUIREMENTS
# =============================================================================
gmail_user = 'THEFROM@gmail.com'
gmail_app_password = 'YOUR-GOOGLE-APPLICATION-PASSWORD!!!!'

# =============================================================================
# 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")

email_text = """\
From: %s
To: %s
Subject: %s

%s
"""
% (sent_from, ", ".join(sent_to), sent_subject, sent_body)

# =============================================================================
# SEND EMAIL OR DIE TRYING!!!
# Details: http://www.samlogic.net/articles/smtp-commands-reference.htm
# =============================================================================

try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_app_password)
server.sendmail(sent_from, sent_to, email_text)
server.close()

print('Email sent!')
except Exception as exception:
print("Error: %s!\n\n" % exception)

Итак, в случае успеха вы увидите изображение, подобное этому:

Я тестировал, отправляя электронное письмо от и самому себе.

Успешно отправлено электронное письмо.


Примечание: В моей учетной записи включена двухэтапная проверка. Пароль приложения работает с этим! (для настройки smtp в gmail необходимо перейти на https://support.google.com/accounts/answer/185833?hl=en и выполнить следующие действия)


Этот параметр недоступен для учетных записей с включенной двухэтапной проверкой. Для таких учетных записей требуется пароль для конкретного приложения для менее безопасного доступа к приложениям.


Менее безопасный доступ к приложениям... Этот параметр недоступен для учетных записей с включенной двухэтапной проверкой.

Разъяснение

Перейдите к https://myaccount.google.com/apppasswords и создайте пароль приложения, как указано выше.

https://myaccount.google.com/apppasswords

python