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

9

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

Просто чтобы посмотреть, может ли PHP отправлять электронные письма, я попытался сбросить пароль (потому что вы получите новый пароль по почте), и я получил сообщение:

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

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

Любые идеи?

БУКВ
источник
Пожалуйста, предоставьте отладочную информацию
s_ha_dum

Ответы:

9

Шаг за шагом: сначала найдите файл, в котором появляется сообщение об ошибке. Я использую 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      = 'your-email-adress@some-domain.tld';
    $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()не использует mail()функцию PHP . WordPress использует класс PHP ( PHPMailer ). Может быть, вам просто нужен плагин для использования SMTP вместо sendmail. Или проблема находится в другом месте. Мы не знаем Вы должны расследовать.

Ralf912
источник
Да я пытался углубиться в ядро , и это также приведет меня к PHPMailer, и он на самом деле делает использование РНР mail(). По крайней мере, в некоторых случаях (см. Строку 732 дюйма wp-includes/class-phpmailer.php. У меня нет доступа к атм ftp, но я постараюсь как можно скорее попробовать ваши предложения. Конечно, это должно меня куда-то привести. Спасибо большое!
qwerty
Я проверил wp_mail()и, кажется, работает нормально, я получил почту, как и ожидалось. WP по-прежнему не отправлял электронные письма с комментариями / сбросом пароля, и я ничего не получил в файле журнала (он не был создан), поэтому я попытался установить почтовый плагин SMTP и настроить новую учетную запись электронной почты для Wordpress. Это работает сейчас, но я до сих пор не понимаю, почему он не мог отправить раньше. Спасибо!
QWERTY
Я не получаю никакой ошибки и даже не
пишу
2

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

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


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

По умолчанию они обычно отключены, но, к сожалению, 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 улучшит обработку ошибок электронной почты в будущем.

Саймон Ист
источник
2

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

Итак, вот решения, которые работали для меня. 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 mail на сервер Ubuntu.

sudo apt-get install sendmail

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

CyberAbhay
источник
этот ответ - тот, который любой должен попробовать, прежде чем другие ответы, это путь
hatenine
1

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

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

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

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

И альт.

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

setsebool -P httpd_can_sendmail=1

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

Кенни Уайлэнд
источник
0

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

user16081
источник
0

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

На самом деле, я столкнулся с точно такой же проблемой, поскольку мой хост 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'      => '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!');*/
}

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

Прахлад Ери
источник
0

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

Я попробовал функцию mail (), и она сработала, но когда вы тестируете ее, вы не указываете последний параметр с именем 'parameters' в функции 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, просто добавьте учетную запись электронной почты для этого адреса, и он автоматически добавит ее в «список доверенных».

user3696815
источник
0

он называется -Manage зарегистрированных адресов электронной почты для отправки писем с помощью скриптов, т. е. (Wordpress)

  1. Войдите в свой Cpanel.
  2. Перейдите в раздел электронной почты>, затем нажмите «ID зарегистрированной электронной почты».
  3. затем добавьте (wordpress@yourdomain.com) или где ваш WordPress размещен. т.е. (wordpress@blog.yourdomain.com). затем отправьте, это займет несколько минут, чтобы активировать время ожидания от 15 минут до 1 часа, в зависимости от вашего хостинг-провайдера, тогда это будет работать.
Амрит Бхандари
источник
0

Я имел эту ошибку целую вечность и пробовал так много решений, которые не работали. У меня есть пользовательская установка Wordpress на AWS EC2. Прежде всего, убедитесь, что ваша почта AWS SES включена через службу поддержки, они должны находиться в одном (или близком) регионе в SES и EC2. Я использовал Google Suite (gsuite) для электронной почты для получения / отправки почты.

Убедитесь, что тестовое электронное письмо отправлено в AWS SES и Gsuite.

Установите плагин Wordpress для WP Mail SMTP, используйте опцию «Другой SMTP», возьмите свои учетные данные SMTP из AWS SES, вот где я застрял.

Вы должны включить флажок «SSL» для шифрования, это меняет порт на 465 для меня. Наконец мой тест электронной почты успешно отправлен с Worpdress.

Арчи Батлер
источник