WordPress відмовляється надсилати пошту, "... ваш хост може відключити функцію пошти ()"


9

Нещодавно я застосував на своєму веб-сайті область коментарів і спробував сповістити електронну пошту. Схоже, не хочеться надсилати сповіщення електронною поштою, коли вносяться нові коментарі.

Щоб побачити, чи PHP може надсилати електронні листи, я спробував скинути пароль (тому що ви отримаєте новий пароль поштою), і я отримав повідомлення:

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

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

Будь-які ідеї?


Відповіді:


9

Крок за кроком: спочатку знайдіть файл, де з’являється повідомлення про помилку. Я використовую Notepad ++ та команду CTRL+ Fдля пошуку у файлах. Корисно шукати лише перші кілька слів повідомлення про помилку, оскільки деякі повідомлення про помилки поєднуються з різних повідомлень.

Повідомлення про помилку з'являється в wp-login.phpі свята удача, тільки там. Тож давайте подивимось, чому ця помилка може статися.

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

Є дві умови. $messageповинні бути істинними (не порожній рядок, не хибний, не нульовий тощо). І wp_mail()не слід повертати помилкове.

На одному рядку вище є фільтр $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. Або проблема знаходиться в іншому місці. Ми не знаємо. Ви повинні розслідувати.


Так я намагався заглибитися в ядро , і це також приведе мене до PHPMailer, і він на справді робить використання РНР mail(). Принаймні в деяких випадках (див. Рядок 732 дюйма wp-includes/class-phpmailer.php. У мене немає доступу до ftp atm, але я спробую ваші пропозиції, як тільки можу. Безумовно, це повинно мене кудись привести. Дякую!
qwerty

Я перевірив, wp_mail()і, здається, це працює добре, я отримав пошту, як очікувалося. WP все одно не надсилатиме повідомлення про коментарі / скидання пароля, але я не отримав нічого у файлі журналу (він не створений), тому я спробував встановити плагін пошти SMTP та створити новий обліковий запис електронної пошти для Wordpress. Він працює зараз, але я досі не розумію, чому раніше не міг надіслати. Дякую!
qwerty

Я не отримую жодної помилки і навіть не пошти
baldraider

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. Я отримую проблему під час використання посилання для скидання пароля, а також інші повідомлення електронної пошти не працювали.

Ось ось рішення, яке працювало для мене. Використовуйте 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. За допомогою цієї команди встановіть php пошту на сервер Ubuntu.

sudo apt-get install sendmail

Потім перевірте функції електронної пошти, натиснуті на слово.


ця відповідь - це той, хто повинен спробувати, перш ніж будь-які інші відповіді, це шлях
hatenine

1

Якщо інші чудові відповіді тут не допомагають, спробуйте це:

Я зіткнувся з цією самою проблемою, і нічого, що я міг знайти в одній із пропозицій щодо WordPress, це вирішило для мене.

Тоді я почав досліджувати, чи не сама установка PHP відключила функцію пошти, але жодна з них не працювала. Все виглядало так, як було налаштовано належним чином.

Усі ці проблеми почалися для мене, коли я оновив свій сервер до CentOS 7, який використовує SELinux (Security Enhanced Linux), і те, що я дізнався за останні кілька тижнів з SELinux, - це те, що щось не працює, але все виглядає як це повинно працювати ... це означає, що SELinux мовчки і таємно блокує вас у фоновому режимі.

І віола.

Якщо ви працюєте та ОС, яка використовує SELinux, просто виконайте таку команду як корінь:

setsebool -P httpd_can_sendmail=1

Існує параметр безпеки, який по суті заважає веб-серверу надсилати електронну пошту. Коли ви перемкнете цей перемикач і скажете SELinux, що веб-сервер може надсилати електронну пошту, все раптом працює.


0

Я натрапив на це сьогодні; у моєму випадку ситуація трапилась через те, що файл хостів сервера має те саме ім’я домену електронної адреси, що вказує на localhost. Запис mx вказує на інший сервер, але файл хостів переважає DNS і WP намагається доставити електронну пошту локально. Видалення домену з хост-файлу та перезапуск sendmail вирішили цю проблему.


0

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

Насправді я зіткнувся з точно такою самою проблемою, оскільки раптово сьогодні мій хостинг змінився і перестав надсилати пошту. Переглядаючи код і кодекс, я дізнався про функцію 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

У мене однакова помилка, обидві функції (пошта та 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, просто додайте електронну пошту для цієї адреси, і він автоматично додасть її у "список надійних".


0

він називається - Управління зареєстрованими ідентифікаторами електронної пошти для надсилання пошти за допомогою скриптів, тобто. (Wordpress)

  1. Увійдіть у свій Cpanel.
  2. Перейдіть до розділу "Електронна пошта"> потім натисніть Ідентифіковані ідентифікатори електронної пошти.
  3. потім додайте (wordpress@yourdomain.com) або там, де розміщувався ваш wordpress. тобто (wordpress@blog.yourdomain.com). потім відправте, для активації зачекання потрібно 15 хвилин до 1 години, залежно від вашого хостинг-провайдера, тоді це спрацює.

0

У мене була помилка протягом століть і спробувала так багато рішень, які не спрацювали. У мене встановлена ​​спеціальна програма Wordpress на AWS EC2. Спочатку переконайтеся, що ваша пошта AWS SES увімкнена за допомогою підтримки, вона повинна знаходитися в одному (або близькому) регіоні в SES та EC2. Я використовував пакет Google (gsuite) для електронної пошти для отримання / надсилання пошти.

Переконайтеся, що тестовий лист надсилається в AWS SES та Gsuite.

Встановіть плагін Wordpress WP Mail SMTP, скористайтеся опцією "Інші SMTP", захопіть свої SMTP-дані з AWS SES, ось тут я застряг.

Потрібно включити галочку "SSL" для шифрування, це змінює порт на 465 для мене. Нарешті мій тест електронної пошти успішно надіслано від Worpdress.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.