Cum verifici dacă wp_mail funcționează corect?
Î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

Puteți folosi acțiunea 'wp_mail_failed' pentru a prinde o eroare de trimitere.
https://developer.wordpress.org/reference/hooks/wp_mail_failed/

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!";
}
}

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.

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.

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 comandagetsebool
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.
