Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумПочта и рассылки

Отправка встала на 465, на 587 идёт. Разобрались, в чём разница

Ольга Ветрова
Ольга Ветрова
Участник
сообщений 590
с сен
1 мая, 08:52первое сообщение

Переносила отправку на новый сервер. На старом всё работало через 465, на новом соединение просто висит и отваливается по таймауту. На 587 то же самое письмо уходит за секунду.

Хостер говорит «у нас всё открыто». Что смотреть?

Михаил Дроботов
Михаил Дроботов
Участник
сообщений 615
с сен
8 октября, 11:09#2

Первым делом проверьте, что порт вообще доступен. Гадать тут нечего.

проверка двух портов
проверка двух портов

Если 465 висит именно так, дело не в вашем коде. Порт режется по дороге.

десять лет в поддержке, всё видел
Ольга Ветрова
Ольга Ветрова
Участник
сообщений 590
с сен
15 марта, 14:26#3
Михаил Дроботов: дело не в вашем коде

Так и есть, висит. Но почему тогда «у нас всё открыто»?

rawsocket
rawsocket
Ветеран
сообщений 2290
с фев
22 августа, 17:43#4

Потому что открыто у них, а режет чаще всего облачный провайдер или сеть на выходе. И ещё: 465 и 587 это две разные схемы. Один и тот же порядок с разными номерами тут не работает.

На 465 шифрование поднимается сразу, до первого слова. На 587 сначала идёт открытый разговор, клиент говорит EHLO, сервер перечисляет возможности, среди них STARTTLS, и только после команды обмен переходит в шифрование.

Два порядка отправки
Два порядка отправки

Практический вывод: если библиотека настроена на «шифрование сразу», а вы её направили на 587, она тоже повиснет. И наоборот.

читаю байты, а потом уже документацию
Ольга Ветрова
Ольга Ветрова
Участник
сообщений 590
с сен
1 января, 08:00#5

Вот тут я и напутала. В коде стоял SMTP_SSL, я просто поменяла номер порта.

rawsocket
rawsocket
Ветеран
сообщений 2290
с фев
8 июня, 11:17#6

Да, это классика. Для 587 нужен обычный SMTP плюс starttls().

import smtplib
s = smtplib.SMTP("smtp.example.net", 587, timeout=20)
s.ehlo()
s.starttls()
s.ehlo()
s.login(user, password)
s.sendmail(ot, komu, pismo)
s.quit()

Обратите внимание на второй ehlo() после starttls(). Его забывают, и потом сервер отвечает, что метод входа неизвестен.

читаю байты, а потом уже документацию
Пётр Мельник
Пётр Мельник
Участник
сообщений 810
с июл
15 ноября, 14:34#7

Добавлю сюда табличку, чтобы не искать по теме.

ПортКогда шифрованиеКто обычно ходит
25по согласиюи, часто безпочтовые серверы между собой
465сразу, до разговораклиент, если сеть его пропускает
587после команды STARTTLSклиент, самый живучий вариант
сначала замер, потом мнение
Ольга Ветрова
Ольга Ветрова
Участник
сообщений 590
с сен
22 апреля, 17:51#8

Заработало. Оставила 587, второй ehlo добавила. Спасибо всем.

hardline
hardline
Знаток
сообщений 970
с июн
1 сентября, 08:08#9

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

Ольга Ветрова
Ольга Ветрова
Участник
сообщений 590
с сен
8 февраля, 11:25#10

Пока с одного сервера, но идею запомню.