Come verificare se wp_mail funziona correttamente?
Sto cercando di utilizzare wp_mail
(test su macchina locale) ma non ricevo alcuna email.
Il file php.ini
ha impostato smtp_port = 25
e la funzione PHP mail()
funziona finora.
- come posso verificare se wp_mail funziona
- cosa può fallire
Ecco il codice della mia funzione mail:
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'], 'Some Subject', $html_mail, $headers );
remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
remove_filter( 'wp_mail_charset', 'utf8' );
}
Non ricevo alcun errore. C'è un modo per attivare il log degli errori per WordPress?
L'indirizzo noreply_address
è noreply@root

Puoi utilizzare l'azione 'wp_mail_failed' per intercettare un errore di invio.
https://developer.wordpress.org/reference/hooks/wp_mail_failed/

WordPress si affida alla classe PHPMailer per inviare email attraverso la funzione mail
di PHP.
Poiché la funzione mail
di PHP restituisce pochissime informazioni dopo l'esecuzione (solo TRUE o FALSE), suggerisco di semplificare temporaneamente la tua funzione mv_optin_mail
al minimo per verificare se la funzione wp_mail
funziona.
Esempio:
$mailResult = false;
$mailResult = wp_mail( 'youremail@bla.com', 'test if mail works', 'hurray' );
echo $mailResult;
Dato che hai già testato la funzione mail
di PHP, l'email dovrebbe arrivare.
Se non arriva, il problema risiede nelle altre istruzioni della tua funzione o nella classe PHPMailer.
In casi come questo, solitamente rinomino la mia funzione in qualcosa come:
function mv_optin_mail_backup( $id, $data ) {
E aggiungo una funzione temporanea con lo stesso nome per fare delle prove, in questo modo:
function mv_optin_mail( $id, $data ) {
$mailResult = false;
$mailResult = wp_mail( 'youremail@bla.com', 'test if mail works', 'hurray' );
echo $mailResult;
}
Quando ho capito qual è il problema, torno a utilizzare la versione di backup.
Per inviare un'email utilizzando direttamente PHPMailer puoi fare qualcosa del genere (non per produzione, solo per debug):
add_action( 'phpmailer_init', 'my_phpmailer_example' );
function my_phpmailer_example( $phpmailer ) {
$phpmailer->isSMTP();
//$phpmailer->Host = 'smtp.example.com';
// $phpmailer->SMTPAuth = true; // Forza l'uso di Username e Password per autenticarsi
$phpmailer->Port = 25;
// $phpmailer->Username = 'yourusername';
// $phpmailer->Password = 'yourpassword';
// Impostazioni aggiuntive…
//$phpmailer->SMTPSecure = "tls"; // Scegli SSL o TLS, se necessario per il tuo server
$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!";
}
}

Ciò che faccio solitamente per verificare se wp_mail()
sta inviando correttamente le email è semplicemente registrarmi sul mio sito con un altro indirizzo email e verificare se l'email arriva. Se arriva, significa che WordPress sta inviando correttamente le email (utilizza wp_mail()
per inviare le email di registrazione) e dovresti controllare la tua funzione di invio email per eventuali errori. Per farlo, come suggerito da @Tobias, dovresti rimuovere tutto dalla tua funzione di invio email e lasciare solo l'essenziale:
function wpse_100047() {
echo wp_mail( 'tuoemail@esempio.com', 'Test WP Mail', 'La mail funziona' );
}
Inoltre, le email inviate da WordPress (come tutte le email inviate dalla funzione mail()
di PHP) potrebbero essere bloccate da alcuni server email (o contrassegnate come spam) quindi è sempre una buona idea utilizzare SMTP (ci sono diversi plugin che lo fanno) per le email sul sito in produzione.

Inizierei abilitando WP_DEBUG in wp-config per verificare se mostra qualcosa riguardo il tuo codice o la funzione wp_mail. Questa è l'opzione di debug più immediata disponibile in WordPress.
Inoltre, puoi utilizzare Easy WP SMTP e attivare il debug e/o configurarlo per usare SMTP. Ci sono plugin simili su WordPress.org, ma so che questo ha una buona opzione di debug. Se un servizio come GMail funziona, saprai che è un problema di configurazione del server e non di questo codice.

Suggerimenti molto interessanti erano presenti in questo documento.
https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
In particolare, lavorando con Azure Virtual Machine, la configurazione SELinux stava bloccando le connessioni in uscita.
Se vedi un errore come
SMTP -> ERROR: Failed to connect to server: Permission denied (13)
, potresti incontrare SELinux che impedisce a PHP o al server web di inviare email. Questo è particolarmente probabile su RedHat / Fedora / Centos. Usando il comandogetsebool
possiamo verificare se il demone httpd è autorizzato a stabilire una connessione di rete e inviare un'email:getsebool httpd_can_sendmail getsebool httpd_can_network_connect
Questo comando restituirà un valore booleano on o off. Se è off, possiamo attivarlo:
sudo setsebool -P httpd_can_sendmail 1 sudo setsebool -P httpd_can_network_connect 1
Se stai eseguendo PHP-FPM via fastcgi, potresti dover applicare questo al demone fpm anziché a httpd.
