Cum se configurează SMTP programatic

13 dec. 2012, 10:48:08
Vizualizări: 55.1K
Voturi: 23

Să presupunem că avem un site WordPress gol și dorim să configurăm setările SMTP programatic în plugin-ul sau tema noastră. Care este cea mai simplă modalitate de a face acest lucru fără a modifica fișierele core?

0
Toate răspunsurile la întrebare 3
12
36

În primul rând, dacă ne uităm la implementarea funcției wp_mail, vom observa că această funcție utilizează clasa PHPMailer pentru a trimite emailuri. De asemenea, putem observa că există un apel de funcție hardcodat $phpmailer->IsMail();, care setează utilizarea funcției PHP mail(). Asta înseamnă că nu putem folosi setările SMTP cu ea. Trebuie să apelăm funcția isSMTP a clasei PHPMailer. Și, de asemenea, trebuie să setăm și setările noastre SMTP.

Pentru a realiza acest lucru, trebuie să avem acces la variabila $phpmailer. Și aici ajungem la acțiunea phpmailer_init, care este apelată înainte de a trimite un email. Deci putem face ceea ce avem nevoie prin scrierea handler-ului nostru de acțiune:

add_action( 'phpmailer_init', 'wpse8170_phpmailer_init' );
function wpse8170_phpmailer_init( PHPMailer $phpmailer ) {
    $phpmailer->Host = 'your.smtp.server.here';
    $phpmailer->Port = 25; // poate fi diferit
    $phpmailer->Username = 'your_username@example.com'; // dacă este necesar
    $phpmailer->Password = 'yourpassword'; // dacă este necesar
    $phpmailer->SMTPAuth = true; // dacă este necesar
    // $phpmailer->SMTPSecure = 'ssl'; // activează dacă este necesar, 'tls' este o altă valoare posibilă

    $phpmailer->IsSMTP();
}

Și asta e tot.

13 dec. 2012 10:48:08
Comentarii

Lucruri interesante, Eugene, mulțumesc! Presupun că aceste 10 linii de cod pot înlocui un întreg plugin SMTP...(?)

brasofilo brasofilo
13 dec. 2012 13:59:42

@brasofilo mulțumesc! Cred că nu poate înlocui un plugin SMTP, deoarece plugin-ul îți permite să configurezi setările din panoul de administrare. Acest fragment este doar o practică recomandată despre "cum să modifici setările de e-mail programatic" fără a modifica fișierele de bază sau fără a rescrie funcția wp_mail.

Eugene Manuilov Eugene Manuilov
13 dec. 2012 14:40:07

Poate un link către nucleu? Tocmai am aflat că trebuie să folosim asta pentru SSL: $phpmailer->SMTPSecure = 'ssl';, sau 'tls' dacă este cazul. ::: Din nou:, excelent lucru!

brasofilo brasofilo
15 ian. 2013 12:24:45

@brasofilo da, sunt de acord. Simte-te liber să editezi răspunsul dacă dorești. Mulțumesc pentru ajutor.

Eugene Manuilov Eugene Manuilov
15 ian. 2013 13:14:19

Unde ar trebui plasat acest cod? Vreau ca toate temele mele să folosească aceleași servere SMTP.

Anjan Anjan
10 ian. 2014 16:43:23

@Anjan creează propriul tău plugin.

Eugene Manuilov Eugene Manuilov
10 ian. 2014 17:49:10

Foarte ciudat că WordPress nu face acest lucru mai ușor, ai crede că ar fi ceva comun de modificat.

Carson Reinke Carson Reinke
30 apr. 2015 16:14:49

Se pare că nu mai funcționează.

Etienne Dupuis Etienne Dupuis
2 nov. 2015 18:56:21

Poate cineva să confirme dacă încă funcționează?

Jack Jack
9 nov. 2015 13:51:22

funcționează pentru mine, @JackNicholson ar trebui să verifici și tu pe partea ta.

Eugene Manuilov Eugene Manuilov
9 nov. 2015 16:41:18

Am folosit acest cod dar WordPress trimite prin php mail(). Cum să forțez WordPress să trimită doar prin SMTP? Când folosesc wp_mail("hossein@hashemiui.com", "test", "test"); nu trimite prin SMTP

Hossein Hashemi Hossein Hashemi
28 ian. 2017 01:55:48

În WordPress 5.5 există o versiune mai nouă de PHPMailer. Codul de mai sus va genera o eroare. Schimbă PHPMailer $phpmailer în \PHPMailer\PHPMailer\PHPMailer $phpmailer și totul va funcționa din nou!

Betty Betty
11 iun. 2021 11:36:46
Arată celelalte 7 comentarii
0
11

Supliment la răspunsul lui @EugeneManuilov.

Setări SMTP

În mod implicit, acestea pot fi setate - așa cum a răspuns deja @EugeneManuilov - doar prin intermediul unui callback atașat la un do_action_ref_array(). Sursă/core.

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer SMTP Settings
 * Description: Activează servere SMTP, autentificare SSL/TSL și setări SMTP.
 */

add_action( 'phpmailer_init', 'phpmailerSMTP' );
function phpmailerSMTP( $phpmailer )
{
    # $phpmailer->IsSMTP();
    # $phpmailer->SMTPAuth   = true;  // Autentificare
    # $phpmailer->Host       = '';
    # $phpmailer->Username   = '';
    # $phpmailer->Password   = '';
    # $phpmailer->SMTPSecure = 'ssl'; // Activează dacă este necesar - 'tls' este o altă valoare posibilă
    # $phpmailer->Port       = 26;    // Port SMTP - 26 este pentru GMail
}

Excepții SMTP

În mod implicit, WordPress nu oferă niciun output de depanare. În schimb, returnează doar FALSE dacă apare o eroare. Iată un mic plugin pentru a remedia acest lucru:

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer Exceptions & SMTP
 * Description: WordPress în mod implicit returnează <code>FALSE</code> în loc de un <code>Exception</code>. Acest plugin remediază acest lucru.
 */

add_action( 'phpmailer_init', 'WCMphpmailerException' );
function WCMphpmailerException( $phpmailer )
{
    if ( ! defined( 'WP_DEBUG' ) OR ! WP_DEBUG )
    {
        $phpmailer->SMTPDebug = 0;
        $phpmailer->debug = 0;
        return;
    }
    if ( ! current_user_can( 'manage_options' )
        return;

    // Activează SMTP
    # $phpmailer->IsSMTP();
    $phpmailer->SMTPDebug = 2;
    $phpmailer->debug     = 1;

    // Folosește `var_dump( $data )` pentru a inspecta datele în cel mai recent punct și a vedea
    // dacă ceva s-a schimbat în core. Ar trebui să iei în considerare afișarea lor în timpul
    // filtrului `wp_mail` pentru a obține starea originală pentru comparație.
    $data = apply_filters(
        'wp_mail',
        compact( 'to', 'subject', 'message', 'headers', 'attachments' )
    );

    current_user_can( 'manage_options' )
        AND print htmlspecialchars( var_export( $phpmailer, true ) );

    $error = null;
    try
    {
        $sent = $phpmailer->Send();
        ! $sent AND $error = new WP_Error( 'phpmailerError', $sent->ErrorInfo );
    }
    catch ( phpmailerException $e )
    {
        $error = new WP_Error( 'phpmailerException', $e->errorMessage() );
    }
    catch ( Exception $e )
    {
        $error = new WP_Error( 'defaultException', $e->getMessage() );
    }

    if ( is_wp_error( $error ) )
        return printf(
            "%s: %s",
            $error->get_error_code(),
            $error->get_error_message()
        );
}

Repository

Ambele pluginuri sunt disponibile în acest Gist pe GitHub, așa că ia în considerare verificarea lor de acolo pentru a obține orice actualizări.

22 iun. 2013 13:17:17
2

Alte răspunsuri la această postare, deși oferă o soluție funcțională, nu abordează problema de securitate a stocării credențialelor SMTP într-un fișier de plugin sau în functions.php. În unele cazuri, acest lucru poate fi acceptabil, dar cele mai bune practici recomandă stocarea acestor informații într-un mod mai sigur. Nu există un motiv întemeiat să nu urmați cele mai bune practici atunci când vine vorba de protejarea credențialelor.

Unii ar sugera salvarea lor în baza de date ca opțiune, dar aceasta prezintă aceleași probleme de securitate în funcție de numărul de utilizatori administrativi pe care îi are site-ul dvs. și dacă acești utilizatori ar trebui să poată vedea aceste credențiale. Acesta este și motivul pentru care nu ar trebui să folosiți un plugin pentru aceasta.

Cea mai bună metodă este să definiți constante pentru informațiile phpmailer în fișierul wp-config.php. Aceasta a fost deja discutată ca o caracteristică în Componenta Mail, dar nu a fost acceptată ca o îmbunătățire până în prezent. Totuși, o puteți face singur adăugând următoarele în wp-config.php:

/**
 * Definiți următoarele constante în wp-config.php
 * Acestea ar trebui adăugate undeva ÎNAINTE de
 * definirea constantei ABSPATH.
 */
define( 'SMTP_USER',   'user@example.com' );    // Numele de utilizator pentru autentificarea SMTP
define( 'SMTP_PASS',   'parola smtp' );        // Parola pentru autentificarea SMTP
define( 'SMTP_HOST',   'smtp.example.com' );   // Numele gazdei serverului de mail
define( 'SMTP_FROM',   'website@example.com' );// Adresa de email SMTP expeditor
define( 'SMTP_NAME',   'ex. Nume Site' );      // Numele expeditorului SMTP
define( 'SMTP_PORT',   '25' );                 // Portul SMTP - probabil 25, 465 sau 587
define( 'SMTP_SECURE', 'tls' );                // Sistemul de criptare - ssl sau tls
define( 'SMTP_AUTH',    true );                // Utilizare autentificare SMTP (true|false)
define( 'SMTP_DEBUG',   0 );                   // Doar pentru depanare, setați la 1 sau 2

Odată ce acestea sunt definite în wp-config.php, pot fi folosite oriunde utilizând constantele definite. Astfel, le puteți utiliza într-un fișier de plugin sau în functions.php. (Specific pentru OP, folosiți un fișier de plugin.)

/**
 * Această funcție va conecta wp_mail la serverul SMTP
 * autentificat. Valorile sunt constante definite în wp-config.php
 */
add_action( 'phpmailer_init', 'send_smtp_email' );
function send_smtp_email( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host       = SMTP_HOST;
    $phpmailer->SMTPAuth   = SMTP_AUTH;
    $phpmailer->Port       = SMTP_PORT;
    $phpmailer->Username   = SMTP_USER;
    $phpmailer->Password   = SMTP_PASS;
    $phpmailer->SMTPSecure = SMTP_SECURE;
    $phpmailer->From       = SMTP_FROM;
    $phpmailer->FromName   = SMTP_NAME;
}

Există mai multe detalii despre aceasta în această postare și un gist pe github aici.

10 aug. 2017 18:57:05
Comentarii

O soluție foarte bună!

Phill Healey Phill Healey
8 sept. 2017 21:14:04

O mică completare: Este inutil să spunem, nu stocați acreditări în sistemul de control al versiunilor. Folosiți în schimb un fișier .env ignorat de git. Dar oricum, nimeni care introduce informații sensibile în wp-config.php nu folosește controlul versiunilor...

jsphpl jsphpl
29 aug. 2018 18:32:52