wp_mail() non funziona in localhost
Sto provando a testare wp_mail() in locale. Quando faccio var_dump di wp_mail, ottengo un valore booleano false. Questo è il mio codice:
$to = "abcd@gmail.com";
$subject = 'my subject';
$message = 'I would like to work with you';
$headers = '';
$sent_message = wp_mail( $to, $subject, $message, $headers);
var_dump($sent_message); // ottengo boolean false qui
if ( $sent_message ) {
echo 'Il messaggio di test è stato inviato. Controlla la tua casella di posta.';
} else {
echo 'Il messaggio non è stato inviato!'; //questo viene stampato alla fine
}
Ogni aiuto sarebbe apprezzato.
wp_mail()
utilizza come fallback la funzione mail()
di PHP che richiede un MTA (Message Transfer Agent) configurato sul tuo host. Quindi devi installare e configurare un MTA. Se stai utilizzando un sistema operativo Linux-like, SSMTP è una soluzione semplice che ti permette di usare qualsiasi provider di posta per inviare le email di sistema via SMTP. Un altro MTA potrebbe essere Sendmail, un MTA completo ma più complesso da configurare.
Oppure puoi semplicemente utilizzare un plugin come WP Mail SMTP che implementa una connessione SMTP diretta in PHP bypassando l'uso della funzione mail()
.

Se vuoi solo testare la funzionalità di invio email durante lo sviluppo puoi usare mailcatcher: https://mailcatcher.me Non l'ho testato su Windows - ma su Mac OS funziona. Su altri sistemi Linux dovrebbe funzionare altrettanto bene.

Se qualcuno si imbatte in questa vecchia domanda:
Nel mio caso, il motivo era che avevo dato al sito in localhost un nome senza un dominio di primo livello. Ad esempio "miosito" (invece di "miosito.com"). Quindi, WordPress ha assunto l'indirizzo "From" come "wordpress@miosito".
Phpmailer (che viene chiamato da wp_mail) ha quindi generato l'errore: "Indirizzo non valido: (From): wordpress@miosito"
La soluzione è stata impostare esplicitamente l'indirizzo from tramite l'header:
$headers[] = 'From: Wordpress<wordpress@miosito.com>';
$sent_message = wp_mail( $to, $subject, $message, $headers );
Dopo questa modifica, wp_mail ha funzionato correttamente.

Ampliando la risposta utile di Ronni, ecco come puoi sovrascrivere l'indirizzo From:
per tutte le email in uscita:
if (defined('WP_CLI')) {
WP_CLI::add_wp_hook('wp_mail_from', function () {
return 'my@addr.com';
});
} else {
add_filter('wp_mail_from', function () {
return 'my@addr.com';
});
}
Per il mio ambiente di sviluppo locale, ho trovato utile inserirlo in wp-config.php
, proprio in fondo, dopo require_once ABSPATH . 'wp-settings.php';
.
Aggiunto un workaround per wp-cli, dato che non fornisce add_filter()
come farebbe normalmente WP.
