web-dev-qa-db-fra.com

Vérifiez pour vérifier si wp_mail fonctionne correctement?

J'essaie d'utiliser wp_mail (tester sur la machine locale) mais aucun courrier n'est reçu. Le php.ini a smtp_port = 25 défini et le php mail() fonctionne jusqu'à présent.

  • comment puis-je vérifier si wp_mail fonctionne
  • ce qui peut échouer

Voici le code de ma fonction 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' );
}

Je ne reçois aucune erreur. Y at-il un moyen de basculer error-loggin pour wordpress?

Le noreply_address est noreply@root

2
helle

Wordpress s'appuie sur la classe PHPMailer pour envoyer un courrier électronique via la fonction mail de PHP.

Puisque la fonction mail de PHP retourne très peu d'informations après l'exécution (uniquement VRAI ou FAUX), je suggère de supprimer temporairement votre fonction mv_optin_mail au minimum afin de voir si les fonctions wp_mail fonctionnent.

Exemple:

$mailResult = false;
$mailResult = wp_mail( '[email protected]', 'test if mail works', 'hurray' );
echo $mailResult;

Puisque vous avez déjà testé la fonction mail de PHP, le courrier devrait arriver.

Si ce n'est pas le cas, le problème réside dans les autres instructions de votre fonction ou dans la classe PHPMailer.

Dans des cas comme celui-ci, je renomme habituellement ma fonction en quelque chose comme:

function mv_optin_mail_backup( $id, $data ) {

Et ajoutez une fonction temporaire avec le même nom pour déconner avec:

function mv_optin_mail( $id, $data ) {
    $mailResult = false;
    $mailResult = wp_mail( '[email protected]', 'test if mail works', 'hurray' );
    echo $mailResult;
}

Une fois le problème résolu, je recommence à utiliser la version de sauvegarde.

Pour envoyer un courrier directement à l'aide de PHPMailer, vous pouvez procéder de la manière suivante (pas pour la production, mais uniquement pour le débogage):

add_action( 'phpmailer_init', 'my_phpmailer_example' );
function my_phpmailer_example( $phpmailer ) {
    $phpmailer->isSMTP();
    //$phpmailer->Host = 'smtp.example.com';
    //    $phpmailer->SMTPAuth = true; // Force it to use Username and Password to authenticate
    $phpmailer->Port = 25;
    //    $phpmailer->Username = 'yourusername';
    //    $phpmailer->Password = 'yourpassword';

    // Additional settings…
    //$phpmailer->SMTPSecure = "tls"; // Choose SSL or TLS, if necessary for your server
    $phpmailer->setFrom( "[email protected]", "From Name" );
    $phpmailer->addAddress( "[email protected]", "Your name" );
    $phpmailer->Subject    = "Testing PHPMailer";           
    $phpmailer->Body     = "Hurray! \n\n Great.";
    if( !$phpmailer->send() ) {
        echo "Mailer Error: " . $phpmailer->ErrorInfo;
    } else {
        echo "Message sent!";
    }                       

}       
4
Tobias Beuving

Vous pouvez utiliser l'action 'wp_mail_failed' pour intercepter une erreur d'envoi.

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

4
gbones

Ce que je fais habituellement pour vérifier si wp_mail() envoie correctement des courriers électroniques, c’est simplement s’inscrire sur mon site Web avec une autre adresse électronique et voir si le courrier électronique arrive. Si tel est le cas, cela signifie que WordPress envoie correctement des courriers électroniques (il utilise wp_mail() pour envoyer des courriers électroniques d’enregistrement) et vous devez vérifier si votre fonction d’envoi de courrier électronique contient des erreurs. Pour ce faire, comme @Tobias l’a suggéré, vous devez tout retirer de votre fonction d’envoi de courrier et ne conserver que les éléments de base:

function wpse_100047() {
    echo wp_mail( '[email protected]', 'WP Mail Test', 'Mail is working' );
}

De plus, les courriers électroniques envoyés par WordPress (comme tous les courriers électroniques envoyés par la fonction mail() de PHP peuvent être bloqués par certains serveurs de messagerie (ou marqués comme spam). Il est donc recommandé d’utiliser SMTP (plusieurs plugins qui le font). ) pour les courriels sur le site Web en direct.

3

Je commencerais par activer WP_DEBUG dans wp-config et voir si cela vous indique quoi que ce soit à propos de votre code ou du code de la fonction wp_mail. C’est à peu près tout pour déboguer directement avec WP.

Vous pouvez également utiliser Easy WP SMTP et activer le débogage et/ou le configurer pour qu'il utilise SMTP. Il existe des plugins similaires sur WordPress.org mais je sais que celui-ci a une bonne option de débogage. Si quelque chose comme GMail fonctionne, alors vous saurez qu'il s'agit d'un paramètre de serveur et non de ce code.

2
Andrew T