smtplib: один код ведет себя по-разному

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Добрый день. Не могу понять, где затык вышел. В скрипте две функции отправки мыла через smtplib используют одинаковый код. Но в первом случае скрипт шлет письмо, а во втором получаю ошибку
smtplib.SMTPServerDisconnected: please run connect() first.
Python:
with smtplib.SMTP(smtp_host, smtp_port) as server:
    for _ in range(5):
        try:
            server.ehlo()
            try:
                server.starttls()
                server.ehlo()
            except smtplib.SMTPNotSupportedError:
                pass
            server.login(smtp_user, smtp_password)
            server.sendmail(
                msg['From'],
                [msg['To']],
                msg.as_string()
            )
            isSuccess = True
            break
        except Exception as ex:
            print(ex)
            time.sleep(0.5)

Пробовал smtp аккаунты менять - одно и то же. В первой функции всё хорошо, во второй ошибка. Подскажите, пожалуйста, куда копать? Спасибо.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Python:
server = smtplib.SMTP()
server.connect(f'{smtp_host}:{smtp_port}')
server.set_debuglevel(1)
for _ in range(S_TOTAL_SMTP_ERR):
    try:
        r = server.ehlo()
        print(r)
        try:
            server.starttls()
            server.ehlo()
        except smtplib.SMTPNotSupportedError:
            pass
        server.login(smtp_user, smtp_password)
        server.sendmail(
            msg['From'],
            [msg['To']],
            msg.as_string()
        )
        isSuccess = True
        break
    except Exception as ex:
        ex_txt = str(ex)
        time.sleep(0.5)
server.quit()

при использовании такой конструкции появилась новая ошибка socket.gaierror: [Errno 11004] getaddrinfo failed. хоть что-то новое за два дня)
что передаете в f'{smtp_host}:{smtp_port}' ?
 
  • Мне нравится
Реакции: robisho

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
возможно вы разрываете соединение и новое не создаете
в ошибке это и сказано...
в вашем коде по выходу из with объект smtplib.SMTP высвобождается, то есть повторно его использовать не получиться...
 
Последнее редактирование:

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
возможно вы разрываете соединение и новое не создаете
в ошибке это и сказано...
в вашем коде по выходу из with объект smtplib.SMTP высвобождается, то есть повторно его использовать не получиться...
вот в этом-то и проблема. в одной функции этот код работает как нужно. а во второй падает. smtp серверы используются одни и те же.
добавил перед первым try в цикле server.set_debuglevel(1). в первом случае получаю
Код:
send: 'ehlo [192.168.56.1]\r\n'
reply: b'250-dmta1006-jc.im.kddi.ne.jp\r\n'
reply: b'250-AUTH=LOGIN PLAIN\r\n'
reply: b'250-AUTH LOGIN PLAIN\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-DSN\r\n'
reply: b'250-8BITMIME\r\n'
reply: b'250 SIZE 26214400\r\n'
и дальше все сервисные сообщения
, а во втором только
Код:
send: 'ehlo [192.168.56.1]\r\n'
send: 'ehlo [192.168.56.1]\r\n'
send: 'ehlo [192.168.56.1]\r\n'
send: 'ehlo [192.168.56.1]\r\n'
send: 'ehlo [192.168.56.1]\r\n'
send: 'QUIT\r\n'
и сообщение об ошибке smtplib.SMTPServerDisconnected: please run connect() first.
голову сломал уже. самое противное, что этот код несколько дней назад работал, как нужно, в обоих случаях. я, конечно, дорабатывал скрипт, дописывая код, но в этот кусок с отправкой через smtplib вообще не лез.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
советуют не использовать with
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
советуют не использовать with
Python:
server = smtplib.SMTP()
server.connect(f'{smtp_host}:{smtp_port}')
server.set_debuglevel(1)
for _ in range(S_TOTAL_SMTP_ERR):
    try:
        r = server.ehlo()
        print(r)
        try:
            server.starttls()
            server.ehlo()
        except smtplib.SMTPNotSupportedError:
            pass
        server.login(smtp_user, smtp_password)
        server.sendmail(
            msg['From'],
            [msg['To']],
            msg.as_string()
        )
        isSuccess = True
        break
    except Exception as ex:
        ex_txt = str(ex)
        time.sleep(0.5)
server.quit()

при использовании такой конструкции появилась новая ошибка socket.gaierror: [Errno 11004] getaddrinfo failed. хоть что-то новое за два дня)
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
что передаете в f'{smtp_host}:{smtp_port}' ?
спасибо огромное, вы заставили меня проверить все переменные и я нашел свою криворукость) теперь работает) готов уже был головой в монитор биться! но, как обычно, дело было не в бобине)))
 
  • Мне нравится
Реакции: regnor

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
наблюдаю такую картину: если smtp вида smtp.jcom.zaq.ne.jp:587, то срабатывает с конструкцией with и без нее, а если вида 45.32.185.184:587 - то без with опять выдает ошибку smtplib.SMTPServerDisconnected: please run connect() first. оказывается, для такого вида нужно по-другому коннектиться: вместо
Python:
server.connect(f'{smtp_host}:{smtp_port}')
нужно
Python:
server.connect(smtp_host, smtp_port)
.
 

Форум IT Специалистов