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