- Отправка почты средствами PHP
- Читают сейчас
- Редакторский дайджест
- Похожие публикации
- Как доставлять e-mail уведомления клиентам в условиях невозможности прописать обратную DNS зону
- Авторизация через ВКонтакте, Mail.ru и другие для самых начинающих — 1
- PHP mail под Windows
- Вопросы и ответы
- Не работает require_once, в чём причина?
- Как выводить через for, если в массиве одна строка, с ключом больше 0?
- Почему цикл не срабатывает еще раз?
- Как изменить значения массива на при совпадении с другим?
- Ошибка Fatal error: Call to a member function fetch_assoc(). Как исправить.
- Минуточку внимания
- Комментарии 19
- PHP mail под Windows
- Как тестировать отправку писем в PHP на Windows
- Установка почтовой заглушки для PHP в Windows
Отправка почты средствами PHP
Работая над проектом, мне пришлось создать специфичную «анкету соискателя» в котором надо была отправлять всю анкету на указные за ране e-mail адрес, и я сразу же вспомнил про PHP функцию mail().
Обязательные параметры:
- E-mail получателя
- Заголовок письма
- Текст письма
Необязательные параметры:
- Дополнительные заголовки письма
- Дополнительные параметры командной строки
Возвращаемое значение:
- true, если письмо было принято к доставке
- false, в противном случае.
Простейший пример
Перейдем к более сложному примеру
В начале мы определяем кому адресовано письмо, за это отвечает переменная &to, если же получателей несколько человек, то записываем через запятую адреса эл. почты.
Переменные $subject и $message, не буду описывать, это и так понятно.
В нашем примере переменная $headers состоит из 3-строк:
- В первой строчке ми определяем ты отправляемого письма-HTML и кодировку windows-1251.
- В 2-ом мы указываем от кого пришло письмо.
- В 3-ем указываем e-mail адрес, для ответа на письмо.
А теперь самое интересное отправка письма c вложением (attachment)
Читают сейчас
Редакторский дайджест
Присылаем лучшие статьи раз в месяц
Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.
Похожие публикации
Как доставлять e-mail уведомления клиентам в условиях невозможности прописать обратную DNS зону
Авторизация через ВКонтакте, Mail.ru и другие для самых начинающих — 1
PHP mail под Windows
Вопросы и ответы
Не работает require_once, в чём причина?
Как выводить через for, если в массиве одна строка, с ключом больше 0?
Почему цикл не срабатывает еще раз?
Как изменить значения массива на при совпадении с другим?
Ошибка Fatal error: Call to a member function fetch_assoc(). Как исправить.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут
Минуточку внимания
Комментарии 19
Серьезно? 2019 год на дворе. Скрывайте в черновик.
Это же в документации все есть.
UPD:
С телефона не заметил. Все вопросы к RigelGL
Приглашён
21 марта 2019 в 20:01 по приглашению пользователя RigelGL
Плюс еще cp1251.
Вы бы ещё показали, как echo() пользоваться… И ладно, если бы синтаксических ошибок в тексте и в самом коде не было.
[сарказм]
Отличная и полезная статья, а главное — актуальная для 2019го.
Реквестую статью про strtr и str_replace.
[/ссрказм]
«Неправильно ты, дядя Федор, бутерброд ешь»
Функция mail дергает локальный, для сервера на котором работает PHP-скрипт, MTA — а это потенциальный источник проблем:
- локальный MTA может отсутствовать
- локальный MTA может давно и прочно прописаться во всех blacklist-ах какие только бывают и администратор сервера может не торопиться его оттуда вытаскивать
- локальный MTA может упасть и администратор может забить на это на денек другой
- локальный MTA может вызывать у получателей серьезные сомнения относительно того, не СПАМ ли это
- mail, как написано в документации, норовит открывать и закрывать соединение с MTA при каждом вызове, что негативно сказывается на производительности
Мораль — используйте полноценный почтовый сервер и обращайтесь к нему через SMTP (для удобства есть соответствующие библиотеки, например PHPMailer)
Локальный MTA вполне можно настроить, чтобы он пересылал письма через другой сторонний сервер. Если отправка писем идёт прямо во время генерации страницы на севере, то локальный MTA правильнее. Меньше шансов получить тормоза из-за сетевых проблем на удаленном почтовом сервере.
Машина времени, однако (без обид). Но вы (автор) как то запоздали на пару лет.
Попробую сделать эту статью полезной для Хабросообщества, вот вам Code Review данного куска кода:
1. Двойные кавычки и лишние переменные
Все строки, которые не содержат управляющие символы \n\r или подстановки переменных, рекомендуется использовать одинарные кавычки. И лучше вынести в константы то, что не меняется в процессе выполнения кода.
2. Расположение и название файла
Тут есть ряд комментариев:
- Путь до файла лучше указывать с использованием магической переменной __DIR__
- Также лучше работать с абсолютным путем, использую функцию realpath()
- Переменную $filename не нужно задавать, можно получить ее из сформированного пути функцией basename($filepath)
3. Комментарии снизу
Комментарии в коде обычно оставляют либо на той же строке, если это //, либо над строкой, которую планируете прокомментировать.
4. Формирование многострочной переменной
Для улучшения читаемости кода, лучше не конкатинировать много строк, а использовать HEREDOC или NOWDOC:
5. Нет корректной обработки ошибокЕсли хоть одна функция поведет себя не так, как ожидается, то весь кусок кода непредсказуемо отработает.
Не информативная ошибка, тем более с какими-то непонятными цифрами 22. Рекомендуется выводить более доступный текст ошибки. Например «При чтении файла <$filepath>возникла ошибка.»
6. Чтение файлаЕсли понадобилось читать файл, но не обязательно использовать потоки, можно вытащить контент тем же самым file_get_contents.
7. Нет кавычекНе уверен, что этот код вообще отработает.
8. Удаление файла
Если это файл, который будет запускаться из cli, то еще может быть ок, но тоже не ясно зачем. А если этот скрипт будет запускаться через вебсервер, то скорее всего он отвалится по timeout.
9. Код оформлен не по PSR
P.S. Если что-то пропустил, то дополняйте, коллеги!
Это очень забавный комментарий. В стиле, я не знаю, «Вы тут представили телегу без лошади как средство передвижения. Чтобы сделать её более полезной для общества, вот мои замечания: колеса лучше перекрасить в чуть более розовый цвет, борта лучше сделать не из дерева, а из картона потому что красивше и вот еще на узорчиках лучше листики заменить на цветочки.»
Все эти замечания не делают код полезнее. Чтобы сделать его полезнее, его надо переписать, целиком. С использованием современных инструментов. О чем и говорили все предыдущие комментаторы.
Все что написано вверху — это мелкие придирки, половина из которых — это вкусовщина про цветочки. Какие кавычки использовать и применять ли хередок — это исключительно на вкус автора.
При этом построчная конкатенация является стандартом при составлении заголовков, поскольку упрощает отладку, позволяя произвольно комментировать отдельные заголовки. Плюс такой формат гарантирует использование строго определенных символов перевода строки, а не тех, что настроены в редакторе по умолчанию.
Корректная обработка ошибок не имеет ничего общего с добавлением проверок на каждый чих. И уж тем более с выплевыванием сообщений об ошибке прямо в браузер. Пользователю сайта нет ни малейшего интереса читать про файлы на сервере. Такого рода сообщения должны писаться в лог. И РНР с этим великолепно справляется сам, помогать ему не требуется.
Без обид, но чтобы сделать нормальный code review, надо сначала научиться кодить самому. Пока у вас получилось не code review, а cosmetic review. Ваш обзор не делает код лучше, он делает его чуть красивше и более подходящим под ваши субъективные вкусы.
Это очень забавный комментарий. В стиле, я не знаю, «Вы тут представили комментарии по телеге без лошади, которую представили как средство передвижения. И ваши комментарии по цвету колес и бортам из картона не делают из этой телеги средство передвижения. Да и узорчики из цветочков не всем подходят и это вкусовщина. Вместо добавления своих замечаний, я представлюсь Д’Артаньяном на белом коне и налью желчи. „
Все эти замечания не делают код полезнее.
Никто и не говорил, что код от моих замечаний станет полезнее. Это замечания, которые нужны для того, чтобы прочитавший в своих проектах так не писал.
При этом построчная конкатенация является стандартом при составлении заголовков, поскольку упрощает отладку, позволяя произвольно комментировать отдельные заголовки. Плюс такой формат гарантирует использование строго определенных символов перевода строки, а не тех, что настроены в редакторе по умолчанию.
Код нужно писать не так, чтобы программисту было удобно что-то закомментировать в процессе написания, а чтобы потом было проще прочитать и понять.
Без обид, но чтобы сделать нормальный code review, надо сначала научиться кодить самому. Пока у вас получилось не code review, а cosmetic review. Ваш обзор не делает код лучше, он делает его чуть красивее и более подходящим под ваши субъективные вкусы.
PHP mail под Windows
В этой статье я хочу рассказать об отправке почты из php скриптов под Windows.
Америку я, конечно, не открою, но надеюсь, что кому-то эта статья будет полезна или просто сэкономит время.
С точки зрения php программиста отправка почты выполняется с помощью стандартной функции mail() . И вот тут у многих начинающих разработчиков возникает проблема. Скрипт, прекрасно работающий на сервере хостера, выдает ошибки на локальном компьютере.
Обычно эти ошибки имеют примерно такое описание:
Warning: mail() [function.mail]: Failed to connect to mailserver at «localhost» port 25, verify your «SMTP» and «smtp_port» setting in php.ini or use ini_set() in E:\www\simplemail\mailer.php on line .
Дело в том, что функция mail сама по себе почту не отправляет, она просто вызывает программу sendmail, которая в дистрибутив web сервера и php интерпретатора не входит (и не должна).
Sendmail, в свою очередь, для отправки почты использует SMTP сервер.
Таким образом, чтобы php скрипт мог отправлять почту нужно установить и настроить sendmail и SMTP сервер.
Версию sendmail для Windows можно скачать здесь.
Установка и настройка выполняется в три этапа.
1) Распаковываем архив на тот же диск, где установлен php. Например, я создал папку C:\wamp\sendmail.
2) Вносим изменения в файл php.ini:
[mail function]
SMTP =
sendmail_from =
sendmail_path = «C:\wamp\sendmail\sendmail.exe -t»
Как видите, нужно только указать путь к sendmail чтобы php мог ее найти.
3) Настраиваем sendmail. Все настройки находятся в файле sendmail.ini (расположен в папке с sendmail).
Но перед тем как приступать к настройке пару слов об SMTP сервере. Вам совсем не обязательно устанавливать сервер на вашем компьютере. Многие почтовые сервисы предоставляют бесплатный доступ к своим серверам.
Ниже я покажу пример настройки sendmail для работы с SMTP сервером mail.ru, но, естественно, вы выбрать любой другой.
Итак, открываем sendmail.ini и устанавливаем следующие параметры:
smtp_server=smtp.mail.ru ; адрес SMTP сервера
smtp_port=25 ; порт SMTP сервера
default_domain=mail.ru ; домен по-умолчанию
error_logfile=error.log ; файл в который будет записываться лог ошибок
debug_logfile=debug.log ; очень полезная на этапе отладки опция. Протоколируются все операции, которые выполняет sendmail
auth_username=account_name@mail.ru ; имя вашего аккаунта
auth_password=account_password ; ваш пароль
; следующие три опции используются если перед авторизацией на SMTP сервере требуется авторизация на POP3 сервере
pop3_server=pop.mail.ru
pop3_username=account_name@mail.ru
pop3_password=account_password
; параметр для команды MAIL FROM
force_sender=account_name@mail.ru
Теперь не забудьте перезапустить web сервер, чтобы изменения вступили в силу.
Чтобы протестировать работу почты напишем простенький скрипт:
Он создает форму с тремя полями для ввода адреса, темы и содержания письма. Нажатие на кнопку «Отправить» отправит запрос этому же скрипту (строка 21).
Если данные введены, то будет вызвана функция mail (строка 13), которая и отправит письмо. В случае успешной отправки функция возвращает true, в противном случае — false.
Как видите, ничего сложного в настойке почты нет.
Как тестировать отправку писем в PHP на Windows
Отправка писем — это важная функция веб-сайта. Email может использоваться для подтверждения регистрации, восстановления пароля, отправки уведомления и пр. При написании своего веб-приложения, либо для целей отладки, может понадобиться проверка работы отправки писем на локальном компьютере.
Для отправки писем в PHP используется функция mail. Для успешной работы этой функции, интерпретатор PHP обращается к внешней почтовой программе и передаёт ей отправляемое письмо. Обычно это sendmail в Linux.
Как можно догадаться, это не очень применимо к Windows, и уж тем более к веб-серверу на локальном компьютере. Поэтому для тестирования функции отправки писем придумана почтовая заглушка.
Почтовая заглушка — это программа, которая подменяет роль программы для отправки писем — она принимает письмо от PHP, но не пытается его никуда отправить, а сохраняет на диск. В дальнейшем это письмо можно открыть и проверить корректность использования функции mail.
Установка почтовой заглушки для PHP в Windows
Я устанавливал веб-сервер по этой инструкции, если вы это делали другим способом, то замените пути до файлов на ваши.
В каталоге C:\Server\bin\ создайте новый каталог с названием Sendmail. Теперь в этом каталоге создайте файл sendmail.php со следующим содержимым:
Откройте конфигурационный файл PHP, он размещён здесь C:\Server\bin\PHP\php.ini. И добавьте туда одну строчку:
Сохраните файл и перезапустите сервер.
Отлично, теперь все отправленные письма будут сохраняться в каталоге C:\Server\bin\Sendmail\emails\
Для имитации отправки письма используйте следующий код:
Отправленное письмо сохранено в файл mail_2019-06-03_15-14-06_0.eml. Этот файл для правильного отображения нужно открыть почтовой программой.
Также его можно открыть любым текстовым редактором — там вы увидите заголовки почтового протокола и текст письма, в данном случае там будет: