WordPressはメールの送信を拒否します。「…ホストがmail()関数を無効にしている可能性があります」


9

最近、自分のWebサイトにコメント領域を実装し、電子メール通知を機能させようとしました。新しいコメントが行われたときに電子メール通知を送信したくないようです。

PHPがメールを送信できるかどうかを確認するために、パスワードをリセットしようとしました(メールで新しいパスワードを取得するため)。次のメッセージが表示されました。

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

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

何か案は?


回答:


9

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

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

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

2つの条件があります。$messagetrueでなければなりません(空の文字列、false、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      = 'your-email-adress@some-domain.tld';
    $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()、正しく仕事とtestmailが到着し、トップに戻って、理由を見つける$message真実ではありません。

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


ええ、私はコアを掘り下げてみました、それはまた私をPHPMailerに導きました、そしてそれは実際にphpを使用ますmail()。少なくとも場合によっては(の732行目を参照してください。ftpatmにwp-includes/class-phpmailer.phpアクセスできませんが、できるだけ早くあなたの提案を試します。確かに、これは私をどこかに導くはずです。ありがとうございます!
qwerty

テストwp_mail()したところ、問題なく動作しているようで、期待どおりにメールを受信しました。WPはまだコメント/パスワードリセットの電子メールを送信しませんでしたが、ログファイルに何も記録されなかったため(作成されていません)、SMTPメールプラグインをインストールして新しいメールアカウントをセットアップしましたワードプレス。現在は機能しますが、以前に送信できなかった理由がわかりません。ありがとう!
qwerty 2013

エラーもメールも
届き

2

これは非常に煩わしいエラーメッセージであり、多くのことを引き起こす可能性があり、実際のエラー(コードの他の部分で沈黙されることが多い)を明らかにしません。

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


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

これらは通常デフォルトで沈黙していますが、残念ながらWordPressがキャプチャすることはありません。それらを表示するには、関数内の@記号を削除するだけです。@mail(...wp-includes/class-phpmailer.phpmailPassthru()

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. の下部に1行追加wp_mail()/wp-includes/pluggable.phpます。

    // 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

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

だからここに私のために働いた解決策があります.Word-Pressは、PHPのメーラーを使用したクラスをwp_mail()必要とするメールを送信するために関数PHPMailerを使用し/usr/sbin/sendmailました

最初にこの単純なphp関数を使用して、phpメールをチェックします

<?php
$to = "example@gmail.com";
$subject = "Test Email Function";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: xyz@example.com";

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

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

sudo apt-get install sendmail

次に、ワードプレスのメール機能を確認します。


この答えは、他のどの答えよりも先に試す必要がある答えです。これが方法です
ヘテニン

1

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

私はこれと同じ問題に遭遇しましたが、WordPressの提案の中で何も見つけることができず、解決されました。

次に、メール機能を無効にしたのがPHPのインストール自体であるかどうかの調査を開始しましたが、どれも機能しませんでした。すべてが適切に構成されているように見えました。

サーバーをSELinux(Security Enhanced Linux)を使用するCentOS 7にアップグレードすると、これらすべての問題が始まりました。SELinuxで過去数週間に学んだことは、何かが機能していない場合、すべてが次のように見えることです。正常に動作しているはずです...つまり、SELinuxがバックグラウンドで静かにそして密かにあなたをブロックしています。

そしてヴィオラ。

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

setsebool -P httpd_can_sendmail=1

本質的にWebサーバーが電子メールを送信できないようにするセキュリティ設定があります。そのスイッチを切り替えてSELinuxにWebサーバーがメールを送信しても問題ないことを伝えると、すべてが突然動作します。


0

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


0

それでもあなたに関係があるかどうかはわかりませんが、答えが選ばれていないので、一度やってみようかなと思いました。

実は、私の今日のOpenShiftホストが突然道を譲り、メールの送信を停止して以来、まったく同じ問題に直面していました。コードとcodexを掘り下げて、wp_mail()関数について知り、ついにgoogleがここに導いてくれて、それがどのようにオーバーライドされるかを見ました。

@ 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'      => 'abc@hotmail.com',
      );


    $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      = 'abc@yahoo.com';
$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      = 'xyz@yahoo.com';
    $subject = 'Testemail';
    $message = 'It works Live!';
    //echo 'To is: ' + $to;
    wp_mail( $to, $subject, $message, array() );
    //print_r('Just sent!');*/
}

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


0

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

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

@mail("example@exmaple.com",$title,$body,$headers,"-fexample@exmaple.com");

したがって、基本的には、このパラメーター( "-fexample@exmaple.com")にフラグ "-f"を指定すると、mail()関数は、「信頼できるメール」リストにあるメールアドレス「example@exmaple.com」をチェックします。

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

したがって、解決策はホスティング業者にこれを行うように依頼することです。または、cPanelを使用している場合は、このアドレスのメールアカウントを追加するだけで、自動的に「信頼済みリスト」に追加されます。


0

スクリプトを介してメールを送信するために登録された電子メールIDを管理する(Wordpress)

  1. Cpanelにログインします。
  2. メールセクションに移動し、[登録済みメールID]をクリックします。
  3. 次に(wordpress@yourdomain.com)またはワードプレスがホストする場所を追加します。すなわち(wordpress@blog.yourdomain.com)。その後、送信します。ホスティングプロバイダーによって異なりますが、15分から1時間待機するのに数分かかります。

0

私は何年にもわたってこのエラーを抱えていて、うまくいかない多くの解決策を試しました。AWS EC2にカスタムWordpressをインストールしています。まず、AWS SESメールがサポートを通じて有効になっていることを確認します。それらは、SESとEC2の同じ(または近い)リージョンにある必要があります。メールの送受信にはGoogleスイート(gsuite)を使用しました。

テストメールがAWS SESとGsuiteで送信されることを確認します。

WordpressプラグインWP Mail SMTPをインストールし、「その他のSMTP」オプションを使用して、AWS SESからSMTP認証情報を取得します。これが行き詰まった場所です。

暗号化のチェックボックス「SSL」を有効にする必要があります。これにより、ポートが465に変更されます。ようやく私の電子メールテストがWorpdressから正常に送信されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.