SMTP programlı olarak nasıl ayarlanır


18

Boş bir WP sitemiz olduğunu ve SMTP ayarlarını eklenti veya temamızda programlı olarak ayarlamak istediğimizi varsayalım. Temel dosyaları değiştirmeden bunu yapmanın en kolay yolu nedir?

Yanıtlar:


31

Her şeyden önce, wp_mailfonksiyonun uygulanmasına bakarsak, bu fonksiyonun PHPMailere-posta göndermek için sınıf kullandığını göreceğiz . Ayrıca $phpmailer->IsMail();PHP'nin mail()işlevini kullanmak için ayarlanmış sabit kodlu işlev çağrısı olduğunu fark edebiliriz . Bu, SMTP ayarlarını onunla kullanamayacağımız anlamına gelir. Sınıfın isSMTPişlevini çağırmalıyız PHPMailer. Ayrıca SMTP ayarlarımızı da yapmamız gerekiyor.

Bunu başarmak için $phpmailerdeğişkene erişmemiz gerekir. Ve burada phpmailer_initbir e-posta göndermeden önce çağrılan harekete geçiyoruz. Böylece eylem işleyicimizi yazarak ihtiyacımız olanı yapabiliriz:

add_action( 'phpmailer_init', 'wpse8170_phpmailer_init' );
function wpse8170_phpmailer_init( PHPMailer $phpmailer ) {
    $phpmailer->Host = 'your.smtp.server.here';
    $phpmailer->Port = 25; // could be different
    $phpmailer->Username = 'your_username@example.com'; // if required
    $phpmailer->Password = 'yourpassword'; // if required
    $phpmailer->SMTPAuth = true; // if required
    // $phpmailer->SMTPSecure = 'ssl'; // enable if required, 'tls' is another possible value

    $phpmailer->IsSMTP();
}

Ve hepsi bu.


Güzel şeyler Eugene, teşekkürler! Sanırım bu 10 kod satırı tüm SMTP eklentisinin yerini alabilir ... (?)
brasofilo

@brasofilo thx! Bence bir SMTP eklentisinin yerini alamaz, çünkü eklenti ayarları yönetici panelinde yapılandırmanıza izin verir. Bu snippet, temel dosyaları bozmadan veya yeniden yazma wp_mailfonksiyonu olmadan "e-posta ayarlarının programlı olarak nasıl değiştirileceği" konusunda en iyi uygulamadır .
Eugene Manuilov

2
Bu kod nereye yerleştirilmelidir? Tüm temalarımın aynı SMTP sunucularını kullanmasını istiyorum.
Anjan

1
Çok garip bir WP bunu kolaylaştırmaz, çünkü bunu değiştirmenin yaygın olacağını düşünürdünüz.
Carson Reinke

1
benim için çalışıyor, @JackNicholson siz de kontrol etmelisiniz.
Eugene Manuilov

7

@EugeneManuilov yanıtına ek.

SMTP ayarları

Varsayılan olarak, bunlar yalnızca - @EugeneManuilov'un zaten yanıtlandığı gibi - bir do_action_ref_array(). Kaynak / çekirdek .

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer SMTP Settings
 * Description: Enables SMTP servers, SSL/TSL authentication and SMTP settings.
 */

add_action( 'phpmailer_init', 'phpmailerSMTP' );
function phpmailerSMTP( $phpmailer )
{
    # $phpmailer->IsSMTP();
    # $phpmailer->SMTPAuth   = true;  // Authentication
    # $phpmailer->Host       = '';
    # $phpmailer->Username   = '';
    # $phpmailer->Password   = '';
    # $phpmailer->SMTPSecure = 'ssl'; // Enable if required - 'tls' is another possible value
    # $phpmailer->Port       = 26;    // SMTP Port - 26 is for GMail
}

SMTP İstisnaları

Varsayılan olarak WordPress size herhangi bir hata ayıklama çıktısı vermez. Bunun yerine, yalnızca FALSEbir hata oluştuğunda geri döner . İşte bunu düzeltmek için küçük eklenti:

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (WCM) PHPMailer Exceptions & SMTP
 * Description: WordPress by default returns <code>FALSE</code> instead of an <code>Exception</code>. This plugin fixes that.
 */

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;

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

    // Use `var_dump( $data )` to inspect stuff at the latest point and see
    // if something got changed in core. You should consider dumping it during the
    // `wp_mail` filter as well, so you get the original state for comparison.
    $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()
        );
}

depo

Eklentilerin her ikisi de GitHub'daki bu Gist'te mevcuttur, bu nedenle güncellemeleri almak için bu eklentileri oradan kontrol etmeyi düşünün.


3

Bu gönderinin diğer yanıtları, çalışan bir çözüm sunarken, SMTP kimlik bilgilerinizi bir eklenti dosyasında veya function.php'de saklamanın güvenlik sorununu ele almaz. Bazı durumlarda sorun olabilir, ancak en iyi uygulamalar bu bilgilerin daha güvenli bir şekilde depolanmasını gerektirir. Kimlik bilgilerinizi korumak söz konusu olduğunda en iyi uygulamaları takip etmemek için gerçekten iyi bir neden yoktur.

Bazıları bunu DB'ye bir seçenek olarak kaydetmeyi önerir, ancak sitenizin sahip olduğu yönetici kullanıcı sayısına ve bu kullanıcıların bu oturum açma kimlik bilgilerini görüp görememesine bağlı olarak aynı güvenlik sorunlarını sağlar. Bunun için bir eklenti kullanmamak da aynı nedendir.

Bunu yapmanın en iyi yolu, wp-config.php dosyanızdaki phpmailer bilgisi için sabitleri tanımlamaktır. Bu aslında Posta Bileşeninde bir özellik olarak tartışılmıştır , ancak şu anda gerçek bir geliştirme olarak kabul edilmemiştir. Ancak wp-config.php dosyasına aşağıdakileri ekleyerek kendiniz yapabilirsiniz:

/**
 * Set the following constants in wp-config.php
 * These should be added somewhere BEFORE the
 * constant ABSPATH is defined.
 */
define( 'SMTP_USER',   'user@example.com' );    // Username to use for SMTP authentication
define( 'SMTP_PASS',   'smtp password' );       // Password to use for SMTP authentication
define( 'SMTP_HOST',   'smtp.example.com' );    // The hostname of the mail server
define( 'SMTP_FROM',   'website@example.com' ); // SMTP From email address
define( 'SMTP_NAME',   'e.g Website Name' );    // SMTP From name
define( 'SMTP_PORT',   '25' );                  // SMTP port number - likely to be 25, 465 or 587
define( 'SMTP_SECURE', 'tls' );                 // Encryption system to use - ssl or tls
define( 'SMTP_AUTH',    true );                 // Use SMTP authentication (true|false)
define( 'SMTP_DEBUG',   0 );                    // for debugging purposes only set to 1 or 2

Bunlar wp-config.php dosyasında tanımlandıktan sonra, tanımlanan sabit kullanılarak her yerde kullanılabilir. Böylece bunları bir eklenti dosyasında veya function.php dosyasında kullanabilirsiniz. (OP'ye özgü bir eklenti dosyası kullanın.)

/**
 * This function will connect wp_mail to your authenticated
 * SMTP server. Values are constants set in 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;
}

Bu yazıda biraz daha detay ve burada github'a bir öz var .


Gerçekten iyi bir çözüm!
Phill Healey

1
Küçük ekleme: Söylemeye gerek yok, kimlik bilgilerini sürüm denetiminde saklamayın. .envBunun yerine gitignored dosyasını kullanın. Ama hassas bir şey koyan kimse wp-config.phpzaten sürüm kontrolü kullanıyor ...
jsphpl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.