web-dev-qa-db-ja.com

WordPressはメールの送信を拒否します、「...あなたのホストはmail()機能を無効にしている可能性があります」

私は最近自分のウェブサイトにコメントエリアを実装し、電子メール通知を機能させることを試みました。新しいコメントがあったときにEメール通知を送りたくないようです。

PHPが電子メールを送信できるかどうかを確認するために、パスワードを再設定しようとしたため(メールで新しいパスワードを入手できるので)、次のメッセージが表示されます。

電子メールを送信できませんでした。考えられる理由:ホストがmail()機能を無効にしている可能性があります。

[設定] - > [ディスカッション]のチェックボックスをオンにしました。メールは有効なので、設定の問題ではありません。 PHPファイルを作成してmail()を使用して送信しようとしましたが、正常に送信されました。だから、WordPressで何か変なことが起こっているに違いない。

何か案は?

9
qwerty

ステップバイステップ:最初に、エラーメッセージが表示されているファイルを見つけます。私はNotepad ++と CTRL + F ファイルを検索するコマンド。エラーメッセージの中には異なるメッセージを組み合わせたものがあるため、エラーメッセージの最初の数語だけを検索することをお勧めします。

あなたのエラーメッセージはwp-login.phpと聖なる運に現れます、そこだけです。それでは、このエラーが発生する可能性がある理由を見てみましょう。

if ( $message && !wp_mail($user_email, $title, $message) )

2つの条件があります。 $messageは真にする必要があります(空の文字列ではない、偽ではない、nullではないなど)。そしてwp_mail()はfalseを返すべきではありません。

上記の1行には$message = apply_filters('retrieve_password_message', $message, $key);というフィルタがありますので、プラグイン(またはテーマ)がこのフィルタを使用してtrueではない値(空の文字列、false、nullなど)を返す可能性があります。

しかし、wp_mail()が機能しているかどうかを確認するほうがはるかに簡単です。テストメールを自分に送信するための小さなプラグインを書きます。

<?php
/**
 * Plugin Name: Stackexchange Testplugin
 * Plugin URI:  http://yoda.neun12.de
 * Description: Send me a test email
 * Version:     0.1
 * Author:      Ralf Albert
 * Author URI:  http://yoda.neun12.de
 * Text Domain:
 * Domain Path:
 * Network:
 * License:     GPLv3
 */

namespace WordPressStackexchange;

add_action( 'init', __NAMESPACE__ . '\plugin_init' );

function plugin_init(){
    $to      = '[email protected]';
    $subject = 'Testemail';
    $message = 'FooBarBaz Testmail is working';

    wp_mail( $to, $subject, $message );
}

(これはPHP5.3コードです。PHP5.2を実行している場合は、ネームスペースのものを削除してください)

プラグインはアクティベーションの直後にテストメールを送るべきです。そうでない場合は、バックエンドページ(ダッシュボードなど)を呼び出してください。

テストメールが届かない場合は、おそらくwp_mail()に問題があります。デバッグを有効にします。

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
@ini_set( 'display_errors',1 );

このコードをあなたのwp-config.phpに入れて、自分自身にテストメールを送ってみてください。これでいくつかのエラーメッセージが表示され、それらもwp-content/debug.logにログインするはずです(プラグインやテーマによってさらにエラーが発生すると、デバッグログが非常に大きくなる可能性があります)。

この時点で、wp_mail()が失敗した場合、そして失敗した場合はなぜ、あなたは良い情報を得ました。 wp_mail()が正しく動作してテストメールが届いた場合は、先頭に戻って$messageが正しくない理由を見つけてください。

wp_mail()に問題がある場合は、wp_mail()はPHPのmail()関数を使用しないことに注意してください。 WordPressはPHPクラス( PHPMailer )を使います。 sendmailの代わりに SMTPを使用するためのプラグイン が必要なだけかもしれません。または問題は別の場所にあります。わかりません。あなたは調査しなければなりません。

9
Ralf912

これは、 many のようなものである可能性があるため、非常に迷惑なエラーメッセージです。実際のエラーは明らかにされていません(多くの場合、コードの他の部分では沈黙します)。

このエラーは、wp_mail()関数がfalseを返したときに表示されます。phpmailer->Send()がfalseを返した場合や例外が発生した場合にも発生します。


PHPのmail()関数からの警告を表示する方法

これらは通常デフォルトでは沈黙していますが、残念ながらWordPressはそれらを捉えません。それらを表示するには、mailPassthru()関数の@@mail(...からwp-includes/class-phpmailer.phpの印を単に削除します。

if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
    $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header);
} else {
    $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header, $params);
}


他の考えられる原因を突き止める方法:

  1. /wp-includes/pluggable.phpwp_mail()の最後に1行を追加します。

    // Send!
    try {
        return $phpmailer->Send();
    } catch ( phpmailerException $e ) {
        //------------- This next line is the one to add -------------------
        if (WP_DEBUG) echo '<pre>' . esc_html(print_r($e, TRUE)) . '</pre>';
        return false;
    }
    
  2. 例外が発生した場所の詳細をすべてダンプします。残念ながらそれは時々この役に立たない例外メッセージを含んでいます: " メール機能をインスタンス化できませんでした "。うんWordPressのおかげで、本当に便利です。

  3. 例外を見れば、エラーの行番号を見つけることができ、実際の原因を見つけるためにコード内でそれをトレースバックすることができます。

がんばろう。うまくいけばWordPressは将来のある時点で電子メールのエラー処理を改善します。

2
Simon East

Amazon EC2上のUbuntuサーバーでも同じ問題があります。パスワードのリセットリンクを使用しているときに問題が発生し、その他の通知Eメールも機能しませんでした。

だからここに私のために働いた解決策があります。Word-pressは/usr/sbin/sendmailに格納されたphpメーラを使ったPHPMailerクラスを必要とするwp_mail()関数を使って電子メールを送りました。

PHPメールをチェックするために最初にこの単純なPHP関数を使用してください

<?php
$to = "[email protected]";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: [email protected]" . "\r\n" .
"CC: [email protected]";

mail($to,$subject,$txt,$headers);
?>

これでうまくいかない場合は、php mailerをインストールする必要があります。このコマンドを使用して、Ubuntuサーバーにphpメールをインストールします。

Sudo apt-get install sendmail

その後、Wordプレスのメール機能を確認してください。

2
CyberAbhay

ここで他の素晴らしい答えが役に立たない場合は、これを試してみてください。

私はこれと同じ問題に遭遇しました、そして、私がWordPressのための提案のどれでも見つけることができなかったことは私のためにそれを解決しました。

それから、メール機能を無効にしたのがPHPインストールそのものであるかどうかを調べ始めましたが、どれもうまくいきませんでした。すべて正しく設定されているように見えました。

SELinux(Security Enhanced Linux)を使用するCentOS 7にサーバーをアップグレードしたときにこれらの問題がすべて発生しました。Selinuxを使用してここ2週間で学んだことは、何かが機能しない場合でも、すべてがそれはうまくいくはずです...それはSELinuxが黙ってそしてひそかにバックグラウンドであなたをブロックしていることを意味します。

そしてビオラ。

SELinuxを使用しているOSを実行している場合は、rootとして次のコマンドを実行してください。

setsebool -P httpd_can_sendmail=1

Webサーバーが電子メールを送信することを本質的に妨げるセキュリティ設定があります。そのスイッチを切り替えてSELinuxにウェブサーバーがメールを送ってもいいと言ったら、突然すべてがうまくいきます。

1
Kenny Wyland

私は今日これに遭遇した。私の場合、状況はサーバーのhostsファイルがlocalhostを指しているEメールアドレスと同じドメイン名を持っているために起こりました。 mxレコードは別のサーバーを指していますが、hostsファイルはDNSをオーバーライドしており、WPは電子メールをローカルに配信しようとしています。 hostsファイルからドメインを削除してsendmailを再起動すると、この問題は解決しました。

0
user16081

私は同じエラーがありました、両方の機能(mailとwp_mail)は働きました、しかし、私はまだこの迷惑なエラーを抱えていました。修正は非常に簡単でしたが、その理由を見つけるのに数時間かかりました。それで私はここであなたと同じであるかもしれない(あるいはそうでないかもしれない)問題に関する私の解決策を共有するつもりです。

私はmail()関数を試してみましたが、うまくいきましたが、テストするときにはmail()関数の最後のパラメータ 'parameters'を指定していません。そしてWPはそれを使います。

@mail("[email protected]",$title,$body,$headers,"[email protected]");

そのため、基本的に、フラグ "-f"を持つこのパラメータ( "[email protected]")は、mail()関数が、 "信頼されたEメール"リストに記載されているEメールアドレス "[email protected]"をチェックします。

そうでない場合は、falseを返します。これにより、wp_mail()はfalseを返し、エラーメッセージが表示されます。

だから、解決策はあなたのためにこれを行うように主催者に依頼することです、またはあなたがcPanelを使用している場合は、単にこのアドレスの電子メールアカウントを追加し、それは自動的に "信頼できるリスト"に追加されます。

0
user3696815

それはと呼ばれる - スクリプトを介してメールを送信するための登録された電子メールIDを管理します。(ワードプレス)

  1. あなたのCpanelにログインします。
  2. [メールセクション]に移動し、[登録メールID]をクリックします。
  3. 次に([email protected])またはあなたのワードプレスがホストしている場所を追加してください。すなわち([email protected])。それから提出してください、それはあなたのホスティングプロバイダーに応じて15分から1時間まで待機を活性化するのに数分かかります、そしてそれは働きます。
0
Amrit Bhandari

これがまだあなたに関連しているかどうかはわかりませんが、答えが選択されていないので、一度試してみることにしました。

実は、私のopenshift Hostが今日突然突然あきらめてメールの送信を停止して以来、私はまったく同じ問題に直面していました。コードとコーデックスを掘り下げて、私はwp_mail()関数について知るようになりました、そしてついにグーグルはここに私を導きました、そして、私はそれがどのように上書きされることができるかを見ました。

@ Ralf912の答えを踏まえて、コードがワードプレスのデフォルトのものではなくsendgrid.comのWeb APIを使用してメールを送信するように、スクリプトを少し修正しました。

<?php

function sendgridmail($to, $subject, $message, $headers)
{
    $url = 'https://api.sendgrid.com/';
    //$user = 'yourUsername';
    //$pass = 'yourPassword';

    $params = array(
        'api_user'  => $user,
        'api_key'   => $pass,
        'to'        => $to,
        'subject'   => $subject,
        'html'      => '',
        'text'      => $message,
        'from'      => '[email protected]',
      );


    $request =  $url.'api/mail.send.json';

    // Generate curl request
    $session = curl_init($request);
    // Tell curl to use HTTP POST
    curl_setopt ($session, CURLOPT_POST, true);
    // Tell curl that this is the body of the POST
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
    // Tell curl not to return headers, but do return the response
    curl_setopt($session, CURLOPT_HEADER, false);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

    // obtain response
    $response = curl_exec($session);
    curl_close($session);

    // print everything out
    //print_r($response);
}

//only for testing:
/*$to      = '[email protected]';
$subject = 'Testemail';
$message = 'It works!!';
echo 'To is: ' + $to;
#wp_mail( $to, $subject, $message, array() );
sendgridmail($to, $subject, $message, $headers);
print_r('Just sent!');*/

if (!function_exists('wp_mail')) {
    function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
    {
        // use the PHP GnuPG library here to send mail.
        sendgridmail($to, $subject, $message, $headers);
    }
}

function plugin_init()
{
   /* $to      = '[email protected]';
    $subject = 'Testemail';
    $message = 'It works Live!';
    //echo 'To is: ' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r('Just sent!');*/
}

そしてそれはうまくいった!

0
Prahlad Yeri