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?
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:
Her şeyden önce, wp_mail
fonksiyonun uygulanmasına bakarsak, bu fonksiyonun PHPMailer
e-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 isSMTP
işlevini çağırmalıyız PHPMailer
. Ayrıca SMTP ayarlarımızı da yapmamız gerekiyor.
Bunu başarmak için $phpmailer
değişkene erişmemiz gerekir. Ve burada phpmailer_init
bir 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.
wp_mail
fonksiyonu olmadan "e-posta ayarlarının programlı olarak nasıl değiştirileceği" konusunda en iyi uygulamadır .
@EugeneManuilov yanıtına ek.
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
}
Varsayılan olarak WordPress size herhangi bir hata ayıklama çıktısı vermez. Bunun yerine, yalnızca FALSE
bir 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()
);
}
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.
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 .
.env
Bunun yerine gitignored dosyasını kullanın. Ama hassas bir şey koyan kimse wp-config.php
zaten sürüm kontrolü kullanıyor ...