プログラムでSMTP設定をセットアップする最も簡単な方法は何ですか?


18

空白のWPサイトがあり、プラグインまたはテーマでプログラムでSMTP設定をセットアップするとします。コアファイルを変更せずに行う最も簡単な方法は何ですか?

回答:


31

まず、wp_mail関数の実装を見ると、この関数がPHPMailerクラスを使用してメールを送信していることがわかります。また$phpmailer->IsMail();、PHPのmail()関数を使用するように設定されたハードコーディングされた関数呼び出しがあることもわかります。これは、SMTP設定を使用できないことを意味します。クラスのisSMTP関数を呼び出す必要がありますPHPMailer。また、SMTP設定も設定する必要があります。

それを実現するには、$phpmailer変数にアクセスする必要があります。そしてここで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 = '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();
}

そして、それだけです。


素敵なもの、ユージーン、THX!この10行のコードは、SMTPプラグイン全体を置き換えることができると思います...(?)
brasofilo

@brasofilo thx!プラグインを使用すると管理パネルで設定を構成できるため、SMTPプラグインを置き換えることはできないと思います。このスニペットは、コアファイルを壊したり、wp_mail機能を書き換えたりすることなく、「プログラムでメール設定を変更する方法」に関するベストプラクティスです。
ユージンマヌイロフ

2
このコードはどこに配置する必要がありますか?すべてのテーマで同じSMTPサーバーを使用するようにします。
アンジャン

1
非常に奇妙なWPは、これを変更するのが一般的だと思うので、これを簡単にしません。
カーソンラインケ

1
それは私のために動作します、@ JackNicholsonあなたもあなたの側でそれをチェックする必要があります。
ユージン

7

@EugeneManuilovの回答に追加。

SMTP設定

デフォルトでは、@ 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
}

SMTP例外

デフォルトでは、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のこのGistで利用できるため、更新を取得するためにそこからそれらのプラグインをチェックアウトすることを検討してください。


3

この投稿に対する他の回答は、実用的なソリューションを提供する一方で、SMTPクレデンシャルをプラグインファイルまたはfunctions.phpに保存するというセキュリティ問題に対処しません。場合によっては問題ないかもしれませんが、ベストプラクティスにより、この情報をより安全な方法で保存することが求められます。資格情報の保護に関しては、ベストプラクティスに従わない正当な理由はありません。

オプションとしてDBに保存することをお勧めしますが、サイトの管理ユーザーの数と、これらのユーザーがこれらのログイン資格情報を表示できるかどうかによっては、同じセキュリティ問題も発生します。これもプラグインを使用しない理由と同じです。

これを行う最良の方法は、wp-config.phpファイルでphpmailer情報の定数を定義することです。これは、実際にはMail Componentの機能として説明されていますが、現時点では実際の拡張として受け入れられていません。ただし、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',   '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

これらが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;
}

この投稿はこれについてもう少し詳しく説明し、githubに要点を示します


本当に良い解決策です!
フィルヒーリー

1
小さな追加:言うまでもなく、バージョン管理に資格情報を保存しないでください。.env代わりにgitignored ファイルを使用してください。しかしwp-config.php、とにかく敏感なものを入れる人は誰もバージョン管理を使用していません…
jsphpl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.