Come verificare se wp_mail funziona correttamente?

20 mag 2013, 13:43:51
Visualizzazioni: 113K
Voti: 8

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

3
Commenti

Ora le domande rimanenti sono: Cos'è mv_mail_token() e cosa restituisce, e da dove viene la costante sender_signature e cosa contiene?

kaiser kaiser
23 giu 2013 21:01:43

Kaiser, ascolta, per favore cerca di rispondere alle domande... wp_mail_token() restituisce una stringa e anche sender_signature fa lo stesso.

helle helle
24 giu 2013 11:38:04

debug gist

kaiser kaiser
24 giu 2013 12:02:07
Tutte le risposte alla domanda 6
1
17

Puoi utilizzare l'azione 'wp_mail_failed' per intercettare un errore di invio.

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

21 mag 2017 09:21:54
Commenti

e devi aggiungere quell'azione prima di wp_mail().

mike23 mike23
14 giu 2024 19:09:44
0
13

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

}       
1 nov 2015 16:40:01
0

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.

1 nov 2015 17:58:46
0

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.

22 apr 2014 04:44:05
0

Se vuoi interrompere lo script e visualizzare solo l'oggetto $error, prova ad aggiungere questo PRIMA che venga eseguito il metodo wp_mail():

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

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 comando getsebool 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.

15 apr 2020 00:56:10