Позвольте мне объяснить, что я имею в виду в моем названии. Скажем, например, я создаю небольшую систему электронной коммерции для одного веб-магазина / каталога. У клиентов есть возможность выбирать, хотят ли они получать информационные бюллетени или нет. Если они это сделают, то логически думать, что информационные бюллетени должны быть отправлены немедленно, когда информационный бюллетень сформирован и готов.
Конечно, это можно сделать простым, выбирая все указанные пользователем электронные письма из базы данных и используя цикл для отправки почты через mail
функцию в цикле, но проблема в том, что мне сказали, что это плохая практика. Простым и не дешевым способом будет покупка интернет-сервиса для рассылки информационных бюллетеней, но зачем нужен программист php?
Поэтому я спрашиваю вас, скромные товарищи, что с вашей точки зрения может быть решением?
NB! Вероятно, вы мне не поверите, но это не для спама.
UPD: Возможно, я объяснил, что неправильно, но я хотел бы услышать решение не только о правильном способе отправки почты, но и о правильной доставке. Поскольку не всегда отправляется всякая почтовая рассылка.
Конечно, есть некоторые причины, которые непредсказуемы. Например, где-то на пути что-то сломалось, и почта была потеряна (если такая вещь возможна), но есть и другие причины, на которые влияют, возможно, сервер или в другом месте. Может быть, нужно поговорить с хостером об этом?
Используя что-то вроде Swiftmailer , PHPmailer или Zend_mail – намного лучшие альтернативы использованию простой функции mail()
поскольку ее можно легко помечать как спам. Есть слишком много проблем с почтовой рассылкой, которые нужно учитывать – большинство из них решаются с использованием уже существующих библиотек.
Просто несколько проблем, которые необходимо решить при отправке массовых писем вручную:
Использование неправильных заголовков.
Обработка возвращенных сообщений
Вывод из сценария из-за притока писем.
Редактировать:
Вероятно, это не тот ответ, который вы ищете. Но я настоятельно рекомендую вам инвестировать в нечто вроде Campaign Monitor или Mail Chimp . Поскольку этот процесс не для образовательных целей, а коммерческий, я бы настоятельно предложил вышеупомянутые услуги.
Я задал вопрос, но прежде чем ответить, позвольте мне перейти к обычным соображениям. Во-первых, я настоятельно рекомендую использовать такую услугу, как Mail Chimp. Это бесплатно для небольших рабочих мест и имеет много интересных функций, таких как отслеживание количества сообщений электронной почты, количество кликов, количество неудачных при доставке … Подумайте, сделайте одолжение себе и не изобретайте велосипед.
Теперь, чтобы узнать цель, давайте перейдем к ответу на ваш вопрос.
Первое, что нужно иметь в виду, – обеспечить, чтобы ваш список был хорошим. Как это сделать? Ну, для хорошего списка, я имею в виду действительный список адресов электронной почты. Просто разместите информационную форму на своей странице, имея только одно поле (возможно, captcha, но я не думаю, что это необходимо).
Сохраните все входные данные в таблицу базы данных, при этом поле «isValid» установлено как ложное по умолчанию и любое уникальное хеш. Затем вы отправляете письмо с подтверждением, со ссылкой (с хешем сгенерированным) для подтверждения, которое при нажатии делает флаг «isValid» истинным и ссылку для отмены (ВСЕГДА отправьте эту ссылку отмены во всех ваших письмах).
Это то, что делают магазины и серьезные сайты. Все, что заставляет ваших клиентов / посетителей получать плохую моральную практику (то есть спам).
Во-вторых, используйте хороший сервис хостинга. Слишком дешевые услуги обычно используются спамерами, а основные почтовые службы – в черном списке всех, исходящих от этих адресов.
Я знаю, вы должны спросить себя, не ошибаюсь ли вы на свой вопрос. Нет, я этого не делаю, технические вещи приходят сейчас.
Почему плохая практика ставит почтовую функцию внутри цикла for? Просто. Поскольку почта функции выполняет несколько операций каждый раз, когда она вызывается. PHP, откроет соединение с почтовым сервером, отправит данные для анализа, попросит отправить, зарегистрировать статус почтового сервера, закрыть соединение, статус пузыря, чтобы закончить вызываемую вами почтовую функцию и очистить память.
Это накладные расходы на соединение – это проблема, которую люди называют плохой практикой с точки зрения программирования. Использование решения SMTP / IMAP лучше, потому что оно оптимизирует этот процесс.
Немного о технических вопросах, я вижу ваши вопросы о доставке. Ну, как я уже сказал, у вас есть несколько способов обеспечить, чтобы список ваших писем был достаточно хорошим. Но что, если возникает другое исключение, например, наличие сбоев в отключении + отсутствие провала на клиентском сервере?
Ну, PHP сохраняет статус «запрашивать почтовый сервер для отправки, отправленного почтового сервера». Если почтовый сервер отправил ваше сообщение, PHP вернет true. Период.
Если клиент не смог получить или отклонить, вы должны проверить заголовки электронной почты и статус электронной почты. Они находятся на сервере электронной почты. Еще раз, эти данные могут быть доступны с расширениями SMTP / POP / IMAP, а не с функцией почты.
Если вы хотите пойти дальше, прочитайте документы IMAP, найдите классы электронной почты (phpclasses.org, груша и pecl – лучшие места для изучения).
Дополнительный совет: RFC могут быть полезны, так как вы можете лучше понять, какие почтовые серверы действительно разговаривают друг с другом.
Дополнительный совет 2: Получите доступ к gmail или ymail и проверьте отправленные / полученные сообщения на их «полную версию» и прочитайте его заголовки. Вы можете многому научиться с ними.
Через аутентификацию SMTP: http://www.cyberciti.biz/tips/howto-php-send-email-via-smtp-authentication.html
Просто используйте PHP Mail и изучите IMF и как создать пользовательские заголовки, к которым вы можете присоединить четвертый параметр, exmaple следует
<?php // multiple recipients $to = 'aidan@example.com' . ', '; // note the comma $to .= 'wez@example.com'; // subject $subject = 'Birthday Reminders for August'; // message $message = ' <html> ... </html> '; // To send HTML mail, the Content-type header must be set $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; // Additional headers $headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n"; $headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n"; $headers .= 'Cc: birthdayarchive@example.com' . "\r\n"; $headers .= 'Bcc: birthdaycheck@example.com' . "\r\n"; // Mail it mail($to, $subject, $message, $headers); ?>
создать подсистему почтовой очереди, которая может включать такие таблицы, как mail_queue, mail_status, mail_attachments, mail_recipients и mail_templates и т. д. …
Вы можете рассмотреть PHPMailer http://phpmailer.worxware.com/index.php?pg=exampleasendmail
Вы можете добавить нескольких получателей и специальную функцию обратного вызова для обработки возвращаемых сообщений для каждой отправленной почты. (например, посетите ссылку)
Я не думаю, что при попытке получить сообщение об ошибке «отправка почты не удалась» с помощью php, за исключением того, что вы используете PHPMailer через SMTP и один раз в то время смотрите за любой возвращаемой формой сообщения, получателем которой является получатель вашей исходящей электронной почты.