Функция PHP mail () возвращает false, но без ошибок
Я использую функцию mail () php для простого процесса E-Mailing ввода контактной формы соответствующему лицу. Странная вещь заключается в том, что форма всегда использовалась для обработки E-Mails, но однажды это все остановилось, теперь функция возвращает false, но не дает никакой ошибки вообще.
Сайт находится на общем хосте. Когда вас спросили об этом, они рекомендовали использовать реле smtp xx.xxx.x.xxx
Исправьте меня, если я ошибаюсь, но функция mail () не предусматривает положения для этого? Наверняка, для устройства HOST требуется правильное конфигурирование реле?
Мой вопрос: это похоже на ошибку с конфигурацией хоста, или это мой код? Вот пример используемого почтового кода:
$to = "xxx@xxx.co.za"; //to who? $subject = "Website Contact: $mysubject"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "From: $fname\r\n"; $headers .= "Reply-To: $email1\r\n"; $headers .= "Return-Path:$email1\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; $headers .= "Content-Transfer-Encoding: quoted-printable\r\n"; $msg2 = nl2br($msg); $send = mail($to, $subject, $msg2, $headers); //process mail if(!$send): //error stuff here endif;
@eisberg – я использую собственный обработчик ошибок следующим образом:
//error handler function function customError($errno, $errstr) < $err = "\n".date('Ymd H:m:s')." Error: [$errno] $errstr"; $fh = fopen("errlog.txt", 'a+'); fwrite($fh, $err); fclose($fh); >set_error_handler("customError", E_ALL);
Это означает, что мне нужно изменить set_error_handler(«customError», E_ALL); to set_error_handler(«customError», -1); ?
mail () возвращает false, но без ошибок
Это похоже на ошибку в конфигурации хоста, или это мой код?
Кто знает? mail() – это черный ящик, из которого вы не найдете никакой полезной информации, если что-то пойдет не так.
Когда меня спросили об этом, они рекомендовали использовать реле smtp …
Действительно, вы, вероятно, должны. Взгляните на SwiftMailer , отличную, всеобъемлющую, современную библиотеку рассылки PHP, которая может напрямую говорить на этом SMTP-сервере. Он превосходит при создании сообщений MIME, как тот, который вы, похоже, тщательно собрали выше.
Другие популярные опции включают в себя почту PEAR , Zend Framework Zend_Mail и классику классики PHPMailer .
Похоже, что ваш хост отключил mail() , вы должны изучить использование SMTP для отправки почты, хороший класс почты PHP, такой как SwiftMailer , позволит вам легко отправлять почту через SMTP.
Скорее всего, конфигурация хоста. Я думаю (но может быть неправильно), что mail () использует команду сервера mail. Поэтому, если у вас нет сервера sendmail / postfix / ssmtp или другого MTA, установленного на сервере, он не сможет работать.
Если они сказали вам обратиться непосредственно к SMTP-серверу, вы должны использовать другую библиотеку, которая реализует SMTP-протокол и класс Mail для создания почты и отправки ее через SMTP напрямую (в классах PEAR или Zend Framework PHP вы обнаружите это)
Вы смотрите на журналы почты. Они отвечают. Тем не менее, вам, вероятно, придется бороться с вашей хостинговой компанией.
Проверьте, разрешено ли веб отправлять почту, передавая getsebool httpd_can_sendmail с терминала. Если выход
дайте https разрешение на отправку почты, setsebool httpd_can_sendmail 1 . У вас должно быть разрешение root для выдачи этих команд.
У меня была аналогичная проблема, и на моем сайте размещался хостинг. Я мог бы выяснить проблему, установив заголовок. Проблема заключалась в следующем:
$ headers. = «From: $ fname \ r \ n»;
Вы использовали электронную почту пользователя в поле from. Мой хостинг принимает только электронные письма с моим доменным именем для этого поля. Поэтому я заменил его следующим:
$headers = "From: webmaster@yourdomain.com" ."\r\n" ;
И это устранило проблему! После этого PHP mail () работает отлично.
Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.
(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.
Строка или массив, которые будут вставлены в конец отправляемых заголовков письма.
Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.
Если передан массив, то его ключи будут именами заголовка, а значения значениями.
Замечание:
До PHP 5.4.42 и 5.5.27, параметр additional_headers не имел защиты от инъекции. Так что пользователи должны удостовериться, что передаваемые заголовки безопасны и содержат только заголовки. т.е. не содержат несколько переводов строк подряд, что стартует тело сообщения.
Замечание:
При отправке письмо должно содержать заголовок From . Он может быть установлен с помощью параметра additional_headers , или значение по умолчанию может быть установлено в php.ini .
Если заголовок отсутствует, будет сгенерировано сообщение об ошибке вида Warning: mail(): «sendmail_from» not set in php.ini or custom «From:» header missing . Заголовок From также определяет заголовок Return-Path при отправке напрямую через SMTP (только Windows).
Замечание:
Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.
Параметр additional_params может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path . Например, можно установить отправителя письма при использовании sendmail с помощью опции -f .
Параметр автоматически экранируется функцией escapeshellcmd() , чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.
Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).
Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка ‘X-Warning’ при указании отправителя с помощью опции (-f). Для пользователей sendmail — это файл /etc/mail/trusted-users .
Возвращаемые значения
Возвращает true , если письмо было принято для передачи, иначе false .
Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.
Список изменений
Версия | Описание |
---|---|
7.2.0 | Параметр additional_headers может принимать значения типа массив. |
Примеры
Пример #1 Отправка письма.
Использование функции mail() для отправки простого письма:
// Сообщение
$message = «Line 1\r\nLine 2\r\nLine 3» ;
?php
// На случай если какая-то строка письма длиннее 70 символов мы используем wordwrap()
$message = wordwrap ( $message , 70 , «\r\n» );
// Отправляем
mail ( ‘caffeinated@example.com’ , ‘My Subject’ , $message );
?>
Пример #2 Отправка письма с дополнительными заголовками.
Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:
$to = ‘nobody@example.com’ ;
$subject = ‘the subject’ ;
$message = ‘hello’ ;
$headers = ‘From: webmaster@example.com’ . «\r\n» .
‘Reply-To: webmaster@example.com’ . «\r\n» .
‘X-Mailer: PHP/’ . phpversion ();
?php
mail ( $to , $subject , $message , $headers );
?>
Пример #3 Отправка письма с дополнительными заголовками, переданными массивом
В этом примере посылается то же письмо, что и в примере выше, но дополнительные заголовки задаются массивом (доступно с PHP 7.2.0).
$to = ‘nobody@example.com’ ;
$subject = ‘the subject’ ;
$message = ‘hello’ ;
$headers = array(
‘From’ => ‘webmaster@example.com’ ,
‘Reply-To’ => ‘webmaster@example.com’ ,
‘X-Mailer’ => ‘PHP/’ . phpversion ()
);
?php
mail ( $to , $subject , $message , $headers );
?>
Пример #4 Отправка письма с дополнительными аргументами командной строки.
Параметр additional_params может быть использован для передачи дополнительных параметров программе, используемой для отправки писем с помощью директивы sendmail_path .
Пример #5 Отправка HTML-сообщения
С помощью функции mail() также можно отправить и HTML-письмо.
// несколько получателей
$to = ‘johny@example.com, sally@example.com’ ; // обратите внимание на запятую
?php
// тема письма
$subject = ‘Birthday Reminders for August’ ;
// текст письма
$message = ‘
Here are the birthdays upcoming in August!
Person | Day | Month | Year |
---|---|---|---|
Johny | 10th | August | 1970 |
Sally | 17th | August | 1973 |
‘ ;
// Для отправки HTML-письма должен быть установлен заголовок Content-type
$headers = ‘MIME-Version: 1.0’ . «\r\n» ;
$headers .= ‘Content-type: text/html; charset=iso-8859-1’ . «\r\n» ;
// Дополнительные заголовки
$headers [] = ‘To: Mary , Kelly ‘ ;
$headers [] = ‘From: Birthday Reminder ‘ ;
$headers [] = ‘Cc: birthdayarchive@example.com’ ;
$headers [] = ‘Bcc: birthdaycheck@example.com’ ;
// Отправляем
mail ( $to , $subject , $message , implode ( «\r\n» , $headers ));
?>
Замечание:
Для отправки HTML или других комплексных сообщений рекомендуется использовать PEAR-пакет » PEAR::Mail_Mime.
Примечания
Замечание:
Реализация SMTP (только Windows) функции mail() в Windows во многом отличается от реализации в sendmail. Во-первых, она не использует локальную программу для составления писем, а работает непосредственно с сокетами, что означает что необходим почтовый агент ( MTA ), ожидающий соединений на сокете (может быть как на локальном так и на удалённом сервере).
Во-вторых, дополнительные заголовки вроде: From: , Cc: , Bcc: и Date: интерпретируются в первую очередь не, MTA , а PHP.
Поэтому параметр to не должен быть адресом вида «Something «. Команда mail может неправильно интерпретировать этот адрес во время передачи данных MTA.
Замечание:
Не следует использовать функцию mail() для отправки большого количества писем в цикле. Функция открывает и закрывает соединение с SMTP-сервером для каждого письма, что не очень эффективно.
Для отправки большого количества сообщений обратите внимание на пакеты » PEAR::Mail и » PEAR::Mail_Queue.
Смотрите также
Функция mail() возвращает false
Ребята такой вопрос. Не отправляется сообщение мне на почту через функцию mail(). Выдает false. Скачал sendmail настроил его читая инструкцию по этой ссылке http://www.simplecoding.org/ph. ndows.html. И всё равно не отправляется. в файле debug.log написана вот это
15.09.19 10:59:15 ** —- MESSAGE BEGIN —-
15.09.19 10:59:15 ** To: grizzly_mordex33@mail.ru
15.09.19 10:59:15 ** Subject: космические пришельцы
15.09.19 10:59:15 ** X-PHP-Originating-Script: 0:report.php
15.09.19 10:59:15 ** From: bitch@mail.ru
15.09.19 10:59:15 **
15.09.19 10:59:15 ** был похищен Меня похитили пришельцы и отсутствовал в течении Вчера .
15.09.19 10:59:15 **
15.09.19 10:59:15 ** —- MESSAGE END —-
15.09.19 10:59:15 ** Authenticating with POP3 server
15.09.19 10:59:16 ** Connected.
15.09.19 10:59:16 « +OK
15.09.19 10:59:16 » CAPA
15.09.19 10:59:16 « +OK Capability list followsTOPUSERLOGIN-DELAY 120EXPIRE NEVERUIDLIMPLEMENTATION Mail.RuSASL LOGIN PLAINSTLS.
15.09.19 10:59:16 » USER мой электронный адрес
15.09.19 10:59:16 « +OK
15.09.19 10:59:16 » PASS ***********
15.09.19 10:59:16 « -ERR POP3 is available only with SSL or TLS connection enabled
15.09.19 10:59:16 ** Disconnected.
15.09.19 10:59:16 ** Disconnected.
15.09.19 10:59:16 ** Disconnected.
15.09.19 10:59:16 ** POP3 is available only with SSL or TLS connection enabled
Ошибка вот такая:
15.09.19 10:59:16 ** POP3 is available only with SSL or TLS connection enabled
POP3 доступен только при включенном SSL или TLS соединении.
Как включить эти ssl или TLS соединения?