Функция 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 () работает отлично.
Each line should be separated with a CRLF (\r\n). Lines should not be larger than 70 characters.
(Windows only) When PHP is talking to a SMTP server directly, if a full stop is found on the start of a line, it is removed. To counter-act this, replace these occurrences with a double dot.
String or array to be inserted at the end of the email header.
This is typically used to add extra headers (From, Cc, and Bcc). Multiple extra headers should be separated with a CRLF (\r\n). If outside data are used to compose this header, the data should be sanitized so that no unwanted headers could be injected.
If an array is passed, its keys are the header names and its values are the respective header values.
Note:
Before PHP 5.4.42 and 5.5.27, repectively, additional_headers did not have mail header injection protection. Therefore, users must make sure specified headers are safe and contains headers only. i.e. Never start mail body by putting multiple newlines.
Note:
When sending mail, the mail must contain a From header. This can be set with the additional_headers parameter, or a default can be set in php.ini .
Failing to do this will result in an error message similar to Warning: mail(): «sendmail_from» not set in php.ini or custom «From:» header missing . The From header sets also Return-Path when sending directly via SMTP (Windows only).
Note:
If messages are not received, try using a LF (\n) only. Some Unix mail transfer agents (most notably » qmail) replace LF by CRLF automatically (which leads to doubling CR if CRLF is used). This should be a last resort, as it does not comply with » RFC 2822.
The additional_params parameter can be used to pass additional flags as command line options to the program configured to be used when sending mail, as defined by the sendmail_path configuration setting. For example, this can be used to set the envelope sender address when using sendmail with the -f sendmail option.
This parameter is escaped by escapeshellcmd() internally to prevent command execution. escapeshellcmd() prevents command execution, but allows to add additional parameters. For security reasons, it is recommended for the user to sanitize this parameter to avoid adding unwanted parameters to the shell command.
Since escapeshellcmd() is applied automatically, some characters that are allowed as email addresses by internet RFCs cannot be used. mail() can not allow such characters, so in programs where the use of such characters is required, alternative means of sending emails (such as using a framework or a library) is recommended.
The user that the webserver runs as should be added as a trusted user to the sendmail configuration to prevent a ‘X-Warning’ header from being added to the message when the envelope sender (-f) is set using this method. For sendmail users, this file is /etc/mail/trusted-users .
Return Values
Returns true if the mail was successfully accepted for delivery, false otherwise.
It is important to note that just because the mail was accepted for delivery, it does NOT mean the mail will actually reach the intended destination.
Changelog
Version | Description |
---|---|
7.2.0 | The additional_headers parameter now also accepts an array . |
Examples
Example #1 Sending mail.
Using mail() to send a simple email:
// The message
$message = «Line 1\r\nLine 2\r\nLine 3» ;
?php
// In case any of our lines are larger than 70 characters, we should use wordwrap()
$message = wordwrap ( $message , 70 , «\r\n» );
// Send
mail ( ‘caffeinated@example.com’ , ‘My Subject’ , $message );
?>
Example #2 Sending mail with extra headers.
The addition of basic headers, telling the MUA the From and Reply-To addresses:
$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 );
?>
Example #3 Sending mail with extra headers as array
This example sends the same mail as the example immediately above, but passes the additional headers as array (available as of 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 );
?>
Example #4 Sending mail with an additional command line parameter.
The additional_params parameter can be used to pass an additional parameter to the program configured to use when sending mail using the sendmail_path .
Example #5 Sending HTML email
It is also possible to send HTML email with mail() .
// Multiple recipients
$to = ‘johny@example.com, sally@example.com’ ; // note the comma
?php
// Subject
$subject = ‘Birthday Reminders for August’ ;
// Message
$message = ‘
Here are the birthdays upcoming in August!
Person | Day | Month | Year |
---|---|---|---|
Johny | 10th | August | 1970 |
Sally | 17th | August | 1973 |
‘ ;
// To send HTML mail, the Content-type header must be set
$headers [] = ‘MIME-Version: 1.0’ ;
$headers [] = ‘Content-type: text/html; charset=iso-8859-1’ ;
// Additional headers
$headers [] = ‘To: Mary , Kelly ‘ ;
$headers [] = ‘From: Birthday Reminder ‘ ;
$headers [] = ‘Cc: birthdayarchive@example.com’ ;
$headers [] = ‘Bcc: birthdaycheck@example.com’ ;
// Mail it
mail ( $to , $subject , $message , implode ( «\r\n» , $headers ));
?>
Note:
If intending to send HTML or otherwise Complex mails, it is recommended to use the PEAR package » PEAR::Mail_Mime.
Notes
Note:
The SMTP implementation (Windows only) of mail() differs in many ways from the sendmail implementation. First, it doesn’t use a local binary for composing messages but only operates on direct sockets which means a MTA is needed listening on a network socket (which can either on the localhost or a remote machine).
Second, the custom headers like From: , Cc: , Bcc: and Date: are not interpreted by the MTA in the first place, but are parsed by PHP.
As such, the to parameter should not be an address in the form of «Something «. The mail command may not parse this properly while talking with the MTA.
Note:
It is worth noting that the mail() function is not suitable for larger volumes of email in a loop. This function opens and closes an SMTP socket for each email, which is not very efficient.
For the sending of large amounts of email, see the » PEAR::Mail, and » PEAR::Mail_Queue packages.
See Also
Return-path в PHP функции mail
Эффективность почтовых рассылок во многом зависит от прохождения письмами спам фильтров. Эти фильтры смотрят на все заголовки письма и подписи. И для наилучшего результата стоит удовлетворить все их условия, тогда письма не попадут в спам.
Существуют три адреса, которые сильно влияют на эффективность прохождения спам фильтров. Все эти адреса прописываются в письме и называются полями «From:» (от кого), «Reply:» (кому отвечать), «Return-path:» (путь ответа). Все эти три поля желательно должны содержать определённую информацию.
Обратите внимание, что правильное задание «Return-path» снижает попадание письма в «спам» почти на 30%. Поэтому внимательно отнеситесь к теме выставления заголовков письма. И обязательно пользуйтесь онлайн сервисами для проверки спам рейтинга писем.
From: support@mousedc.ru Reply: support@mousedc.ru
А значение «Return-path» должно содержать имя сервера. Причём на это имя сервера должна быть А и MX запись для одноимённого доменного имени (с поддоменом). К примеру, в этом поле в письмах пишется:
Return-path: support@mousedc.ru
А в записях домена «mousedc.ru»есть MX запись и А запись указывает на тот сервер, с ip адреса которого ведётся рассылка.
Звучит довольно сложно (по сути так оно и есть, ведь это защита против спамеров!), но если сервер с проектом и домен принадлежит вам, то можно без проблем прописать все А и MX записи. А вот для выставления «Return-path» можно использовать пятый параметр в функции mail в PHP. В него можно передать почтовый адрес с ключом -f, чтобы установить «Return-path»:
mail($to, $subject, $msg, $headers, '-f support@mousedc.ru');