Cum verifici dacă wp_mail funcționează corect?

20 mai 2013, 13:43:51
Vizualizări: 113K
Voturi: 8

Încerc să folosesc wp_mail (testez pe mașina locală) dar nu primesc niciun email. Fișierul php.ini are setat smtp_port = 25 și funcția PHP mail() funcționează până acum.

  • cum pot verifica dacă wp_mail funcționează
  • ce poate eșua

Iată codul funcției mele de email:

function mv_optin_mail($id, $data){

    $url = $id."-".mv_mail_token($id, $data['token']);

    add_filter( 'wp_mail_content_type', 'set_html_content_type' );
    add_filter( 'wp_mail_charset', 'utf8' );

    $headers[] = 'From: '.sender_signature.' <'.noreply_address.'>';    

    ob_start();
    include("optin-mail.php");
    $html_mail = ob_get_contents();
    ob_end_clean();

    wp_mail( $data['email'], 'Un Subiect', $html_mail, $headers );
    remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
    remove_filter( 'wp_mail_charset', 'utf8' );
}

Nu primesc nicio eroare. Există vreo modalitate de a activa jurnalizarea erorilor pentru WordPress?

Adresa noreply_address este noreply@root

3
Comentarii

Acum întrebările rămase sunt: Ce este mv_mail_token() și ce returnează și de unde vine constanta sender_signature și ce conține?

kaiser kaiser
23 iun. 2013 21:01:43

Kaiser, te rog, încearcă să răspunzi la întrebări... wp_mail_token() returnează un șir de caractere și sender_signature la fel.

helle helle
24 iun. 2013 11:38:04

gist de depanare

kaiser kaiser
24 iun. 2013 12:02:07
Toate răspunsurile la întrebare 6
1
17

Puteți folosi acțiunea 'wp_mail_failed' pentru a prinde o eroare de trimitere.

https://developer.wordpress.org/reference/hooks/wp_mail_failed/

21 mai 2017 09:21:54
Comentarii

și trebuie să adaugi acea acțiune înainte de wp_mail().

mike23 mike23
14 iun. 2024 19:09:44
0
13

Wordpress se bazează pe clasa PHPMailer pentru a trimite emailuri prin funcția PHP mail.

Deoarece funcția PHP mail returnează foarte puține informații după execuție (doar TRUE sau FALSE), sugerez să simplifici temporar funcția ta mv_optin_mail la minim pentru a verifica dacă funcția wp_mail funcționează.

Exemplu:

$mailResult = false;
$mailResult = wp_mail( 'youremail@bla.com', 'test if mail works', 'hurray' );
echo $mailResult;

Deoarece ai testat deja funcția PHP mail, emailul ar trebui să ajungă.

Dacă nu ajunge, problema se află în alte instrucțiuni ale funcției tale sau în clasa PHPMailer.

În astfel de cazuri, de obicei redenumesc funcția mea în ceva de genul:

function mv_optin_mail_backup( $id, $data ) {

Și adaug o funcție temporară cu același nume pentru a experimenta, astfel:

function mv_optin_mail( $id, $data ) {
    $mailResult = false;
    $mailResult = wp_mail( 'youremail@bla.com', 'test if mail works', 'hurray' );
    echo $mailResult;
}

Când am aflat care este problema, încep să folosesc din nou versiunea de rezervă.

Pentru a trimite un email folosind direct PHPMailer, poți face ceva de genul (nu pentru producție, doar pentru depanare):

add_action( 'phpmailer_init', 'my_phpmailer_example' );
function my_phpmailer_example( $phpmailer ) {
    $phpmailer->isSMTP();
    //$phpmailer->Host = 'smtp.example.com';
    //    $phpmailer->SMTPAuth = true; // Forțează utilizarea Username și Password pentru autentificare
    $phpmailer->Port = 25;
    //    $phpmailer->Username = 'yourusername';
    //    $phpmailer->Password = 'yourpassword';

    // Setări adiționale…
    //$phpmailer->SMTPSecure = "tls"; // Alege SSL sau TLS, dacă este necesar pentru serverul tău
    $phpmailer->setFrom( "fromemail@bla.com", "From Name" );
    $phpmailer->addAddress( "youremail@bla.com", "Your name" );
    $phpmailer->Subject    = "Testing PHPMailer";           
    $phpmailer->Body     = "Hurray! \n\n Great.";
    if( !$phpmailer->send() ) {
        echo "Mailer Error: " . $phpmailer->ErrorInfo;
    } else {
        echo "Message sent!";
    }                       

}       
1 nov. 2015 16:40:01
0

Ceea ce fac de obicei pentru a testa dacă funcția wp_mail() trimite corect e-mailuri este să mă înregistrez pe site-ul meu cu o altă adresă de e-mail și să văd dacă mesajul ajunge. Dacă ajunge, înseamnă că WordPress trimite corect e-mailuri (folosește wp_mail() pentru e-mailurile de înregistrare) și ar trebui să inspectezi funcția ta de trimitere e-mail pentru eventuale erori. Pentru a face asta, așa cum a sugerat @Tobias, ar trebui să elimini tot din funcția ta și să lași doar elementele de bază:

function wpse_100047() {
    echo wp_mail( 'youremail@example.com', 'Test WP Mail', 'Mail-ul funcționează' );
}

În plus, e-mailurile trimise de WordPress (ca toate e-mailurile trimise prin funcția PHP mail()) pot fi blocate de unele servere de e-mail (sau marcate ca spam), așa că este întotdeauna o idee bună să folosești SMTP (există multiple plugin-uri care fac asta) pentru e-mailuri pe site-ul live.

1 nov. 2015 17:58:46
0

Aș începe prin a activa WP_DEBUG în wp-config și a verifica dacă afișează ceva despre codul tău sau despre funcția wp_mail. Aceasta este singura metodă de depanare disponibilă imediat în WordPress.

De asemenea, poți folosi Easy WP SMTP și să activezi depanarea și/sau să-l configurezi pentru a utiliza SMTP. Există plugin-uri similare pe WordPress.org, dar știu că acesta are o opțiune bună de depanare. Dacă un serviciu precum GMail funcționează, atunci vei ști că este o problemă de setări ale serverului și nu din cauza acestui cod.

22 apr. 2014 04:44:05
0

Dacă dorești să oprești scriptul și să vezi doar obiectul $error, încearcă să adaugi acest cod ÎNAINTE ca metoda wp_mail() să fie executată:

add_action('wp_mail_failed', function ($error) {
    wp_die("<pre>".print_r($error, true)."</pre>");
});
2 feb. 2021 15:45:13
0

Sugestii foarte interesante au fost în acest document.

https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

În special, când lucrezi cu Azure Virtual Machine, configurația SELinux bloca conexiunile de ieșire.

Dacă vezi o eroare precum SMTP -> ERROR: Failed to connect to server: Permission denied (13) , este posibil să întâmpini o restricție SELinux care împiedică PHP-ul sau serverul web să trimită email-uri. Acest lucru este mai probabil să apară pe RedHat / Fedora / CentOS. Folosind comanda getsebool putem verifica dacă demonul httpd are permisiunea să stabilească o conexiune pe rețea și să trimită email-uri:

getsebool httpd_can_sendmail 
getsebool httpd_can_network_connect 

Această comandă va returna o valoare booleană on sau off. Dacă este off, o putem activa:

sudo setsebool -P httpd_can_sendmail 1 
sudo setsebool -P httpd_can_network_connect 1 

Dacă rulezi PHP-FPM prin fastcgi, poate fi necesar să aplici această setare pentru demonul fpm în loc de httpd.

15 apr. 2020 00:56:10