WordPress odmawia wysłania poczty, „… Twój host mógł wyłączyć funkcję mail ()”

9

Niedawno zaimplementowałem obszar komentarzy na mojej stronie i starałem się, aby powiadomienie e-mail działało. Wydaje się, że nie chce wysyłać powiadomień e-mail o nowych komentarzach.

Aby zobaczyć, czy PHP może wysyłać e-maile, próbowałem zresetować hasło (ponieważ otrzymasz nowe hasło pocztą), i dostałem wiadomość:

Nie można wysłać wiadomości e-mail. Możliwy powód: Twój host mógł wyłączyć funkcję mail ()

Zaznaczyłem pola wyboru w Ustawieniach -> Dyskusja, a e-mail jest prawidłowy, więc nie jest to problem z ustawieniami. Próbowałem utworzyć plik PHP i wysłać za pomocą mail(), i wysłał pomyślnie. Więc z WordPress musi się dziać coś dziwnego.

Jakieś pomysły?

qwerty
źródło

Odpowiedzi:

9

Krok po kroku: Najpierw znajdź plik, w którym pojawia się komunikat o błędzie. Do wyszukiwania plików używam Notepad ++ i polecenia CTRL+ F. Dobrym pomysłem jest wyszukiwanie tylko kilku pierwszych słów komunikatu o błędzie, ponieważ niektóre komunikaty o błędach są połączone z różnymi komunikatami.

Twój komunikat o błędzie pojawia się wp-login.phpi święte szczęście, tylko tam. Zobaczmy więc, dlaczego ten błąd może wystąpić.

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

Są dwa warunki. $messagemuszą być prawdziwe (nie pusty ciąg, nie fałsz, nie zero itp.). I wp_mail()nie powinien zwracać fałszu.

Jeden wiersz powyżej zawiera filtr $message = apply_filters('retrieve_password_message', $message, $key);, więc możliwe jest, że wtyczka (lub motyw) użyje tego filtra i zwróci wartość, która nie jest prawdziwa (pusty ciąg, fałsz, zero, itd.).

Ale o wiele łatwiej jest sprawdzić, czy wp_mail()działa, czy nie. Napisz małą wtyczkę, aby wysłać do siebie wiadomość testową:

<?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 );
}

(To jest kod PHP5.3. Jeśli korzystasz z PHP5.2, usuń elementy przestrzeni nazw)

Wtyczka powinna wysłać testmail natychmiast po aktywacji. Jeśli nie, wywołanie niektórych stron zaplecza (np. Pulpit nawigacyjny) powinno to zrobić.

Jeśli testmail nie dotrze, prawdopodobnie masz problem z wp_mail(). Włącz więc debugowanie:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );

Umieść ten kod w swoim wp-config.phpi ponów próbę wysłania sobie testmaila. Teraz powinieneś dostać kilka komunikatów o błędach, które również powinny się zalogować wp-content/debug.log(dziennik debugowania może się bardzo powiększyć, jeśli więcej błędów jest spowodowanych przez wtyczki i / lub motywy).

W tym momencie masz dobre informacje, jeśli się wp_mail()nie powiedzie, a jeśli tak, to dlaczego. Jeśli wp_mail()działa poprawnie i przyszedł testmail, wróć na górę i dowiedz się, dlaczego $messageto nieprawda.

Jeśli masz problemy wp_mail(), pamiętaj, że wp_mail()nie używa mail()funkcji PHP . WordPress korzysta z klasy PHP ( PHPMailer ). Może potrzebujesz wtyczki, aby korzystać z SMTP zamiast sendmaila. Lub problem znajduje się w innym miejscu. Nie wiemy Musisz to zbadać.

Ralf912
źródło
Tak próbowałem kopanie w rdzeniu i to również doprowadzić mnie do PHPMailer, i faktycznie robi wykorzystanie PHP mail(). Przynajmniej w niektórych przypadkach (patrz linia 732 w wp-includes/class-phpmailer.phpnie mam dostępu do ftp atm ale postaram swoje sugestie jak tylko mogę pewnością musi to prowadzić mnie gdzieś dziękuję...!
qwerty
Testowałem wp_mail()i wydaje się, że działa dobrze, otrzymałem pocztę zgodnie z oczekiwaniami. WP nadal nie wysyłało wiadomości e-mail z komentarzem / resetowaniem hasła, a ja nie dostałem niczego w pliku dziennika (nie został utworzony), więc próbowałem zainstalować wtyczkę poczty SMTP i skonfigurować nowe konto e-mail dla Wordpress. Działa teraz, ale nadal nie rozumiem, dlaczego wcześniej nie mógł wysłać. Dzięki!
qwerty
Nie dostaję żadnego błędu, a nawet nie
wysyłam
2

Jest to bardzo irytujący komunikat o błędzie, ponieważ może to być wiele rzeczy i nie ujawnia rzeczywistego błędu (który często jest wyciszany w innych częściach kodu).

Ten błąd pojawia się, gdy wp_mail()funkcja zwraca false, co z kolei może się zdarzyć, jeśli phpmailer->Send()zwróci false lub zgłosi wyjątek.


Jak wyświetlić ostrzeżenia z mail()funkcji PHP

Są one zwykle domyślnie wyciszone, ale niestety WordPress nigdy ich nie przechwytuje. Aby pokazać je po prostu usunąć @znaki z @mail(...w wp-includes/class-phpmailer.phpw mailPassthru()funkcji:

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);
}


Jak znaleźć inne możliwe przyczyny:

  1. Dodaj pojedynczy wiersz na dole wp_mail()w /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. Zrzuci pełne informacje o tym, gdzie zgłoszono wyjątek. Niestety czasami zawiera ten nieprzydatny komunikat o wyjątku: „ Nie można utworzyć instancji funkcji poczty ”. Tak, dzięki WordPress, to naprawdę pomocne.

  3. Patrząc na wyjątek, możesz znaleźć numer linii błędu i, mam nadzieję, prześledzić go z powrotem przez kod, aby znaleźć prawdziwą przyczynę.

Powodzenia. Mam nadzieję, że WordPress poprawi obsługę błędów e-mail w pewnym momencie w przyszłości.

Simon East
źródło
2

Mam ten sam problem z serwerem Ubuntu na Amazon EC2. Występuje problem podczas korzystania z linku resetowania hasła, a także innych powiadomień e-mail nie działa.

Oto rozwiązania, które działały dla mnie. Word-press użył wp_mail()funkcji do wysłania wiadomości e-mail, która potrzebuje PHPMailerklasy, w której przechowywany jest mailer php /usr/sbin/sendmail.

Użyj najpierw tej prostej funkcji php, aby sprawdzić pocztę 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);
?>

Jeśli to nie działa, musisz zainstalować program pocztowy PHP. Użyj tego polecenia, aby zainstalować pocztę php na serwerze Ubuntu.

sudo apt-get install sendmail

Następnie sprawdź funkcje wiadomości e-mail za pomocą prasy.

CyberAbhay
źródło
ta odpowiedź jest tą, którą każdy powinien wypróbować przed jakąkolwiek inną odpowiedzią, to jest droga
hatenine
1

Jeśli inne świetne odpowiedzi tutaj nie pomogą, spróbuj tego:

Napotkałem ten sam problem i nic, co nie znalazłem w żadnej z sugestii dotyczących WordPress, nie rozwiązało go dla mnie.

Potem zacząłem sprawdzać, czy to sama instalacja PHP wyłączyła funkcję poczty, ale żadna z nich również nie działała. Wszystko wyglądało, jakby zostało poprawnie skonfigurowane.

Wszystkie te problemy zaczęły się dla mnie, kiedy uaktualniłem swój serwer do CentOS 7, który korzysta z SELinux (Security Enhanced Linux), a nauczyłem się w ciągu ostatnich kilku tygodni z SELinux, że jeśli coś nie działa, ale wszystko wygląda jak powinien działać ... oznacza to, że SELinux cicho i potajemnie blokuje ci dostęp do tła.

I altówka.

Jeśli działasz, a system operacyjny korzysta z SELinux, po prostu wykonaj następującą komendę jako root:

setsebool -P httpd_can_sendmail=1

Istnieje ustawienie zabezpieczeń, które z natury uniemożliwia serwerowi wysyłanie wiadomości e-mail. Kiedy przełączysz ten przełącznik i powiesz SELinux, że serwer WWW może wysłać wiadomość e-mail, wszystko nagle działa.

Kenny Wyland
źródło
0

Wpadłem na to dzisiaj; w moim przypadku sytuacja się wydarzyła, ponieważ plik hosts serwera ma taką samą nazwę domeny jak adres e-mail, wskazując na localhost. Rekord MX wskazuje na inny serwer, ale plik hosts zastępuje DNS, a WP próbuje dostarczyć pocztę lokalnie. Usunięcie domeny z pliku hosts i ponowne uruchomienie sendmail rozwiązało ten problem.

użytkownik16081
źródło
0

Nie wiem, czy to nadal dotyczy ciebie, czy nie, ale ponieważ nie ma wybranej odpowiedzi, pomyślałem, że raz spróbuję.

Właściwie napotkałem dokładnie ten sam problem, ponieważ mój gospodarz openhift nagle ustąpił dzisiaj i przestał wysyłać maile. Przekopując się przez kod i kodeks, dowiedziałem się o funkcji wp_mail () i wreszcie google doprowadziło mnie tutaj i zobaczyłem, jak można to zmienić.

Opierając się na odpowiedzi @ Ralf912, zmodyfikowałem nieco skrypt, tak aby kod używał interfejsu WWW sendgrid.com do wysyłania wiadomości e-mail zamiast domyślnego Wordpress (domyślam się:

<?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 zadziałało!

Prahlad Yeri
źródło
0

Miałem ten sam błąd, obie funkcje (poczta i wp_mail) działały, ale nadal miałem ten irytujący błąd. Poprawka była bardzo łatwa, ale znalezienie przyczyny zajęło mi kilka godzin. Podzielę się tutaj moim rozwiązaniem problemu, który może być (lub nie) taki sam jak twój.

Próbowałem funkcji mail () i działała, ale podczas jej testowania nie podajesz ostatniego parametru o nazwie „parametry” w funkcji mail (). I WP tego używa.

@mail("[email protected]",$title,$body,$headers,"[email protected]");

Zasadniczo ten parametr („[email protected]”) z flagą „-f” powoduje, że funkcja mail () sprawdza, czy adres e-mail „[email protected]” znajduje się na liście „zaufanych wiadomości e-mail”.

Więc jeśli nie, zwraca false, co powoduje, że wp_mail () zwraca false i prowadzi do komunikatu o błędzie.

Rozwiązaniem jest więc poproszenie hosta o zrobienie tego za ciebie, a jeśli używasz cPanel, po prostu dodaj konto e-mail dla tego adresu, a on automatycznie doda go do „zaufanej listy”.

użytkownik3696815
źródło
0

nazywało się to - Zarządzaj zarejestrowanymi identyfikatorami e-mail do wysyłania wiadomości e-mail za pomocą skryptów, tj. (Wordpress)

  1. Zaloguj się do swojego panelu.
  2. Przejdź do sekcji E-mail> następnie kliknij Zarejestrowane identyfikatory e-mail.
  3. następnie dodaj ([email protected]) lub miejsce, w którym hostowane było twoje wordpress. tj. ([email protected]). następnie prześlij, aktywacja potrwa kilka minut, odczekaj 15 minut do 1 godziny w zależności od dostawcy usług hostingowych, a następnie zadziała.
Amrit Bhandari
źródło
0

Miałem ten błąd przez wieki i próbowałem tak wielu rozwiązań, które nie działały. Mam niestandardową instalację Wordpress na AWS EC2. Po pierwsze upewnij się, że Twoja poczta AWS SES jest włączona poprzez wsparcie, muszą znajdować się w tym samym (lub bliskim) regionie w SES i EC2. Użyłem pakietu Google (gsuite) do poczty e-mail do odbierania / wysyłania poczty.

Upewnij się, że testowy e-mail wysyła AWS SES i Gsuite.

Zainstaluj wtyczkę Wordpress WP Mail SMTP, użyj opcji „Inne SMTP”, pobierz swoje poświadczenia SMTP z AWS SES, tutaj utknąłem.

Musisz włączyć pole „SSL” dla Szyfrowania, co dla mnie zmienia port na 465. W końcu mój test e-mail został pomyślnie wysłany z Worpdress.

Archie Butler
źródło