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
[email protected]
; имя вашего аккаунтаauth_password=account_password
; ваш пароль
; следующие три опции используются если перед авторизацией на SMTP сервере требуется авторизация на POP3 сервере
pop3_server=pop.mail.ru
pop3_username=account_name@mail. ru
pop3_password=account_password
; параметр для команды MAIL FROM[email protected]
hostname=mail.ru
Теперь не забудьте перезапустить web сервер, чтобы изменения вступили в силу.
Чтобы протестировать работу почты напишем простенький скрипт:
01 <html xmlns="http://www.w3.org/1999/xhtml"> 02 <head> 03 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 04 <title>Simple Mail</title> 05 </head> 06 <body> 07 <?php 08 $addr = $_POST['addr']; 09 $theme = $_POST['theme']; 10 $text = $_POST['text']; 11 if (isset($addr) && isset($theme) && isset($text) 12 && $addr != "" && $theme != "" && $text != "") { 13 if (mail($addr, $theme, $text, "From: [email protected]")) { 14 echo "<h4>Сообщение отправлено</h4>"; 15 } 16 else { 17 echo "<h4>При отправке сообщения возникла ошибка</h4>"; 18 } 19 } 20 ?> 21 <form action="mailer. php" method="post"> 22 <p> 23 <label for="addr">eMail:</label> 24 <input type="text" name="addr" size="30" /> 25 </p> 26 <p> 27 <label for="theme">Тема письма:</label> 28 <input type="text" name="theme" size="30" /> 29 </p> 30 <p> 31 <label for="text">Текст письма:</label> 32 <textarea rows="10" cols="20" name="text"></textarea> 33 </p> 34 <p> 35 <input type="submit" value="Отправить" /> 36 </p> 37 </form> 38 </body> 39 </html>
Он создает форму с тремя полями для ввода адреса, темы и содержания письма. Нажатие на кнопку «Отправить» отправит запрос этому же скрипту (строка 21).
Если данные введены, то будет вызвана функция mail (строка 13), которая и отправит письмо. В случае успешной отправки функция возвращает true, в противном случае — false.
Как видите, ничего сложного в настойке почты нет.
Удачи!
Источник: кросспостинг из моего блога – www.simplecoding.org.
не удалось подключиться к почтовому серверу через порт «localhost» 25 как исправить?
У вас не установлен SMTP шлюз для отправки email. Если xampp используете, нужно найти в php.ini
блок [mail function] и изменить примерно на такое:
SMTP=smtp.gmail.com smtp_port=587 sendmail_from = ВАШАПОЧТА[email protected] sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
И C:\xampp\sendmail\sendmail.ini нужно примерно такие настройки написать:
[sendmail] smtp_server=smtp.gmail.com smtp_port=587 error_logfile=error.log debug_logfile=debug.log auth_username=ВАШАПОЧТА[email protected] auth_password=ПАРОЛЬОТGMAIL force_sender=ВАШАПОЧТА[email protected]
и потом нужно будет перезагрузить xampp.
Еще нет желания заморачиваться с smtp, можно поставить php библиотеку для отправки email, в конфиге вписать данные от gmail. com и отправлять email с локального сайта и с хостинга.
https://github.com/PHPMailer/PHPMailer
Виталий Клемчук
3 years ago
Начало выдавать это, как решить
Обнаружена ошибка PHP
Сообщение: mail (): SMTP-ответ сервера: 530 5.7.0 Сначала необходимо выполнить команду STARTTLS. q29sm10359628ljc.8 — gsmtp
Имя файла: библиотеки / Email.php
Номер строки: 1902
Backtrace:
Файл: C: \ xampp1 \ htdocs \ kinomonster \ application \ library \ DX_Auth.php
Строка: 180
Функция: отправить
Файл: C: \ xampp1 \ htdocs \ kinomonster \ application \ library \ DX_Auth.php
Строка: 991
Функция: _email
Файл: C: \ xampp1 \ htdocs \ kinomonster \ application \ controllers \ Auth.php
Строка: 140
Функция: зарегистрировать
Файл: C: \ xampp1 \ htdocs \ kinomonster \ index.php
Строка: 315
Функция: require_once
student_bB50Cz3p
3 years ago
Попробуй раскомментровать(убрать ; ) extension=php_openssl в C:\xampp\php\php. ini
student_cX4p_FA9
3 years ago
Вылезла практически таже ошибкаОбнаружена ошибка PHP
Серьезность: Предупреждение
Сообщение: mail (): SMTP-ответ сервера: 530 5.7.0 Сначала необходимо выполнить команду STARTTLS. w22sm10204152ljd.42 — gsmtp
Имя файла: библиотеки / Email.php
Номер строки: 1902
Backtrace:
Файл: C: \ xampp1 \ htdocs \ kinomonster \ application \ library \ DX_Auth.php
Строка: 180
Функция: отправить
Файл: C: \ xampp1 \ htdocs \ kinomonster \ application \ library \ DX_Auth.php
Строка: 991
Функция: _email
Файл: C: \ xampp1 \ htdocs \ kinomonster \ application \ controllers \ Auth.php
Строка: 140
Функция: зарегистрировать
Файл: C: \ xampp1 \ htdocs \ kinomonster \ index.php
Строка: 315
Функция: require_once
student_bB50Cz3p
3 years ago
Такое можно попробовать написать, где задаются настройки подключения к gmail:
ssl://smtp.gmail.com
student_cX4p_FA9
3 years ago
student_bB50Cz3p
3 years ago
Кто нибудь ещё может мне помочь?
student_bB50Cz3p
3 years ago
PHPMailer не может создать экземпляр почтовой функции
от Lakshmi S Panicker | 20 ноября 2019 г.
Вы застряли с сообщением «PHPMailer не может создать экземпляр почтовой функции»?
PHPMailer помогает безопасно и легко отправлять электронные письма с веб-сервера. Однако часто возникают ошибки из-за неправильной настройки функции mail(), отсутствия локального почтового сервера и т.п.
В Bobcares мы часто получаем запросы на исправление этой ошибки в рамках наших служб управления сервером.
Сегодня давайте подробно рассмотрим эту ошибку и посмотрим, как наши инженеры службы поддержки легко исправляют PHPMailer.
Почему
PHPMailer не может создать экземпляр почтовой функции ?Как мы все знаем, PHPMailer — популярный код для отправки электронной почты с PHP. И многие проекты с открытым исходным кодом, такие как WordPress, Drupal и т. д., используют их.
PHPMailer автоматически проверяет адреса электронной почты и защищает от атак путем внедрения заголовков.
Разработчики часто предпочитают отправлять почту из своего кода. И mail() — единственная функция PHP, поддерживающая это.
Но иногда неправильная установка PHP не может правильно вызвать функцию mail(). Это вызовет ошибки функции почты.
Аналогично, в некоторых случаях отсутствие локального почтового сервера также вызывает эту ошибку.
Как исправить «PHPMailer не может создать экземпляр функции почты»?
До сих пор мы подробно обсуждали ошибку. Теперь давайте посмотрим на некоторые из его главных исправлений.
Существуют альтернативные способы легко устранить эту ошибку.
1. Использование SMTP для отправки электронной почты
Как мы уже говорили, если установка PHP не настроена для правильного вызова функции mail(), это вызовет ошибку.
Таким образом, в таких случаях лучше использовать isSMTP() и отправлять электронную почту напрямую через SMTP.
Это быстрее, безопаснее и проще в отладке, чем использование mail(). Это легко устранит ошибку.
2. Установите локальный почтовый сервер
Функция PHP mail() обычно отправляет почту через локальный почтовый сервер.
Таким образом, использование SMTP не устранит ошибку, если на локальном хосте не установлен почтовый сервер.
Поэтому необходимо установить локальный почтовый сервер. Например, мы можем установить PostFix на сервер с помощью приведенной ниже команды.
sudo apt-get install postfix
3. Другие решения
Функция PHP mail() работает с Sendmail 9Двоичный файл 0006 на платформах Linux, BSD и macOS.
Поэтому важно убедиться, что sendmail_path указывает на двоичный файл Sendmail, который обычно имеет вид /usr/sbin/sendmail в php.ini .
Точно так же иногда, когда мы пытаемся отправить большие электронные письма, он возвращает ошибку « Не удалось создать экземпляр почтовой функции » вместе с сообщением « Невозможно отправить сообщение: слишком большой » в журнале ошибок PHP.
Это означает, что агент по пересылке почты отказывается доставлять эти электронные письма.
Итак, нам нужно настроить MTA, чтобы разрешить вложения большего размера для устранения ошибки.
[Все еще испытываете трудности с исправлением ошибки PHPMailer? — Мы вам поможем.]
Заключение
Короче говоря, PHPMailer не смог создать экземпляр функции mailuration из-за неправильной настройки mail. функция, отсутствие локального почтового сервера и т.д. В сегодняшней статье мы подробно обсудили эту ошибку и увидели некоторые из основных исправлений, внесенных нашими инженерами службы поддержки.
ПРЕДОТВРАТИТЕ СБОЙ СЕРВЕРА!
Никогда больше не теряйте клиентов из-за низкой скорости сервера! Позвольте нам помочь вам.
Наши специалисты по серверам будут контролировать и обслуживать ваш сервер 24/7, чтобы он оставался молниеносно быстрым и безопасным.
НАЧАТЬ
var google_conversion_label = «owonCMyG5nEQ0aD71QM»;
Отправка почты не работает на php 7.
4 или выше — Wappler Generalandrea.falco
#1
Привет.
Я сменил версию php с 7.3 на 7.4 на сервере и перестала работать контактная форма с помощью «почтовика/отправить почту».
Не работает и с версией 8.0.
Чтобы использовать его, мне пришлось восстановить версию 7.3, указанную как «устаревшую».
Любая идея решить эту проблему?
Теодор
#2
Андреа Фалько
#3
Я уже активировал отладку.
Это ответы:
403 Запрещено
У вас нет прав доступа к /dmxConnect/api/contatti/contactform.php на этом сервере.
Кроме того, 400 неверный запрос произошла ошибка при попытке использовать ErrorDocument для обработки запроса.
500 — внутренняя ошибка сервера
Сервер обнаружил внутреннюю ошибку или неправильной конфигурации и не смог завершить ваш запрос.
Пожалуйста, свяжитесь с администратором сервера, чтобы сообщить время возникновения ошибки и обо всем, что вы могли бы сделать, что, возможно, вызвал ошибку.
Дополнительные сведения об этой ошибке могут быть доступны в журнале ошибок сервера.
И это ответ журнала сервера:
[клиент 79.24.41.57] ModSecurity: доступ запрещен с кодом 403 (фаза 3). Требуется совпадение «validateByteRange 0–31» с «ARGS:input1». [файл «/etc/httpd/conf/modsecurity.d/rules/comodo_free/30_Apps_OtherApps.conf»] [строка «6649»] [id «243420»] [rev «4»] [msg «COMODO WAF: уязвимость раскрытия информации в Eclipse Jetty до 9.2.9.v20150224 (CVE-2015-2080)||www.eumeda.net|F|2 »] [серьезность «CRITICAL»] [тег «CWAF»] [тег «OtherApps»] [имя хоста «www.eumeda.net»] [uri «/dmxConnect/api/contatti/contactform.php»] [unique_id «YuOS79- dhMjrST-OkXrcVgAAAAg», ссылка: https://www.eumeda.net/it/contatti_logged.php
s.alpaslan
#4
@andrea.falco
Можете ли вы повторить попытку с отключенным mod_security? (в настройках вашего хостинга)
andrea.falco
#5
Отключение mod_security на сервере останавливает проверку формы
Apple
#6
Просто для ясности, у вас здесь 2 проблемы
- Один из них mod_security один
- Другой выдает «500 Internal Server Error»
Внутренняя ошибка сервера 500, вероятно, вызвана отсутствием почтового расширения PHP. Вы можете включить его рядом с селектором PHP в панели управления хостингом. , хотя вряд ли это связано с проблемой, которую вы пытаетесь решить
andrea.falco
#7
Это не может быть проблемой отсутствия почтового расширения PHP, потому что оно работает на PHP 7. 3. Что-то касается обновленной безопасности, которая останавливает выполнение PHPMailer.php в dmxConnectLib
Apple
#8
Путь разрешения:
- В целях тестирования отключите mod_security
- Посмотрите, какая ошибка стоит за 500 Internal Server Error (она должна сообщить вам об ошибке, если вы следовали инструкциям Теодора):
Отладка ошибок подключения к серверу - Опубликуйте ошибку здесь или, если вы можете исправить ее, не стесняйтесь сделать это
- Повторно включить mod_security
- Исправить проблему mod_security
1 Нравится
с.альпаслан
#9
@andrea. falco ,
да, @Apple очень хорошо объяснила, что нужно делать.
С помощью этого метода можно будет точно обнаружить ошибку. @Teodor может иметь другую идею.
Андреа Фалько
#10
Это код ошибки
{«код»:0,»файл»:»D:\home\z08352-linux01.winp013.arubabusiness.it\irq10.net\dmxConnectLib\PHPMailer\PHPMailer\PHPMailer.php», «линия»: 1797, «сообщение»: «Вызов неопределенной функции PHPMailer\PHPMailer\escapeshellcmd()», «трассировка»: «#0 D:\home\z08352-linux01.winp013.arubabusiness.it\irq10.net\dmxConnectLib\PHPMailer\ PHPMailer\PHPMailer.php(1893): PHPMailer\PHPMailer\PHPMailer::isShellSafe()\n#1 D:\home\z08352-linux01.winp013.arubabusiness.it\irq10.net\dmxConnectLib\PHPMailer\PHPMailer\PHPMailer. php(1650): PHPMailer\PHPMailer\PHPMailer->mailSend()\n#2 D:\home\z08352-linux01. winp013.arubabusiness.it\irq10.net\dmxConnectLib\PHPMailer\PHPMailer\PHPMailer.php(1486) : PHPMailer\PHPMailer\PHPMailer->postSend()\n#3 D:\home\z08352-linux01.winp013.arubabusiness.it\irq10.net\dmxConnectLib\modules\mail.php(133): PHPMailer\PHPMailer\PHPMailer ->send()\n#4 D:\home\z08352-linux01.winp013.arubabusiness.it\irq10.net\dmxConnectLib\lib\App.php(197): modules\mail->send()\n#5 D:\home\z08352-linux01.winp013.arubabusiness.it\irq10.net\dmxConnectLib\lib\App.php(169): lib\App-> execSteps()\n#6 D:\home\z08352-linux01.winp013.arubabusiness.it\irq10.net\dmxConnectLib\lib\App.php(137): lib\App->execSteps()\n#7 D :\home\z08352-linux01.winp013.arubabusiness.it\irq10.net\dmxConnectLib\lib\App.php(126): lib\App->exec()\n#8 D:\home\z08352-linux01. winp013.arubabusiness.it\irq10.net\dmxConnectLib\lib\App.php(104): lib\App->exec()\n#9 D:\home\z08352-linux01.winp013.arubabusiness.it\irq10. net\dmxConnect\api\utenti\modulocontatti.php(8): lib\App->define()\n#10 {main}»}
Теодор
#11
Какой хостинг вы используете? Кажется, по какой-то причине функция https://www.php.net/manual/en/function.escapeshellcmd.php может быть отключена вашим хостинг-провайдером.
Андреа Фалько
#12
Хостинг Windows с PHP 8.0. 901:25 Все работало нормально до конца прошлого лета.
Я надеялся на тикет к хост провайдеру, но они ответили, что на сервере ничего не менялось
Теодор
№13
Как именно настроен ваш почтовик?
Андреа Фалько