WordPress отказывается отправлять почту, «… ваш хост может отключить функцию mail ()

Недавно я реализовал область комментариев на своем веб-сайте и попытался использовать функции уведомления по электронной почте. Кажется, он не хочет отправлять уведомления по электронной почте при создании новых комментариев. Просто чтобы узнать, может ли PHP отправлять электронные письма, я попытался сбросить пароль (потому что вы получите новый пароль по почте), и я получил сообщение:

Не удалось отправить электронное письмо. Возможная причина: ваш хост может отключить функцию mail ()

Я проверил флажки в настройках -> Обсуждение, и письмо действительно, поэтому это не проблема с настройкой. Я попытался создать php-файл и отправить с помощью mail() , и он успешно отправлен. Так что в WordPress должно быть что-то странное.

Есть идеи?

Solutions Collecting From Web of "WordPress отказывается отправлять почту, «… ваш хост может отключить функцию mail ()"

Шаг за шагом: сначала найдите файл, в котором появится сообщение об ошибке. Я использую Notepad ++ и команду CTRL + F для поиска в файлах. Рекомендуется искать только первые несколько слов сообщения об ошибке, поскольку некоторые сообщения об ошибках объединяются в разные сообщения.

Ваше сообщение об ошибке появляется в wp-login.php и святой удаче, только там. Поэтому давайте посмотрим, почему эта ошибка может произойти.

 if ( $message && !wp_mail($user_email, $title, $message) ) 

Есть два условия. $message должно быть истинным (не пустая строка, а не false, а не null и т. д.). И wp_mail() не должен возвращать false.

Одна строка выше, есть фильтр $message = apply_filters('retrieve_password_message', $message, $key); , поэтому возможно, что плагин (или тема) использует этот фильтр и возвращает значение, которое не является истинным (пустая строка, false, null и т. д.).

Но гораздо проще проверить, работает ли 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 = 'your-email-adress@some-domain.tld'; $subject = 'Testemail'; $message = 'FooBarBaz Testmail is working'; wp_mail( $to, $subject, $message ); } 

(Это код PHP5.3. Если вы используете PHP5.2, удалите вещи пространства имен)

Плагин должен отправить testmail сразу после активации. Если нет, вызовите некоторые бэкэнд-страницы (например, приборную панель), чтобы это сделать.

Если testmail не поступает, у вас, вероятно, проблема с 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() работает корректно и пришло сообщение testmail, вернитесь наверх и узнайте, почему $message is not true.

Если у вас есть проблемы с wp_mail() , имейте в виду, что wp_mail() не использует функцию PHP mail() . WordPress использует PHP-класс ( PHPMailer ). Возможно, вам просто нужен плагин для использования SMTP вместо sendmail. Или проблема находится в другом месте. Мы не знаем. Вы должны исследовать.

Это типичная проблема с некоторыми веб-хостами, которые отключают или ограничивают почту php. Попробуйте использовать плагин для использования SMTP-сервера хостов. См. http://wordpress.org/extend/plugins/search.php?q=mail+smtp

Это очень неприятное сообщение об ошибке, так как это может быть много , и он не показывает фактическую ошибку (которая часто отключается в других частях кода).

Эта ошибка появляется, когда wp_mail() возвращает false, что, в свою очередь, может произойти, если phpmailer->Send() возвращает false или вызывает исключение.

Как отображать предупреждения из функции PHP mail()

Обычно они отключены по умолчанию, но, к сожалению, WordPress никогда их не захватывает. Чтобы показать их, просто удалите знаки @ из @mail(... в wp-includes/class-phpmailer.php в функции 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); } 

Как выследить другие возможные причины:

  1. Добавьте одну строку в wp_mail() в /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; } 
  2. Он сбрасывает полную информацию о том, где было создано исключение. К сожалению, это иногда включает это бесполезное сообщение об исключении: « Не удалось создать почтовую функцию ». Да, спасибо WordPress, это очень полезно.

  3. Посмотрев на исключение, вы можете найти номер строки ошибки и, можно надеяться, проследить его обратно через код, чтобы найти реальную причину.

Удачи. Надеюсь, WordPress улучшит обработку ошибок электронной почты в будущем.

Если другие большие ответы здесь не помогают, попробуйте следующее:

Я столкнулся с этой же проблемой и ничего не смог найти в любом из предложений, которые WordPress решил для меня.

Затем я начал исследовать, была ли сама установка PHP отключенной почтовой функцией, но ни одна из них не работала. Все выглядело так, как будто оно было настроено правильно.

Все эти проблемы начались для меня, как только я обновил свой сервер до CentOS 7, который использует SELinux (Security Enhanced Linux), и то, что я узнал за последние пару недель с SELinux, заключается в том, что если что-то не работает, но все выглядит так: он должен работать … это означает, что SELinux молча и тайно блокирует вас в фоновом режиме.

И альт.

Если вы работаете и ОС, использующая SELinux, просто выполните следующую команду в качестве пользователя root:

setsebool -P httpd_can_sendmail=1

Существует параметр безопасности, который по своей сути препятствует отправке электронной почты веб-серверу. Когда вы переключаете этот переключатель и говорите SELinux, веб-сервер может отправлять электронную почту, все неожиданно работает.

Сегодня я столкнулся с этим; в моем случае ситуация произошла из-за того, что файл хостов сервера имеет такое же доменное имя адреса электронной почты, указывая на localhost. Запись mx указывает на другой сервер, но файл hosts переопределяет DNS, а WP пытается доставить электронную почту локально. Удаление домена из файла hosts и перезапуск sendmail разрешили эту проблему.

Я не знаю, относится ли это к вам или нет, но поскольку ответа нет, я подумал, что дайте мне попробовать один раз.

Вообще-то, я столкнулся с той же проблемой, так как мой openHift-хост внезапно уступил сегодня и прекратил отправлять письма. Копаясь в коде и кодексе, я узнал о функции wp_mail (), и, наконец, google привел меня сюда, и я увидел, как это можно переопределить.

Основываясь на ответе @ Ralf912, я немного изменил сценарий, чтобы код использовал web 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' => 'abc@hotmail.com', ); $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 = 'abc@yahoo.com'; $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 = 'xyz@yahoo.com'; $subject = 'Testemail'; $message = 'It works Live!'; //echo 'To is: ' + $to; wp_mail( $to, $subject, $message, array() ); //print_r('Just sent!');*/ } 

И это сработало!

У меня была такая же ошибка, обе функции (почта и wp_mail) работали, но у меня все еще была эта досадная ошибка. Исправить было очень легко, но мне потребовалось несколько часов, чтобы найти причину. Поэтому я расскажу о своем решении проблемы, которая может быть (или может быть не такой) у вас.

Я попробовал функцию mail (), и она сработала, но когда вы ее протестируете, вы не укажете последний параметр, называемый параметрами в функции mail (). И WP это использует.

 @mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com"); 

Таким образом, в основном этот параметр («-fexample@exmaple.com») с флагом «-f» делает функцию mail () проверкой, указан ли адрес электронной почты «example@exmaple.com» в списке «доверенные электронные письма».

Поэтому, если это не так, оно возвращает false, что делает wp_mail () возвращает false и приводит к сообщению об ошибке.

Итак, решение заключается в том, чтобы попросить хостера сделать это за вас, или если вы используете cPanel, просто добавьте учетную запись электронной почты для этого адреса, и она автоматически добавит ее в «доверенный список».

У меня такая же проблема с сервером Ubuntu на Amazon EC2.I получить проблему, используя ссылку сброса пароля, а также другое уведомление по электронной почте не работает.

Итак, вот решения, которые работали для меня. Word-press использовал wp_mail() для отправки электронной почты, для которой нужен класс PHPMailer который использовал почтовую программу php, хранящуюся в /usr/sbin/sendmail .

Сначала используйте эту простую функцию php, чтобы проверить почту php

 <?php $to = "example@gmail.com"; $subject = "Test Email Function"; $txt = "Hello world!"; $headers = "From: webmaster@example.com" . "\r\n" . "CC: xyz@example.com"; mail($to,$subject,$txt,$headers); ?> 

Если это не работает, вам необходимо установить php mailer. Используйте эту команду для установки php-почты на сервере Ubuntu.

 sudo apt-get install sendmail 

Затем проверьте функции электронной почты для отправки текстовых сообщений.