空白のWPサイトがあり、SMTP設定をプラグインまたはテーマでプログラム的に設定するとします。コアファイルを変更せずにそれを行う最も簡単な方法は何ですか?
まず、wp_mail
関数の実装を見ると、この関数は PHPMailer
クラスを使って電子メールを送信していることがわかります。また、PHPの$phpmailer->IsMail();
関数を使用するように設定されたmail()
というハードコードされた関数呼び出しがあることにも気付くでしょう。それは私達がそれと共にSMTP設定を使うことができないことを意味します。 isSMTP
クラスのPHPMailer
関数を呼び出す必要があります。また、SMTPも設定する必要があります。
それを達成するためには$phpmailer
変数にアクセスする必要があります。そしてここで私達はEメールを送る前に呼ばれるphpmailer_init
アクションに来ます。それで、アクションハンドラを書くことで必要なことを実行できます。
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 = '[email protected]'; // 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();
}
そしてそれだけです。
@EugeneManuilovの回答に追加しました。
デフォルトでは@EugeneManuilovがすでに回答しているので、これらはdo_action_ref_array()
にアタッチされたコールバック中にしか設定できません。 ソース/コア 。
<?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
}
デフォルトではWordPressはデバッグ出力をしてくれません。代わりにエラーが発生した場合はFALSE
を返します。これを修正するための小さなプラグインは次のとおりです。
<?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()
);
}
プラグインは両方ともこの GitHub上の要旨 で利用可能です。ですから、そこからこれらのプラグインをチェックしてアップデートを入手してください。
この記事に対する他の答えは、実用的な解決策を提供する一方で、あなたのSMTP認証情報をプラグインファイルやfunctions.phpに保存するというセキュリティ問題には対処しないことです。場合によっては問題ないかもしれませんが、ベストプラクティスでは、この情報をより安全な方法で格納することが要求されます。クレデンシャルを保護することになると、ベストプラクティスに従わないという正当な理由はありません。
オプションとしてそれをDBに保存することをお勧めしますが、あなたのサイトが持っている管理ユーザーの数とそれらのユーザーがこれらのログイン資格情報を見ることができるべきかどうかによって同じセキュリティ問題を提供します。これは、これにプラグインを使用しないのと同じ理由です。
これを行う最良の方法はあなたのwp-config.phpファイルでphpmailer情報のための定数を定義することです。これは実際には メールコンポーネントの機能として議論されています が、現時点では実際の機能拡張として受け入れられていません。しかし、あなたはwp-config.phpに以下を追加することによってあなた自身でそれをすることができます:
/**
* Set the following constants in wp-config.php
* These should be added somewhere BEFORE the
* constant ABSPATH is defined.
*/
define( 'SMTP_USER', '[email protected]' ); // 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', '[email protected]' ); // 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
これらがwp-config.phpで定義されると、定義された定数を使うことでどこでも使うことができます。そのため、プラグインファイルまたはfunctions.phpでそれらを使用できます。 (OPには、プラグインファイルを使用してください。)
/**
* 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;
}