Отправка + -200 писем с помощью функции php mail () в цикле

Примечание: стоит отметить, что функции mail() не подходит для большие объемы электронной почты в петлю. Эта функция открывает и закрывает SMTP сокет для каждого письма, которого нет очень эффективно. источник: руководство по PHP

что такое большие объемы? 100 или 1000?? Могу ли я безопасно сделать цикл 200 раз без особых проблем? (Я не могу установить грушу)

5 ответов


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

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

раньше я отправлял около 50 000 писем в рассылку подписчиков, используя почтовую функцию PHP и сервер RedHat с установленным Exim. Это займет 4-6 часов с пользовательским скриптом, который у меня был запущен. В нем не было ничего эффективного, но он делал свою работу.


около 5-6 лет назад (в последний раз, когда я смотрел в такого рода вещи), я видел список рассылки программного обеспечения в PHP, используя mail() функция, которая отправляла сотни сообщений каждый раз, когда вызывалась функция" Отправить в список рассылки". По мере того, как клиент добавлял все больше и больше имен (во многие тысячи, последний раз я проверял), система становилась довольно медленной. В конце концов, они купили стороннее программное обеспечение для обработки больших объемов рассылки и размещены на сервере отдельно от своего веб-сервера, чтобы избежать замедление их веб-сайта.

как указывали другие, вы должны очистить это с вашим хостинг-провайдером, прежде чем начать отправлять пакеты более нескольких десятков одновременно - каждая хостинговая компания будет иметь свои собственные политики, и если это нарушает TOS, они могут отключить вас/отключить ваш хостинг. В идеале, передача почты большого объема должна осуществляться с сервера именно для этой цели. Таким образом, если он зависает или зависает, вам не придется беспокоиться о влиянии на других приложения.

Если вы действительно отправляете очень большое количество почты, есть коммерческие пакеты, которые также будут управлять списком рассылки,они будут управлять отказами и отказами, версиями писем, они будут делать текст против HTML-почты и т. д... исследуйте некоторые из них, если вы серьезно.

Я знаю, что это не отвечает на главный вопрос " альтернативы ?- но это лучшее, что я могу сделать, - я их не видел! Единственное, о чем я могу думать, это ручное управление SMTP-соединениями в PHP (не уверен, насколько это возможно) или использование для этого какой-либо внешней библиотеки.


чем меньше пакет, тем лучше, но это зависит от вашей настройки (скорость сервера, сеть и т. д.). Вероятно, я бы использовал работу cron и делал небольшие партии. Вы должны предположить, что mail () может зависнуть и остановить обработку, что делает важным пометить каждую строку в списке как отправленную по электронной почте.

например, если вы можете делать 1 электронную почту в секунду или немного быстрее, то я бы сделал пакет из 50, в cron-задании, которое выполняется каждую минуту. Используйте SQL-запрос, чтобы получить 50 лучших результатов, которые еще не отправлены, так как вы не можете быть уверены, с чего вы начинаете.


Если вы хотите отправлять письма до 1000 пользователей, просто передайте их в массив, а затем поместите mail() в цикле.

единственное, что нужно помнить, это просто положить set_time_limit(0) на первой строке и поставить flush() на последней строке, и вы можете отправить столько писем, сколько хотите.


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

Далее, вы можете избежать переполнения почтовой системы и оставаться ниже радара любых "ботов Жнеца", просто добавив вызов sleep() каждые 10 сообщений или около того. Сделайте его регулируемым, чтобы вы могли ограничить как количество итераций, так и задержку сна. Eitehr в качестве параметров или через конфигурационный файл (последний может быть опрошен в верхней части цикла, чтобы внести коррективы на лету.