web-dev-qa-db-ja.com

PHP mail()は機能しますが、wp_mail()は機能しません

私はWordPressのメール機能(WP 4.6マルチサイト)に完全に迷っています。

私はローカルに(私のローカルホスト上で)テストしたWordPressがメールを送る。これは一見したところうまく動作します(私はWordPressでSMTPサーバーアドレスを設定したことがないので、理由はよくわかりません)。ユーザーが作成されると、通知メールが正しいアドレスに正しく送信されます。

BUT、私のテーマページの1つでwp_mail()関数を使おうとすると、うまくいきません。私が代わりにmail()php関数を使用すれば、それは完璧に動作します。 (php mail()は私のプロバイダのSMTPサーバに設定された私のsmtpサーバ 'smtp'に設定され、有効な '送信者アドレス')

ほぼ同じ質問 がここにありますリンク切れ、質問は削除されました)。違いは、私の場合、wp_mail()はダッシュボード部分では動作しますが、私のテーマでは動作しないことです。 (この記事が投稿されることを願っています!:)

1
Pierre

テーマのfunctions.phpにアクションメソッドphpmailer_initを追加します。また、SMTPサーバーの詳細を使って設定を構成します。

add_action( 'phpmailer_init', 'phpmailer_ss_SMTP' );
function phpmailer_ss_SMTP( $phpmailer )
{
    $phpmailer->IsSMTP();
    $phpmailer->Host        = 'mail.domainname.com';
    $phpmailer->Port        = 588; 
    $phpmailer->SMTPAuth    = true; 
    $phpmailer->Username    = '[email protected]';
    $phpmailer->Password    = 'Set Password';
    $phpmailer->From        = '[email protected]';
    $phpmailer->FromName    = 'Website Name';
    $phpmailer->AuthType    = 'LOGIN';
    $phpmailer->SMTPAutoTLS = false;
    $phpmailer->SMTPSecure  =''; 
}
1
Shashank Sharma

プラグイン WP Mail SMTP は、ローカルホストでwp_mail()を正しく使用するための可能な解決策のように見えます。説明によると:

wp_mail()関数の代わりにSMTPを使用するようにmail()関数を再設定し、設定を管理するためのオプションページを作成します。

他の答えはSMTPの設定をチェックインするのに良い解決策を与えます、それがあなたの実際の問題であるかどうかにかかわらずあなたがするべきです。

しかし、あなたの説明によると、それが実際の問題ではないと思います。あなたがwp_mail()を使おうとしているところでは、その関数はまだロードされていない可能性があります。

デバッグモードでWPを実行していますか?そうでなかったら、それを有効にし、再度テストして下さい。 wp_mail()関数が未定義であるというエラーが発生した場合、実際の問題はwp_mail()(およびpluggable.php)がロードされておらず使用できないことです。

これは、プロセスを特定のアクションにフックしない場合、または典型的なアクションの順序がわからず、関数がロードされる前に起動するフックを使用する場合に発生します。

wp_mail()はプラグイン可能な関数です。つまり、プラグインはそれを変更できます。プラグインが最初にそれらを定義できるように、プラグイン可能な関数はプロセスの後半でロードされます。

プラガブル関数を使用するプロセスをinitアクションのようなものにフックすると、すべてのプラガブル関数がその時点でロードされるため、役に立ちます。だからあなたのプロセスは次のようになります。

add_action( 'init', 'my_hooked_function' );
function my_hooked_function() {
    // doing something here...
    wp_mail( $to, $subject, $message );
}

あなたがしているプロセスがあなたのテーマのfunctions.phpにあるがアクションにフックされていない場合、適切なアクションにフックすることはあなたの問題を解決するでしょう。

あなたが言及したように見えるがそれほど望ましくない代替案は単にpluggable.phpが含まれていることを確認することです:

function my_not_hooked_function() {
    include_once( ABSPATH . '/wp-includes/pluggable.php' );
    // doing something here...
    wp_mail( $to, $subject, $message );
}
0
butlerblog