Как отправить электронное письмо с 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()

12 ответов


вы должны сказать 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"
  ])

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, но мое имя пользователя / пропуск было правильным. Вот что исправило это. Я прочел следующее:--6-->

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

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

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

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

enter image description here

логин теперь работает:

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" еще раз. Из пользовательского опыта может потребоваться до часа для изменения. Затем повторите попытку входа в систему.


вы можете найти его здесь: http://jayrambhia.com/blog/send-emails-using-python

smtp_host = 'smtp.gmail.com'
smtp_port = 587
server = smtplib.SMTP()
server.connect(smtp_host,smtp_port)
server.ehlo()
server.starttls()
server.login(user,passw)
fromaddr = raw_input('Send mail by the name of: ')
tolist = raw_input('To: ').split()
sub = raw_input('Subject: ')

msg = email.MIMEMultipart.MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = email.Utils.COMMASPACE.join(tolist)
msg['Subject'] = sub  
msg.attach(MIMEText(raw_input('Body: ')))
msg.attach(MIMEText('\nsent via python', 'plain'))
server.sendmail(user,tolist,msg.as_string())

ты согласен с ОП?

#!/usr/bin/env python


import smtplib

class Gmail(object):
    def __init__(self, email, password):
        self.email = email
        self.password = password
        self.server = 'smtp.gmail.com'
        self.port = 587
        session = smtplib.SMTP(self.server, self.port)        
        session.ehlo()
        session.starttls()
        session.ehlo
        session.login(self.email, self.password)
        self.session = session

    def send_message(self, subject, body):
        ''' This must be removed '''
        headers = [
            "From: " + self.email,
            "Subject: " + subject,
            "To: " + self.email,
            "MIME-Version: 1.0",
           "Content-Type: text/html"]
        headers = "\r\n".join(headers)
        self.session.sendmail(
            self.email,
            self.email,
            headers + "\r\n\r\n" + body)


gm = Gmail('Your Email', 'Password')

gm.send_message('Subject', 'Message')

не напрямую, но все же стоит отметить, что мой пакет пытается сделать отправку сообщений gmail очень быстрой и безболезненной. Он также пытается сохранить список ошибок и пытается немедленно указать на решение.

для этого буквально нужен только этот код, чтобы сделать именно то, что вы написали:

import yagmail
yag = yagmail.SMTP('user_me@gmail.com')
yag.send('user_you@gmail.com', 'Why,Oh why!')

или один вкладыш:

yagmail.SMTP('user_me@gmail.com').send('user_you@gmail.com', 'Why,Oh why!')

для пакета / установки, пожалуйста, посмотрите на git или Пип, доступной для оба Python 2 и 3.


отличный ответ от @David, вот для Python 3 без общей попытки-кроме:

def send_email(user, password, recipient, subject, body):

    gmail_user = user
    gmail_pwd = password
    FROM = user
    TO = recipient if type(recipient) is 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)

    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.ehlo()
    server.starttls()
    server.login(gmail_user, gmail_pwd)
    server.sendmail(FROM, TO, message)
    server.close()

похоже, проблема старого smtplib. В python2.7 все работает нормально.

обновление: да server.ehlo() также может помочь.


теперь есть API gmail, который позволяет отправлять электронную почту, читать электронную почту и создавать черновики через REST. В отличие от SMTP-вызовов, он не блокирует, что может быть хорошо для потоковых веб-серверов, отправляющих электронную почту в потоке запроса (например, веб-серверы python). API также довольно мощный.

  • конечно, электронная почта должна быть передана в очередь без веб-сервера, но приятно иметь варианты.

проще всего настроить, если у вас есть администратор Google Apps права на домен, потому что тогда вы можете дать общее разрешение своему клиенту. В противном случае вам придется возиться с аутентификацией и разрешением OAuth.

вот суть, демонстрирующая это:

https://gist.github.com/timrichardson/1154e29174926e462b7a


Это Работает

создать пароль приложения 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 = "Where are all my Robot Women at?"
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)

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

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

Successful email sent.

Примечание: у меня 2-Этап Проверки включается на моем счет. App Password работает с этим!

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

Less secure app access... This setting is not available for accounts with 2-Step Verification enabled.


    import smtplib

    fromadd='from@gmail.com'
    toadd='send@gmail.com'

    msg='''hi,how r u'''
    username='abc@gmail.com'
    passwd='password'

    try:
        server = smtplib.SMTP('smtp.gmail.com:587')
        server.ehlo()
        server.starttls()
        server.login(username,passwd)

        server.sendmail(fromadd,toadd,msg)
        print("Mail Send Successfully")
        server.quit()

   except:
        print("Error:unable to send mail")

   NOTE:https://www.google.com/settings/security/lesssecureapps that                                                         should be enabled

import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login("fromaddress", "password")
msg = "HI!"
server.sendmail("fromaddress", "receiveraddress", msg)
server.quit()