Хостинг

Коды подтверждения не приходят на почту: лимит отправки писем на хостинге

Эдгар Косулин 7 мин чтения

Серия «Хостинг без магии» · часть 15 из 15

Содержание

28 сентября клиент написал в поддержку: на его сервисе пользователи регистрируются, а коды подтверждения не приходят на почту. В тексте ошибки сервер упоминал 18 писем в час, и клиент попросил поднять лимит хотя бы до 30. Меньше чем через полчаса мы подняли его до 60 писем в час на каждый ящик. Лимит при этом был не 18, а 5.

28 октября тот же клиент упёрся в лимит снова. Попросил 200 писем в час и спросил, насколько вообще можно увеличить: сервис собирается перейти на вход по одноразовым кодам, и писем станет намного больше.

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

Почему хостинг не отправляет письма без спроса

На хостинге Siteko приём почты работает сразу, а исходящая отправка по умолчанию выключена. Это касается и писем из скриптов сайта (PHP-функция mail()), и писем с почтовых ящиков по SMTP. На платных тарифах отправку включает поддержка по запросу, на тестовом хостинге её нет совсем.

Причина в соседях по серверу. Сайты на сервере хостинга отправляют почту через общий почтовый сервер и общий IP-адрес. Если один из них взломают и через него пойдёт спам, адрес попадёт в чёрные списки, и письма остальных сайтов начнут отклонять или класть в спам. Сайту, которому отправка не нужна, незачем иметь такую возможность. А у того, кому нужна, лимит работает как предохранитель: даже со взломанного сайта уйдёт немного писем.

Два замка: разрешение и лимит в час

Отправку держат два отдельных замка.

Первый - разрешение на локальную отправку. Через него идут письма, которые сайт отдаёт серверу функцией mail() или программой sendmail. Пока разрешения нет, сервер отказывает с текстом Local mail sending is disabled.

Второй - лимит писем в час на каждый ящик-отправитель. Он считается по адресу, от имени которого уходит письмо, и действует и для SMTP, и для mail(). На этом в начале октября споткнулся другой клиент. Он забыл пароль от админки своего сайта и запросил восстановление, а вместо письма со ссылкой получил отказ «rejected by the local scanning code» со строкой Sender rate overlimit. Разрешение на mail() у сайта было, но письмо уходило с адреса ящика, у которого стоял минимальный лимит. Поэтому, когда поддержка включает отправку, она открывает оба замка.

Лимит в панели искать не стоит. В документации ispmanager написано, что поле «Количество отправляемых писем в час» есть в карточке почтового ящика. На виртуальном хостинге клиент его не видит: поле доступно только администратору сервера. В сентябре на этом споткнулся и наш бот поддержки: дважды отправил клиента искать это поле. Оператор извинился за путаницу, а в инструкции бота мы записали этот факт отдельно, поверх документации.

Как читать ошибку Sender rate overlimit

Когда ящик упирается в лимит, сервер отклоняет письмо с такой строкой:

Sender rate overlimit - 18.5 / 1h

Число здесь не лимит, а скорость отправки в пересчёте на час, которую намерил сервер. Выдаёт его дробная часть: лимит в 18,5 письма никто не ставит. Клиент из первого случая решил, что ему разрешено 18 писем в час, а разрешено было 5. Сервис отправил больше, и сервер это посчитал.

Сервер отклоняет письма сверх лимита, пока скорость не снизится, а потом пропускает снова. Те письма, которые он уже отклонил, сами не уйдут. Человек, не дождавшийся кода, нажмёт «отправить ещё раз», и это ещё одно письмо.

Где искать эту строку, зависит от способа отправки. Если сайт отправляет по SMTP, сервер отказывает сразу, и ошибку получает почтовая библиотека сайта: её видно в логе приложения, если сайт его пишет. Если через mail(), отказ приходит отдельным письмом «Mail failure - rejected by the local scanning code» на адрес отправителя. Так его и увидел клиент со сбросом пароля.

Почему об отказе никто не узнаёт

Письмо об отказе уходит на адрес отправителя. Часто это no-reply@, в который никто не заглядывает, или адрес, которого вообще нет. Тогда сайт молчит, код не приходит, а владелец узнаёт о проблеме от пользователей.

Есть здесь и наша часть. Если сайт подставляет в отправителя внешний адрес, например ящик владельца на Яндексе, отказ уходит туда со служебного адреса нашего сервера. До 4 октября у этого адреса не было SPF-записи, и крупные почтовики такие уведомления отклоняли. 4 октября мы её добавили. Gmail с тех пор уведомления принимает, Яндекс нет: ему нужна DKIM-подпись на самих уведомлениях, а её мы пока не сделали. Что такое SPF и DKIM и почему чужой адрес в отправителе вредит доставке, подробно в статье «Письма с сайта пропадают».

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

Сколько писем нужно входу по коду

С регистрацией по коду писем немного: человек регистрируется один раз. При входе по коду письмо уходит каждый раз, когда кто-то входит, и ещё одно на каждый повторный запрос.

Считать нужно самый загруженный час, а не сутки: лимит часовой, а люди приходят неравномерно. Допустим, в сервис входят 1 000 раз в сутки. В среднем это 42 входа в час, и кажется, что 60 писем хватит. Но если вечером за час приходит десятая часть суточных входов, это уже 100 писем.

К ним добавьте повторные запросы кода, регистрации, сбросы пароля и уведомления, если они уходят с того же ящика. Лимит считается на ящик, и все эти письма делят его между собой.

Если коды хранятся в базе, пиковый час видно одним запросом. Таблица и поля у вас будут свои:

SELECT DATE_FORMAT(created_at, '%Y-%m-%d %H:00') AS hour, COUNT(*) AS codes
FROM login_codes
GROUP BY hour
ORDER BY codes DESC
LIMIT 5;

Возьмите самый большой час за последний месяц и добавьте запас на рост.

Боты расходуют тот же лимит

Форма входа по коду - удобная цель для ботов. Каждый запрос кода - письмо, и если форма отправляет его без ограничений, бот за несколько минут израсходует лимит ящика. Живые люди в этот час кода не получат. Хуже, если форма отправляет код на любой введённый адрес: тогда через ваш сайт можно слать письма чужим людям, они жмут «Это спам», и страдает репутация вашего домена и нашего сервера.

Поэтому у формы должен быть свой предел, ниже почтового:

  • пауза перед повторной отправкой, например минута, с таймером на кнопке;
  • не больше нескольких кодов на один адрес в час;
  • ограничение запросов с одного IP;
  • капча, когда запросов с адреса или IP становится подозрительно много;
  • при входе код уходит только на адрес, который есть в базе, а ответ формы одинаковый в обоих случаях, чтобы по нему нельзя было проверить, кто у вас зарегистрирован.

Тогда лимит хостинга остаётся страховкой на случай, если что-то всё-таки пошло не так.

Сколько можно отправить с хостинга

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

Во второй раз мы сняли ограничение совсем, через 12 минут после обращения. Лимит нужен против спама. Если сайт в порядке, письма запрашивают сами пользователи и антиспам-правила не нарушаются, лимит только мешает. Но у такого решения есть цена: если сайт взломают, предохранителя на почте не будет. Поэтому защиту формы от ботов лучше сделать до того, как просить лимит побольше.

Рассылки новостей и акций - отдельная история. По правилам хостинга массовой считается рассылка больше 100 однородных писем в сутки. Она допустима, только если получатели дали согласие, в каждом письме указаны отправитель и способ отписаться, а у домена настроены SPF и DKIM. Регулярные рассылки больше 1 000 писем в сутки отправляйте через специализированные сервисы: доставляемость с хостинга мы не гарантируем.

Если писем с кодами становятся тысячи в сутки, стоит посмотреть и на сервис транзакционных писем. Сайт подключается к нему по SMTP или API, а сервис показывает по каждому письму, принял ли его сервер получателя. Это удобнее, чем искать отказы в ящике. Чем такие письма отличаются от рассылок и почему их не смешивают, тоже есть в статье «Письма с сайта пропадают». Какие ещё ограничения прячутся за словом «безлимитный», разбирали отдельно.

Как это устроено на Siteko. Приём почты на хостинге работает сразу. Отправку на платном тарифе включает поддержка: напишите из личного кабинета, с какого адреса сайт отправляет письма, что это за письма и сколько их уходит в самый загруженный час. Обычно ставим 60 писем в час на ящик, нужно больше - поднимем под задачу. Сами лимит вы не меняете, в панели этого поля нет. На тестовом хостинге отправки нет, её можно включить после перехода на платный тариф. Как завести ящик и подключить к нему почтовую программу, рассказано в справке, а зачем почте свой домен, в статье «Почта на своём домене».

Если коды уже не доходят, начните с трёх вещей. Найдите в логе сайта или в ящике отправителя строку Sender rate overlimit или Local mail sending is disabled. Посчитайте письма в пиковый час. Проверьте, есть ли у формы свой предел. С этими ответами поддержке не придётся переспрашивать.

Серия

Хостинг без магии

  1. 1. Как выбрать хостинг для сайта и не купить себе вторую работу
  2. 2. Виртуальный хостинг, VPS или облако: что действительно нужно вашему сайту
  3. 3. Гигабайты ничего не решают: как читать характеристики тарифа хостинга
  4. 4. «Безлимитный» хостинг: что заканчивается раньше дискового пространства
  5. 5. Домен подключён, а сайт не открывается: DNS без мистики
  6. 6. HTTPS включён, а браузер всё равно ругается: SSL без паники
  7. 7. Письма с сайта пропадают: SMTP, SPF, DKIM и DMARC на пальцах
  8. 8. Современный PHP-хостинг: зачем Laravel и Symfony нужны SSH, Composer, Node.js, cron и отдельная public-директория
  9. 9. Деплой без FTP на виртуальном хостинге: Git, Composer и безопасный откат
  10. 10. Ошибка 500 после загрузки сайта: где искать причину до обращения в поддержку
  11. 11. Сайт тормозит на хостинге: виноват тариф, код, база или внешний сервис
  12. 12. Бэкап есть, восстановить нельзя: проверяем резервные копии до аварии
  13. 13. Переезд на другой хостинг без потери сайта, писем и заказов
  14. 14. Когда виртуальный хостинг стал тесен: пора на VPS или ещё можно остаться
  15. 15. Коды подтверждения не приходят на почту: лимит отправки писем на хостинге

Почта

Поделиться: Telegram ВКонтакте

Новые статьи и разборы — в канале Siteko: Telegram MAX

Подписчикам: +30 дней к пробному хостингу, клиентам: +150 ₽ на баланс

Пошаговые инструкции по нашим услугам — в базе знаний

Ещё по теме

Хостинг 5 мин чтения

PHP2Shell: как мы закрывали уязвимость PHP на хостинге

Две критические уязвимости PHP, CVE-2026-109618 и CVE-2026-109619: какие версии затронуты, как закрыть дыру на хостинге и VDS и почему phpinfo может показывать старую версию.

Хостинг 9 мин чтения

Корпоративная почта: где её держать и сколько ящиков нужно на самом деле

Где держать корпоративную почту (на хостинге вместе с сайтом или в почтовом сервисе), сколько ящиков нужно на самом деле, кому принадлежат ящики сотрудников и при чём тут новый закон о цифровых почтовых ящиках.

«Почта на своём домене», часть 2

Хостинг 8 мин чтения

Почта на своём домене: что это такое и что нужно, чтобы она работала

Что такое доменная почта и зачем адрес вида info@site.ru, что должно совпасть в DNS, чтобы письма ходили, что ломает почту при переезде домена и как перенести ящики без потерь.

«Почта на своём домене», часть 1