Функция PHP mail () возвращает false, но без ошибок - PullRequest
7 голосов
/ 31 марта 2011

Я использую функцию php mail () для простого процесса отправки по электронной почте ввода контактной формы соответствующему лицу. Странно то, что форма всегда использовалась для обработки электронной почты, но однажды все это прекратилось, теперь функция возвращает 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<$email1>\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;

Большое спасибо, Simon

@ eisberg - Я использую собственный обработчик ошибок, подобный этому:

//error handler function
function customError($errno, $errstr){
$err = "\n".date('Y-m-d 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); на set_error_handler("customError", -1);?

Ответы [ 6 ]

18 голосов
/ 31 марта 2011

mail () функция возвращает false, но без ошибок

Добро пожаловать в PHP!

Похоже ли это на ошибку конфигурации хоста,или это мой код?

Кто знает?mail() - это черный ящик, из которого вы не найдете никакой полезной информации, если что-то пойдет не так.

Когда его спросили об этом, они порекомендовали использовать реле SMTP ...

Действительно, вы, вероятно, должны.Внимательно посмотрите на SwiftMailer , превосходную, всеобъемлющую, современную почтовую библиотеку PHP, которая может напрямую общаться с этим SMTP-сервером.Он превосходен при создании сообщений MIME, например, таких, которые вы, похоже, старательно собрали выше.

Другие популярные опции включают Почта PEAR , Zend_Mail Zend Framework иклассика классики, PHPMailer .

7 голосов
/ 31 марта 2011

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

1 голос
/ 31 марта 2011

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

1 голос
/ 31 марта 2011

Скорее всего, конфиг хоста.Я думаю (но может и ошибаться), что mail () использует команду server mail.Поэтому, если у вас нет sendmail / postfix / ssmtp или другого MTA, установленного на сервере, он не сможет работать.
Если вам сказали обратиться к SMTP-серверу напрямую, вы должны использовать другую библиотеку, которая реализует протокол SMTP, и класс Mail для сборки.почты и отправьте ее напрямую через SMTP (в PHP-классах PEAR или Zend Framework вы найдете это)

0 голосов
/ 04 августа 2016

У меня была похожая проблема, и мой сайт размещен в службе общего хостинга. Я мог бы выяснить проблему, исправив заголовок. Проблема была:

$ headers. = "From: $ fname \ r \ n";

Вы использовали электронную почту пользователя в поле от. Мой хостинг принимает только электронные письма с моим доменным именем для этого поля. Поэтому я заменил это на это:

$headers = "From: webmaster@yourdomain.com" ."\r\n" ;

И это решило проблему! PHP mail () прекрасно работает после этого.

0 голосов
/ 17 июня 2013

Проверьте, разрешено ли в Интернете отправлять почту, указав getsebool httpd_can_sendmail от терминала. Если вывод

httpd_can_sendmail --> off

дает https разрешение на отправку почты с помощью команды setsebool httpd_can_sendmail 1 . У вас должны быть права доступа root для выдачи этих команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...