SMTP работает в Linux, но не на Mac [дубликат]

Это все в «волшебном» синтаксисе вызова метода:

object.property();

Когда вы получаете свойство из объекта и вызываете его за один раз, объект будет контекстом для метода , Если вы вызываете тот же метод, но в отдельных шагах, контекст представляет собой глобальную область (окно):

var f = object.property;
f();

Когда вы получаете ссылку на метод, он больше не привязан к объекту, это просто ссылка на простую функцию. То же самое происходит, когда вы получаете ссылку на использование в качестве обратного вызова:

this.saveNextLevelData(this.setAll);

Здесь вы привязываете контекст к функции:

this.saveNextLevelData(this.setAll.bind(this));

Если вы используете jQuery вы должны использовать метод $.proxy, а bind не поддерживается во всех браузерах:

this.saveNextLevelData($.proxy(this.setAll, this));
249
задан Ciro Santilli 新疆改造中心 六四事件 法轮功 21 December 2015 в 15:07
поделиться

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"
  ])
184
ответ дан MattH 21 August 2018 в 00:34
поделиться
  • 1
    вызывая server.sendmail (fromaddr, toaddrs, msg) второй параметр, toaddrs должен быть списком, toaddrs = ['user_me@gmail.com'] – Massimo Fazzolari 20 August 2013 в 07:59
  • 2
    По состоянию на август 2014 года это теперь вызывает smtplib.SMTPAuthenticationError: (534, '5.7.9 Требуется пароль для приложения. – anon58192932 27 August 2014 в 19:06
  • 3
    Для меня, однако, мне пришлось включить пароль «app» для входа в систему с помощью учетной записи @google для отправки электронной почты через python: support.google.com/accounts/answer/… – anon58192932 27 August 2014 в 19:13
  • 4
    Наконец, как лучше всего использовать этот синтаксис для отправки сразу нескольких адресов? – anon58192932 27 August 2014 в 19:15
  • 5
    Вот ссылка о том, как отправить несколько человек: stackoverflow.com/questions/8856117/… – anon58192932 27 August 2014 в 19:43
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'
260
ответ дан Brad Solomon 21 August 2018 в 00:34
поделиться
  • 1
    Очень хороший образец спасибо. Думаю, я заметил, что если я хочу использовать SSL-соединение, мне пришлось удалить server.starttls () – Dowlers 14 April 2014 в 21:13
  • 2
    Больше не работает: smtplib.SMTPAuthenticationError: (534, '5.7.14 & lt; accounts.google.com/… ... Войдите в систему через веб-браузер и\n5.7.14 затем повторите попытку.\n5.7.14 Подробнее читайте в\n5.7.14 support.google.com/mail/bin/answer.py?answer=78754 ... Затем я получил почту из Google, что была попытка подозрительного подключения. – royskatt 13 February 2015 в 18:00
  • 3
    @royskatt - все, что вам нужно сделать, это создать пароль приложения и использовать его вместо пароля учетной записи. Создайте пароль для приложения здесь: security.google.com/settings/security/apppasswords – Jared 15 April 2015 в 01:14
  • 4
    @royskatt: Я только что получил исправление проблемы, с которой вы столкнулись. У Google есть параметр, позволяющий доступ для менее безопасных приложений, которые вам нужно включить, чтобы включить его. вы можете получить там: Google - & gt; моя учетная запись - & gt; Войти & amp; безопасность - & GT; Связанные приложения и amp; сайты - & GT; прокрутите вниз, и вы найдете «Разрешить менее безопасные приложения», – shaleen mohan 7 August 2015 в 21:16
  • 5
    Если ваш gmail защищен двухфакторной аутентификацией, вы должны сначала сгенерировать пароль конкретного приложения - & gt; затем используйте этот пароль приложения в приведенном выше примере кода (это очень важно, потому что тогда вы не записываете свой пароль нигде в открытом виде, и вы можете в любое время отменить пароль приложения). – Trevor Boyd Smith 12 November 2016 в 17:46

Вы можете найти его здесь: 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())
14
ответ дан illright 21 August 2018 в 00:34
поделиться
  • 1
    плюс 1, потому что лучше создать MIME, чем жестко кодировать собственную строку формата. Требуется ли MIMEMultipart для простого текстового сообщения? Или также верно следующее: stackoverflow.com/a/6270987/895245 – Ciro Santilli 新疆改造中心 六四事件 法轮功 22 December 2015 в 13:25

This Works

Создайте пароль APP 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)

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

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

Примечание. У меня включена двухэтапная аутентификация в моей учетной записи. Пароль приложения работает с этим!

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

0
ответ дан JayRizzo 21 August 2018 в 00:34
поделиться

отличный ответ от @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()
2
ответ дан juan Isaza 21 August 2018 в 00:34
поделиться

Похоже на проблему старого smtplib. В python2.7 все работает отлично.

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

1
ответ дан mega.venik 21 August 2018 в 00:34
поделиться

Не имеет прямого отношения, но все же стоит отметить, что мой пакет пытается сделать отправку сообщений 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 или pip , доступный как для Python 2, так и для 3.

11
ответ дан PascalVKooten 21 August 2018 в 00:34
поделиться

Я столкнулся с подобной проблемой и наткнулся на этот вопрос. Я получил ошибку аутентификации SMTP, но мое имя пользователя / пароль было правильным. Вот что исправлено. Я читал это:

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

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

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

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

enter image description here [/g3]

Вход в систему работает:

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 минут для регистрации вашего нового приложения , Итак, приступайте к повторной попытке входа в систему, и он должен работать.

UPDATE: похоже, что это не работает сразу же, вы можете застрять на некоторое время при получении этой ошибки в 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». Из-за пользовательского опыта может потребоваться до часа, чтобы изменение произошло. Затем повторите процедуру входа.

114
ответ дан radtek 21 August 2018 в 00:34
поделиться
  • 1
    ДА СПАСИБО ! Случилось при использовании фляжки – Giannis 25 December 2014 в 17:12
  • 2
    спасибо man only problem for me: accounts.google.com/DisplayUnlockCaptcha – Limitless isa 27 June 2015 в 10:56
  • 3
    Кроме того, пожалуйста, оставляйте полчаса до часа для изменения настроек. Я создал новую учетную запись, отключил всю добавленную безопасность и по-прежнему получил ту же ошибку. Примерно через час все сработало. – jkgeyti 29 March 2016 в 14:05
  • 4
    Включение менее безопасных приложений невозможно, если у вас есть «2-ступенчатая верификация», включен. Самый лучший и наиболее безопасный вариант - это включить «apppassword». security.google.com/settings/security/apppasswords , как уже было предложено, и работает как шарм – Omiod 3 July 2016 в 07:59
  • 5
    Когда я следую ссылке apppasswords, все мои учетные записи Google получают «& quot ;, параметр, который вы ищете, недоступен для вашей учетной записи & quot; ошибка. – Suzanne 30 June 2017 в 20:04

Вы с ООП?

#!/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')
11
ответ дан Ricky Wilson 21 August 2018 в 00:34
поделиться
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()
-2
ответ дан Sam Divya Kumar 21 August 2018 в 00:34
поделиться
  • 1
    простой код для отправки почты через gmail с использованием кода python. от адреса - ваш gmailID, а addressaddress - это идентификатор почты, который отправляет почту. – Sam Divya Kumar 4 December 2015 в 15:16
    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
-1
ответ дан Shyam Gupta 21 August 2018 в 00:34
поделиться
  • 1
    Я отправляю простой код, который будет выполнять отправку почты из учетной записи Gmail. Если вам нужна какая-либо информация, дайте мне знать. Надеюсь, что код поможет всем пользователям. – Shyam Gupta 16 June 2016 в 19:34

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

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

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

Вот пример, демонстрирующий это:

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

1
ответ дан Tim Richardson 21 August 2018 в 00:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: