WordPress отказывается отправлять почту: «... возможно, ваш хост отключил функцию mail ()»
-
-
Пожалуйста,предоставьте [отладочную информацию] (http://codex.wordpress.org/Debugging_in_WordPress)Please provide [debugging information](http://codex.wordpress.org/Debugging_in_WordPress)
- 0
- 2013-04-08
- s_ha_dum
-
9 ответ
- голосов
-
- 2013-04-08
Пошагово: сначала найдите файл,в котором появляется сообщение об ошибке. Я использую Notepad ++ и команду CTRL + F для поиска в файлах. Рекомендуется искать только несколько первых слов сообщения об ошибке,потому что некоторые сообщения об ошибках состоят из разных сообщений.
Ваше сообщение об ошибке появляется в
wp-login.php
,и удачи,только там. Итак,давайте посмотрим,почему могла возникнуть эта ошибка.if ( $message && !wp_mail($user_email, $title, $message) )
Есть два условия.
$message
должно быть истинным (не пустой строкой,не ложью,не нулевым значением и т. д.). Иwp_mail()
не должен возвращатьfalse.На одну строчку выше есть фильтр
$message = apply_filters('retrieve_password_message', $message, $key);
,поэтому возможно,что плагин (или тема) использует этот фильтр и возвращает значение,которое не соответствует истине (пустая строка,ложь,ноль и т. д.).Но гораздо проще проверить,работает ли
wp_mail()
. Напишите небольшой плагин,чтобы отправить себе тестовое письмо:<?php /** * Plugin Name: Stackexchange Testplugin * Plugin URI: http://yoda.neun12.de * Description: Send me a test email * Version: 0.1 * Author: Ralf Albert * Author URI: http://yoda.neun12.de * Text Domain: * Domain Path: * Network: * License: GPLv3 */ namespace WordPressStackexchange; add_action( 'init', __NAMESPACE__ . '\plugin_init' ); function plugin_init(){ $to = '[email protected]'; $subject = 'Testemail'; $message = 'FooBarBaz Testmail is working'; wp_mail( $to, $subject, $message ); }
(Это код PHP5.3. Если вы используете PHP5.2,удалите элементы пространства имен)
Плагин должен отправить тестовое письмо сразу после активации. Если нет,вызовите некоторые внутренние страницы (например,панель инструментов).
Если тестовое письмо не приходит,возможно,у вас проблема с
wp_mail()
. Так что включите отладку:define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', true ); @ini_set( 'display_errors',1 );
Поместите этот код в свой
wp-config.php
и попробуйте снова отправить себе тестовое письмо. Теперь вы должны получить несколько сообщений об ошибках,и они также должны быть зарегистрированы вwp-content/debug.log
(журнал отладки может стать очень большим,если будет больше ошибок,вызванных плагинами и/или темами).На этом этапе у вас есть хорошая информация,если
wp_mail()
дает сбой,и если да,то почему. Еслиwp_mail()
работает правильно и получено тестовое письмо,вернитесь к началу и выясните,почему$message
не соответствует действительности.Если у вас возникли проблемы с
wp_mail()
,помните,чтоwp_mail()
не использует функцию PHPmail()
. WordPress использует класс PHP ( PHPMailer ). Возможно,вам просто нужен плагин для использования SMTP вместо sendmail. Или проблема в другом месте. Мы не знаем. Вы должны провести расследование.Step by step: First find the file where the error message appear. I use Notepad++ and the CTRL + F command to search in files. It is a good idea to search only the first few words of the error message, because some error messages are combined of different messages.
Your error message appear in
wp-login.php
and holy luck, only there. So let's have a look why this error could occur.if ( $message && !wp_mail($user_email, $title, $message) )
There are two conditions.
$message
have to be true (not an empty string, not false, not null, etc). Andwp_mail()
shouldn't return false.One line above, there is a filter
$message = apply_filters('retrieve_password_message', $message, $key);
, so it is possible that a plugin (or theme) use this filter and returns a value that is not true (empty string, false, null, etc.).But it is much easier to check if
wp_mail()
is working or not. Write a small plugin to send a test mail to yourself:<?php /** * Plugin Name: Stackexchange Testplugin * Plugin URI: http://yoda.neun12.de * Description: Send me a test email * Version: 0.1 * Author: Ralf Albert * Author URI: http://yoda.neun12.de * Text Domain: * Domain Path: * Network: * License: GPLv3 */ namespace WordPressStackexchange; add_action( 'init', __NAMESPACE__ . '\plugin_init' ); function plugin_init(){ $to = '[email protected]'; $subject = 'Testemail'; $message = 'FooBarBaz Testmail is working'; wp_mail( $to, $subject, $message ); }
(This is PHP5.3 code. If you are running PHP5.2, remove the namespace things)
The plugin should send a testmail immediately after activation. If not, calling some backend pages (e.g. dashboard) should do it.
If the testmail does not arrive, then you probably have an issue with
wp_mail()
. So turn on debugging:define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', true ); @ini_set( 'display_errors',1 );
Put this code into your
wp-config.php
and retry sending yourself a testmail. Now you should get some error messages and they also should be logged intowp-content/debug.log
(The debug log can grow very large if there are more errors caused by plugins and/or themes).At this point, you got good informations if
wp_mail()
fails and if so, why. Ifwp_mail()
work correctly and the testmail arrived, go back to top and find out why$message
is not true.If you have issues with
wp_mail()
, so keep in mind thatwp_mail()
does not use PHPsmail()
function. WordPress use a PHP class (PHPMailer). Maybe you just need a plugin to use SMTP instead of sendmail. Or the problem is located at another place. We don't know. You have to investigate.-
Да,я попытался покопаться в ядре,и это также привело меня к PHPMailer,и он действительно * действительно * используетphp `mail ()`.По крайней мере,в некоторых случаях (см. Строку 732 в `wp-includes/class-phpmailer.php`. У меня нет доступа кftp-атм,но я попробую ваши предложения,как только смогу. Конечно,это должно меня куда-то привести. Большое спасибо!Yeah i tried digging into the core and it also lead me to PHPMailer, and it actually *does* use php's `mail()`. At least in some cases (see line 732 in `wp-includes/class-phpmailer.php`. I don't have access to the ftp atm but i will try your suggestions as soon as i can. Surely this must lead me somewhere. Thanks a lot!
- 0
- 2013-04-08
- qwerty
-
Я протестировал wp_mail () и,похоже,он работает нормально,я получил письмо,как и ожидалось.WP по-прежнему не отправлял электронные письма с комментариями/сбросом пароля,и я ничего не получал в файле журнала (он не был создан),поэтому я попытался установить почтовый плагин SMTP и настроить новую учетную запись электронной почты дляWordpress.Сейчас он работает,но я до сих пор не понимаю,почему его нельзя было отправить раньше.Благодаря!I tested `wp_mail()` and it seems to work fine, i received the mail as expected. WP still wouldn't send the comment/password-reset emails though, and i didn't get anything in the log file (it wasn't created), so i tried installing an SMTP mail plugin and set up a new email account for Wordpress. It works now but i still don't understand why it couldn't send before. Thanks!
- 0
- 2013-04-09
- qwerty
-
Я не получаю ни ошибок,ни даже почтыI'm not getting any error and even not mail
- 0
- 2017-08-19
- baldraider
-
- 2014-12-11
Это очень раздражающее сообщение об ошибке,поскольку может быть много вещей,и оно не раскрывает фактическую ошибку (которая часто игнорируется в других частях кода).
Эта ошибка появляется,когда функция
wp_mail ()
возвращаетfalse,что,в свою очередь,может произойти,еслиphpmailer- > Send ()
возвращаетfalse или вызывает исключение.
Как отображать предупреждения от функции PHP
mail ()
Обычно по умолчанию они отключены,но,к сожалению,WordPress никогда их не фиксирует. Чтобы показать их,просто удалите знаки
@
из@mail (...
вwp-includes/class-phpmailer.php
в < code>mailPassthru () функция:if (ini_get ('safe_mode')||! ($this- > UseSendmailOptions)) { $ rt=@mail ($to,$this- >encodeHeader ($this- > secureHeader ($ subject)),$body,$ header); }else { $ rt=@mail ($to,$this- >encodeHeader ($this- > secureHeader ($ subject)),$body,$ header,$params); }
Как найти другие возможные причины:
-
Добавьте одну строку в конец
wp_mail ()
в/wp-includes/pluggable.php
://Отправить! пытаться { вернуть $phpmailer- > Отправить (); } catch (phpmailerException $e) { //------------- Это следующая строка,которую нужно добавить ------------------- если (WP_DEBUG)echo '& lt;pre >' .esc_html (print_r ($e,ИСТИНА)). '& lt;/pre >'; вернуть ложь; }
-
Будет выведена полная информация о том,где возникло исключение. К сожалению,он иногда включает это бесполезное сообщение об исключении: « Не удалось создать экземпляр почтовой функции ». Да,спасибо WordPress,это действительно полезно.
-
Посмотрев на исключение,вы можете найти номер строки ошибки и,надеюсь,отследить ее через код,чтобы найти настоящую причину.
Удачи. Надеюсь,в будущем WordPress улучшит обработку ошибок электронной почты.
This is a super annoying error message as it could be many things, and it doesn't reveal the actual error (which is often silenced in other parts of the code).
This error appears when the
wp_mail()
function returns false, which in turn could happen ifphpmailer->Send()
returns false or raises an exception.How to display warnings from PHP's
mail()
functionThese are normally silenced by default, but unfortunately WordPress never captures them. To show them, simply remove the
@
signs from@mail(...
inwp-includes/class-phpmailer.php
in themailPassthru()
function:if (ini_get('safe_mode') || !($this->UseSendmailOptions)) { $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header); } else { $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header, $params); }
How to hunt down other possible causes:
Add a single line to the bottom of
wp_mail()
in/wp-includes/pluggable.php
:// Send! try { return $phpmailer->Send(); } catch ( phpmailerException $e ) { //------------- This next line is the one to add ------------------- if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>'; return false; }
It will dump the full details of where the exception was raised. Unfortunately it sometimes includes this unhelpful exception message: "Could not instantiate mail function". Yeah thanks WordPress, that's real helpful.
By looking at the exception you can find the line number of the error, and can hopefully trace it back through the code to find the real cause.
Good luck. Hopefully WordPress improves email error handling at some point in the future.
-
- 2017-05-03
У меня такая же проблема с сервером Ubuntu на Amazon EC2. У меня проблема при использовании ссылки для сброса пароля,а также другие уведомления по электронной почте не работают.
Вот решения,которые сработали для меня. Word-press использовал функцию
wp_mail()
для отправки электронной почты,для которой нужен классPHPMailer
,который использовал почтовую программуphp,хранящуюся в/usr/sbin/sendmail
.Используйте эту простую функциюphp для проверки почты наphp
<?php $to = "[email protected]"; $subject = "Test Email Function"; $txt = "Hello world!"; $headers = "From: [email protected]" . "\r\n" . "CC: [email protected]"; mail($to,$subject,$txt,$headers); ?>
Если это не работает,вам необходимо установить почтовую программуphp. Используйте эту команду для установки почтыphp на сервер Ubuntu.
sudo apt-get install sendmail
Затем проверьте функции электронной почты для прессы.
I has same issue with Ubuntu server on Amazon EC2.I get issue while using reset password link and also other notification email were not working.
So here is solutions which worked for me.Word-press used
wp_mail()
function to send email which needPHPMailer
class which used php mailer stored in/usr/sbin/sendmail
.Use this simple php function first to check php mail
<?php $to = "[email protected]"; $subject = "Test Email Function"; $txt = "Hello world!"; $headers = "From: [email protected]" . "\r\n" . "CC: [email protected]"; mail($to,$subject,$txt,$headers); ?>
If this is not working then you need to install php mailer. Use this command to install php mail on Ubuntu server.
sudo apt-get install sendmail
Then check word-press email functions.
-
этот ответ - тот,который каждый должен попробовать перед любыми другими ответами,это путьthis answer is the one anyone should try before any other answers, this is the way to go
- 0
- 2019-01-25
- hatenine
-
- 2017-02-04
Если другие отличные ответы здесь не помогают,попробуйте следующее:
Я столкнулся с той же проблемой,и ничто,что я не смог найти ни в одном из предложений по WordPress,не решило ее для меня.
Затем я начал исследовать,не отключила ли почтовую функцию сама установка PHP,но это тоже не помогло. Все выглядело так,будто все настроено правильно.
Все эти проблемы начались у меня,когда я обновил свой сервер до CentOS 7,который использует SELinux (Security Enhanced Linux),и за последние пару недель с SELinux я узнал,что если что-то не работает,но похоже,что все должно работать ... это означает,что SELinux тихо и тайно блокирует вас в фоновом режиме.
И альт.
Если вы работаете в ОС,которая использует SELinux,просто выполните следующую команду от имени пользователя root:
setsebool -P httpd_can_sendmail=1
Существует параметр безопасности,который по сути предотвращает отправку электронной почты веб-сервером. Когда вы нажимаете этот переключатель и говорите SELinux,что веб-сервер может отправлять электронную почту,все сразу начинает работать.
If the other great answers here don't help, try this:
I encountered this same problem and nothing I could find in any of the suggestions for WordPress solved it for me.
Then I started investigating if it was the PHP installation itself that had disabled the mail function, but none of that worked either. Everything looked like it was configured properly.
All of these problems started for me once I upgraded my server to CentOS 7 which uses SELinux (Security Enhanced Linux) and what I've learned in the last couple of weeks with SELinux is that if something isn't working, but everything looks like it should be working... that means SELinux is silently and secretly blocking you in the background.
And viola.
If you are running and OS that uses SELinux, just execute the following command as root:
setsebool -P httpd_can_sendmail=1
There is a security setting that inherently prevents the webserver from sending email. When you flip that switch and tell SELinux it's ok for the webserver to send email, everything suddenly works.
-
- 2014-01-16
Я столкнулся с этим сегодня;в моем случае ситуация произошла из-за того,что файл hosts на сервере имеет то же доменное имя,что и адрес электронной почты,указывая на localhost.Записьmx указывает на другой сервер,но файл hosts переопределяет DNS,и WP пытается доставить электронное письмо локально.Удаление домена из файла hosts и перезапуск sendmail решили эту проблему.
I ran into this today; in my case the situation happened because the server's hosts file has the same domain name of the email address, pointing to localhost. The mx record points to a different server, but the hosts file is overriding DNS and WP is trying to deliver the email locally. Removing the domain from the hosts file and restarting sendmail resolved this issue.
-
- 2014-05-30
Я не знаю,актуально ли это для вас по-прежнему,но,поскольку ответа не было выбрано,я подумал,позвольте мне попробовать еще раз.
На самом деле,я столкнулся с той же проблемой,так как мой хост openshift сегодня внезапно отказал и перестал отправлять почту. Покопавшись в коде и кодексе,я узнал о функции wp_mail () и,наконец,Google привел меня сюда,и я увидел,как ее можно переопределить.
Основываясь на ответе @Ralf912,я немного изменил скрипт,чтобы в коде использовался веб-API sendgrid.com для отправки писем вместо стандартного WordPress (как я предполагаю:
<?php function sendgridmail($to, $subject, $message, $headers) { $url = 'https://api.sendgrid.com/'; //$user = 'yourUsername'; //$pass = 'yourPassword'; $params = array( 'api_user' => $user, 'api_key' => $pass, 'to' => $to, 'subject' => $subject, 'html' => '', 'text' => $message, 'from' => '[email protected]', ); $request = $url.'api/mail.send.json'; // Generate curl request $session = curl_init($request); // Tell curl to use HTTP POST curl_setopt ($session, CURLOPT_POST, true); // Tell curl that this is the body of the POST curl_setopt ($session, CURLOPT_POSTFIELDS, $params); // Tell curl not to return headers, but do return the response curl_setopt($session, CURLOPT_HEADER, false); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); // obtain response $response = curl_exec($session); curl_close($session); // print everything out //print_r($response); } //only for testing: /*$to = '[email protected]'; $subject = 'Testemail'; $message = 'It works!!'; echo 'To is: ' + $to; #wp_mail( $to, $subject, $message, array() ); sendgridmail($to, $subject, $message, $headers); print_r('Just sent!');*/ if (!function_exists('wp_mail')) { function wp_mail($to, $subject, $message, $headers = '', $attachments = array()) { // use the PHP GnuPG library here to send mail. sendgridmail($to, $subject, $message, $headers); } } function plugin_init() { /* $to = '[email protected]'; $subject = 'Testemail'; $message = 'It works Live!'; //echo 'To is: ' + $to; wp_mail( $to, $subject, $message, array() ); //print_r('Just sent!');*/ }
И это сработало!
I don't know whether this is still relevant to you or not, but since there is no answer chosen, I thought let me give it a try once.
Actually, I had faced the exact same problem since my openshift host all of a suddenly gave way today and stopped sending mails. Digging through the code and codex, I came to know about the wp_mail() function and finally google led me here and I saw how it could be overridden.
Building on @Ralf912's answer, I modified the script a bit so that the code uses sendgrid.com's web api to send mails instead of wordpress default one (that I presume :
<?php function sendgridmail($to, $subject, $message, $headers) { $url = 'https://api.sendgrid.com/'; //$user = 'yourUsername'; //$pass = 'yourPassword'; $params = array( 'api_user' => $user, 'api_key' => $pass, 'to' => $to, 'subject' => $subject, 'html' => '', 'text' => $message, 'from' => '[email protected]', ); $request = $url.'api/mail.send.json'; // Generate curl request $session = curl_init($request); // Tell curl to use HTTP POST curl_setopt ($session, CURLOPT_POST, true); // Tell curl that this is the body of the POST curl_setopt ($session, CURLOPT_POSTFIELDS, $params); // Tell curl not to return headers, but do return the response curl_setopt($session, CURLOPT_HEADER, false); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); // obtain response $response = curl_exec($session); curl_close($session); // print everything out //print_r($response); } //only for testing: /*$to = '[email protected]'; $subject = 'Testemail'; $message = 'It works!!'; echo 'To is: ' + $to; #wp_mail( $to, $subject, $message, array() ); sendgridmail($to, $subject, $message, $headers); print_r('Just sent!');*/ if (!function_exists('wp_mail')) { function wp_mail($to, $subject, $message, $headers = '', $attachments = array()) { // use the PHP GnuPG library here to send mail. sendgridmail($to, $subject, $message, $headers); } } function plugin_init() { /* $to = '[email protected]'; $subject = 'Testemail'; $message = 'It works Live!'; //echo 'To is: ' + $to; wp_mail( $to, $subject, $message, array() ); //print_r('Just sent!');*/ }
And it worked!
-
- 2016-08-23
У меня была такая же ошибка,обе функции (mail и wp_mail) работали,но эта досадная ошибка все еще оставалась. Исправить это было очень просто,но мне потребовалось несколько часов,чтобы найти причину. Поэтому я поделюсь здесь своим решением проблемы,которое может быть (а может и не совпадать) с вашим.
Я попробовал функциюmail (),и она сработала,но когда вы ее проверяете,вы не указываете последний параметр под названием «параметры» в функцииmail (). И WP этим пользуется.
@mail("[email protected]",$title,$body,$headers,"[email protected]");
Итак,в основном этот параметр ("[email protected]") с флагом "-f" заставляет функциюmail () проверять,указан ли адрес электронной почты "[email protected]" в списке "доверенных писем". .
Так что,если это не так,он возвращаетfalse,что заставляет wp_mail () возвращатьfalse и приводит к сообщению об ошибке.
Итак,решение - попросить хостера сделать это за вас,или,если вы используете cPanel,просто добавьте учетную запись электронной почты для этого адреса,и он автоматически добавит его в «список доверенных».
I had the same error, both functions(mail and wp_mail) worked, but I still had this annoying error. The fix was very easy, but it took me few hours to find the reason. So I will share here my solution on the problem which might be (or might not) the same with yours.
I tried mail() function and it worked, but when you test it you don't specify the last parameter called 'parameters' in mail() function. And WP does use it.
@mail("[email protected]",$title,$body,$headers,"[email protected]");
So, basically, this parameter ("[email protected]") with flag "-f" makes mail() function check if the email address "[email protected]" listed in the "trusted emails" list.
So if it doesn't, it returns false, which makes wp_mail() returns false and leads to the error message.
So, solution is to ask hoster to do this for you, or if you are using cPanel, just add email account for this address and it will automatically will add it into the "trusted list".
-
- 2019-05-31
он назывался -Управление зарегистрированными идентификаторами электронной почты для отправки писем через скрипты,т.е. (Wordpress)
- Войдите в свою Cpanel.
- Перейдите в раздел "Электронная почта"> затем нажмите "Зарегистрированные идентификаторы электронной почты".
- затем добавьте ([email protected]) или место размещения вашего wordpress.т.е. ([email protected]).затем отправьте,активация займет несколько минут,подождите от 15 минут до 1 часа в зависимости от вашего хостинг-провайдера,и тогда все заработает.
it called -Manage Registered Email-Ids For Sending Mails via Scripts ie.(Wordpress)
- Login your Cpanel.
- Go to Email Section > then Click Registered Email IDs.
- then add ([email protected]) or where your wordpress hosted. ie ([email protected]) . then submit, it takes few minute to activate wait 15minute to 1 hour depending to your hosting provider, then it will work.
-
- 2019-12-14
У меня была эта ошибка целую вечность,и я перепробовал так много решений,которые не помогли.У меня есть настраиваемая установка Wordpress на AWS EC2.Прежде всего убедитесь,что ваша почта AWS SES включена через службу поддержки,они должны находиться в одном (или близком) регионе в SES и EC2. Я использовал пакет Google (gsuite) для электронной почты для получения/отправки почты.
Убедитесь,что тестовое электронное письмо отправляется в AWS SES и Gsuite.
Установите плагин Wordpress WP Mail SMTP,используйте параметр «Другой SMTP»,возьмите свои учетные данные SMTP из AWS SES,вот где я застрял.
Вы должны установить флажок "SSL" для шифрования,это меняет порт на 465 для меня.Наконец-то мой тест электронной почты был успешно отправлен от Worpdress.
I had this error for ages and tried so many solutions that didn't work. I have a custom Wordpress install on AWS EC2. First off ensure your AWS SES mail is enabled through support, they must be in the same (or close) region in SES and EC2. I used Google suite(gsuite) for email for receiving/sending mail.
Make sure the test email sends in AWS SES and Gsuite.
Install the Wordpress plugin WP Mail SMTP, use the option "Other SMTP", grab your SMTP credentials from AWS SES, this is where I got stuck.
You must enable the tick box "SSL" for Encryption, this changes the port to 465 for me. At last my email test sent from Worpdress successfully.
Недавно я создал на своем веб-сайте область для комментариев и попытался заставить работать уведомление по электронной почте.Похоже,что он не хочет отправлять уведомления по электронной почте,когда появляются новые комментарии.
Чтобы посмотреть,может ли PHP отправлять электронные письма,я попытался сбросить пароль (потому что вы получите новый пароль по почте),и получил сообщение:
<цитата>Не удалось отправить электронное письмо.Возможная причина: возможно,ваш хост отключил функциюmail ()
Я установил флажки в разделе "Настройки" -> "Обсуждение",и адрес электронной почты действителен,поэтому это не проблема с настройками.Я попытался создать файл PHP и отправить его с помощью
mail()
,и он был успешно отправлен.Так что с WordPress должно быть что-то странное.Есть идеи?