it-swarm.com.ru

smtplib и gmail - проблемы со скриптом Python

Вот мой сценарий:

#!/usr/bin/python

import smtplib
msg = 'Hello world.'

server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587
server.ehlo()
server.starttls()
server.ehlo()
server.login('[email protected]','mypass')
server.sendmail('[email protected]','[email protected]',msg)
server.close()

Я просто пытаюсь отправить письмо с моей учетной записи Gmail. Скрипт использует starttls из-за требования gmail. Я пробовал это на двух веб-хостах, 1and1 и webfaction. 1and1 выдает ошибку «Отказано в соединении», и веб-фракция не сообщает об ошибке, а просто не отправляет электронное письмо. Я не вижу ничего плохого в сценарии, поэтому я думаю, что это может быть связано с веб-хостами. Любые мысли и комментарии будут высоко оценены.

Правка: я включил режим отладки. Судя по выводу, сообщение было успешно отправлено ... Я просто никогда его не получаю.

send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
send: 'STARTTLS\r\n'
reply: '220 2.0.0 Ready to start TLS\r\n'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
AUTH LOGIN PLAIN
ENHANCEDSTATUSCODES
PIPELINING
send: 'AUTH PLAIN *****\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: 'mail FROM:<[email protected]> size=12\r\n'
reply: '250 2.1.0 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48
send: 'rcpt TO:<[email protected]>\r\n'
reply: '250 2.1.5 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48
send: 'data\r\n'
reply: '354  Go ahead 4sm652580yxq.48\r\n'
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48
data: (354, 'Go ahead 4sm652580yxq.48')
send: 'Hello world.\r\n.\r\n'
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48')
25
spencewah

Я думаю, что SMTP-сервер GMail выполняет обратный поиск DNS по IP-адресу, с которого вы подключаетесь, и отклоняет соединение, если не удается найти домен. Это сделано для того, чтобы спаммер не использовал свой SMTP-сервер в качестве открытого ретранслятора.

7
Martin Cote

Вы пытались создать правильное сообщение?

from email.MIMEText import MIMEText

msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."
8
Toni Ruža

Я не знаю, если OP все еще заботится об этом ответе, но, оказавшись здесь, чтобы решить аналогичную проблему, надеюсь, кто-то еще может найти это полезным. Оказывается, Google изменил способ использования SMTP-сервера. Вы хотите проверить пару вещей:

  1. То, что вы используете тот же адрес, который вы использовали для аутентификации, в качестве адреса «от». Если я не ошибаюсь, раньше вы могли поместить практически все, что хотели, в поле from, но в целях безопасности многие узлы SMTP-хостов (включая google) теперь ограничивают это адресом, который аутентифицировался с ними.

  2. Разрешить доступ к вашей учетной записи через «менее безопасные приложения» (читай: приложения, от которых мы не получаем доход). Для этого войдите в свою учетную запись и перейдите по ссылке: https://www.google.com/settings/security/lesssecureapps

  3. Используйте порт 587 с TLS. Не совсем уверен, почему, но я никогда не мог заставить порт 465 играть в Ниццу.

Надеюсь, это поможет кому-то еще.

7
krayzk

Некоторая самореклама здесь, но я чувствую себя на уважительной основе.

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

import yagmail
yag = yagmail.SMTP('[email protected]')
yag.send('[email protected]', subject = None, contents = 'Hello')

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

yagmail.SMTP('[email protected]').send('[email protected]', None, 'Hello world.')

Приятно то, что я предлагаю использовать брелок для хранения вашего пароля, чтобы у вас никогда не было риска, что люди увидят ваш пароль в вашем скрипте.

Вы можете настроить это, запустив один раз в вашем интерпретаторе:

import yagmail
yagmail.register("[email protected]", "mypassword")

и выход. Тогда вы можете просто использовать:

import yagmail
yagmail.SMTP("[email protected]") # without password

Если вы добавляете .yagmail с «[email protected]» в свой домашний каталог, то вы можете просто сделать: yagmail.SMTP(), но сейчас это довольно бессмысленно.

Предупреждение: если вы серьезно относитесь к отправке большого количества сообщений, лучше настройте OAuth2, yagmail может помочь с этим.

yagmail.SMTP("[email protected]", oauth2_file="/path/to/save/creds.json")

При первом запуске он проведет вас через процесс получения учетных данных OAuth2 и сохранит их в файле, чтобы в следующий раз вам ничего не нужно было делать с ним. Вы подозреваете, что кто-то нашел ваши учетные данные? У них будут ограниченные разрешения, но вам лучше аннулировать их учетные данные через Gmail. 

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

6
PascalVKooten

избавьте себя от головной боли и используйте это:

http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt

Python SMTPHandler с GMail

Ss

4
silent254

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

2
fucx

Я перешел по вышеупомянутой ссылке, и у меня было 3 разных адреса для отправки, но я получил три электронных письма на один и тот же адрес, и это был №3 адрес. 

http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt

import logging
import logging.handlers

class TlsSMTPHandler(logging.handlers.SMTPHandler):
def emit(self, record):
    """
    Emit a record.

    Format the record and send it to the specified addressees.
    """
    try:
        import smtplib
        import string # for tls add this line
        try:
            from email.utils import formatdate
        except ImportError:
            formatdate = self.date_time
        port = self.mailport
        if not port:
            port = smtplib.SMTP_PORT
        smtp = smtplib.SMTP(self.mailhost, port)
        msg = self.format(record)
        msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
                        self.fromaddr,
                        string.join(self.toaddrs, ","),
                        self.getSubject(record),
                        formatdate(), msg)
        if self.username:
            smtp.ehlo() # for tls add this line
            smtp.starttls() # for tls add this line
            smtp.ehlo() # for tls add this line
            smtp.login(self.username, self.password)
        smtp.sendmail(self.fromaddr, self.toaddrs, msg)
        smtp.quit()
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        self.handleError(record)

logger = logging.getLogger()

gm = TlsSMTPHandler(("smtp.gmail.com", 587), '[email protected]', ['[email protected]', '[email protected]', '[email protected]'], 'unable to find Error!', ('[email protected]', 'mypassword'))
gm.setLevel(logging.ERROR)

logger.addHandler(gm)

try:
    1/0
except:
    logger.exception('It NO work for me!!-')
1
Jim

Это работает

'''
Created on 2017/11/27

@author: devuser
'''

import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

FROM_ADDRESS = '[email protected]'
MY_PASSWORD = 'password'
TO_ADDRESS = '[email protected]'
BCC = '[email protected]'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


if __== '__main__':

    to_addr = TO_ADDRESS
    subject = SUBJECT
    body = BODY

    msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
    send(FROM_ADDRESS, to_addr, msg)

https://qiita.com/okhrn/items/630a87ce1a44778bbeb1

0
Ryosuke Hujisawa