WordPressはメールの送信を拒否します。「...ホストがmail()関数を無効にしている可能性があります」
-
-
[デバッグ情報](http://codex.wordpress.org/Debugging_in_WordPress)を提供してくださいPlease provide [debugging information](http://codex.wordpress.org/Debugging_in_WordPress)
- 0
- 2013-04-08
- s_ha_dum
-
9 回答
- 投票
-
- 2013-04-08
ステップバイステップ:最初に、エラーメッセージが表示されているファイルを見つけます. Notepad ++と CTRL + F コマンドを使用してファイルを検索します.一部のエラーメッセージは異なるメッセージが組み合わされているため、エラーメッセージの最初の数語のみを検索することをお勧めします.
エラーメッセージは
wp-login.php
に表示され、幸運を祈ります.それでは、このエラーが発生する理由を見てみましょう.if ( $message && !wp_mail($user_email, $title, $message) )
2つの条件があります.
$message
はtrueである必要があります(空の文字列、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 = '[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を使用するプラグインが必要なだけかもしれません.または、問題は別の場所にあります.わかりません.調査する必要があります. Step by step: First find the file where the error message appear. I use Notepad++ and the CTRL + F command to search in files. It is a good idea to search only the first few words of the error message, because some error messages are combined of different messages.
Your error message appear in
wp-login.php
and holy luck, only there. So let's have a look why this error could occur.if ( $message && !wp_mail($user_email, $title, $message) )
There are two conditions.
$message
have to be true (not an empty string, not false, not null, etc). Andwp_mail()
shouldn't return false.One line above, there is a filter
$message = apply_filters('retrieve_password_message', $message, $key);
, so it is possible that a plugin (or theme) use this filter and returns a value that is not true (empty string, false, null, etc.).But it is much easier to check if
wp_mail()
is working or not. Write a small plugin to send a test mail to yourself:<?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 ); }
(This is PHP5.3 code. If you are running PHP5.2, remove the namespace things)
The plugin should send a testmail immediately after activation. If not, calling some backend pages (e.g. dashboard) should do it.
If the testmail does not arrive, then you probably have an issue with
wp_mail()
. So turn on debugging:define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', true ); @ini_set( 'display_errors',1 );
Put this code into your
wp-config.php
and retry sending yourself a testmail. Now you should get some error messages and they also should be logged intowp-content/debug.log
(The debug log can grow very large if there are more errors caused by plugins and/or themes).At this point, you got good informations if
wp_mail()
fails and if so, why. Ifwp_mail()
work correctly and the testmail arrived, go back to top and find out why$message
is not true.If you have issues with
wp_mail()
, so keep in mind thatwp_mail()
does not use PHPsmail()
function. WordPress use a PHP class (PHPMailer). Maybe you just need a plugin to use SMTP instead of sendmail. Or the problem is located at another place. We don't know. You have to investigate.-
ええ、私はコアを掘り下げてみました、そしてそれはまた私をPHPMailerに導きます、そしてそれは実際にphpの `mail()`を*使用します*.少なくともいくつかのケースでは( `wp-includes/class-phpmailer.php`の732行目を参照してください.私はftpatmにアクセスできませんが、できるだけ早くあなたの提案を試みます.確かにこれは私をどこかに導くはずです.. どうもありがとう!Yeah i tried digging into the core and it also lead me to PHPMailer, and it actually *does* use php's `mail()`. At least in some cases (see line 732 in `wp-includes/class-phpmailer.php`. I don't have access to the ftp atm but i will try your suggestions as soon as i can. Surely this must lead me somewhere. Thanks a lot!
- 0
- 2013-04-08
- qwerty
-
`wp_mail()`をテストしましたが、正常に動作しているようで、期待どおりにメールを受信しました.WPはまだコメント/パスワードリセットの電子メールを送信しませんでした、そして私はログファイルに何も取得しませんでした(それは作成されませんでした)ので、SMTPメールプラグインをインストールして新しい電子メールアカウントを設定しようとしましたWordpress.今は動作しますが、なぜ以前に送信できなかったのかまだわかりません.ありがとう!I tested `wp_mail()` and it seems to work fine, i received the mail as expected. WP still wouldn't send the comment/password-reset emails though, and i didn't get anything in the log file (it wasn't created), so i tried installing an SMTP mail plugin and set up a new email account for Wordpress. It works now but i still don't understand why it couldn't send before. Thanks!
- 0
- 2013-04-09
- qwerty
-
エラーが発生せず、メールも送信されませんI'm not getting any error and even not mail
- 0
- 2017-08-19
- baldraider
-
- 2014-12-11
これは非常に迷惑なエラーメッセージです.多くのことがあり、実際のエラーは明らかになりません(コードの他の部分では沈黙していることがよくあります).
このエラーは、
wp_mail()
関数がfalseを返す場合に表示されます.これは、phpmailer-&gt; Send()
がfalseを返すか、例外を発生させた場合に発生する可能性があります.
PHPの
mail()
関数からの警告を表示する方法通常、これらはデフォルトで無音になっていますが、残念ながらWordPressがキャプチャすることはありません.それらを表示するには、
wp-includes/class-phpmailer.php
の@mail(...
から@
記号を削除するだけです. code>mailPassthru()関数:if(ini_get( 'safe_mode')||!($this-&gt; UseSendmailOptions)){ $ rt=@mail($to、$this-&gt;encodeHeader($this-&gt; secureHeader($ subject))、$body、$ header); } そうしないと { $ rt=@mail($to、$this-&gt;encodeHeader($this-&gt; secureHeader($ subject))、$body、$ header、$params); }
他の考えられる原因を突き止める方法:
-
/wp-includes/pluggable.php
のwp_mail()
の下部に1行追加します.//送信! {を試してください $phpmailerを返す-&gt; Send(); } catch(phpmailerException $e){ //-------------この次の行は追加する行です------------------- if(WP_DEBUG)echo '&lt;pre&gt;' .esc_html(print_r($e、TRUE)). '&lt;/pre&gt;'; falseを返します. }
-
例外が発生した場所の完全な詳細をダンプします.残念ながら、「メール機能をインスタンス化できませんでした」という役に立たない例外メッセージが含まれることがあります.ええ、WordPressに感謝します.それは本当に役に立ちます.
-
例外を確認することで、エラーの行番号を見つけることができ、コードをさかのぼって本当の原因を見つけることができれば幸いです.
頑張ってください.うまくいけば、WordPressは将来のある時点で電子メールのエラー処理を改善します.
This is a super annoying error message as it could be many things, and it doesn't reveal the actual error (which is often silenced in other parts of the code).
This error appears when the
wp_mail()
function returns false, which in turn could happen ifphpmailer->Send()
returns false or raises an exception.How to display warnings from PHP's
mail()
functionThese are normally silenced by default, but unfortunately WordPress never captures them. To show them, simply remove the
@
signs from@mail(...
inwp-includes/class-phpmailer.php
in themailPassthru()
function: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); }
How to hunt down other possible causes:
Add a single line to the bottom of
wp_mail()
in/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; }
It will dump the full details of where the exception was raised. Unfortunately it sometimes includes this unhelpful exception message: "Could not instantiate mail function". Yeah thanks WordPress, that's real helpful.
By looking at the exception you can find the line number of the error, and can hopefully trace it back through the code to find the real cause.
Good luck. Hopefully WordPress improves email error handling at some point in the future.
-
- 2017-05-03
Amazon EC2のUbuntuサーバーで同じ問題が発生します.パスワードのリセットリンクを使用しているときに問題が発生し、他の通知メールも機能しませんでした.
これが私のために働いた解決策です.Word-pressは
wp_mail()
関数を使用して、に保存されているphpメーラーを使用する
.PHPMailer
クラスを必要とするメールを送信しました./usr/sbin/sendmail最初にこの単純なphp関数を使用して、phpメールをチェックします
&lt;?php $to="[email protected]"; $ subject="テストメール機能"; $txt="Hello world!"; $ headers="From:[email protected]"."\ r \n". "CC:[email protected]"; mail($to、$ subject、$txt、$ headers); ?&gt;
これが機能しない場合は、phpメーラーをインストールする必要があります. このコマンドを使用して、Ubuntuサーバーにphpメールをインストールします.
sudo apt-getinstall sendmail
次に、ワードプレスのメール機能を確認します.
I has same issue with Ubuntu server on Amazon EC2.I get issue while using reset password link and also other notification email were not working.
So here is solutions which worked for me.Word-press used
wp_mail()
function to send email which needPHPMailer
class which used php mailer stored in/usr/sbin/sendmail
.Use this simple php function first to check php mail
<?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); ?>
If this is not working then you need to install php mailer. Use this command to install php mail on Ubuntu server.
sudo apt-get install sendmail
Then check word-press email functions.
-
この答えは誰もが他の答えの前に試すべきものです、これは行く方法ですthis answer is the one anyone should try before any other answers, this is the way to go
- 0
- 2019-01-25
- hatenine
-
- 2017-02-04
ここにある他のすばらしい答えが役に立たない場合は、これを試してください:
これと同じ問題が発生しましたが、WordPressの提案で何も解決できませんでした.
次に、メール機能を無効にしたのがPHPインストール自体であるかどうかを調査し始めましたが、いずれも機能しませんでした.すべてが適切に構成されているように見えました.
これらの問題はすべて、サーバーをSELinux(Security Enhanced Linux)を使用するCentOS 7にアップグレードすると始まりました.ここ数週間、SELinuxで学んだことは、何かが機能していない場合ですが、すべてが機能しているように見えます...つまり、SELinuxがバックグラウンドでサイレントかつ密かにブロックしています.
そしてビオラ.
SELinuxを使用するOSを実行している場合は、rootとして次のコマンドを実行するだけです.
setsebool -P httpd_can_sendmail=1
Webサーバーが電子メールを送信するのを本質的に防ぐセキュリティ設定があります.そのスイッチを切り替えてSELinuxに、ウェブサーバーがメールを送信しても問題ないことを伝えると、すべてが突然機能します.
If the other great answers here don't help, try this:
I encountered this same problem and nothing I could find in any of the suggestions for WordPress solved it for me.
Then I started investigating if it was the PHP installation itself that had disabled the mail function, but none of that worked either. Everything looked like it was configured properly.
All of these problems started for me once I upgraded my server to CentOS 7 which uses SELinux (Security Enhanced Linux) and what I've learned in the last couple of weeks with SELinux is that if something isn't working, but everything looks like it should be working... that means SELinux is silently and secretly blocking you in the background.
And viola.
If you are running and OS that uses SELinux, just execute the following command as root:
setsebool -P httpd_can_sendmail=1
There is a security setting that inherently prevents the webserver from sending email. When you flip that switch and tell SELinux it's ok for the webserver to send email, everything suddenly works.
-
- 2014-01-16
今日これに遭遇しました.私の場合、サーバーのhostsファイルがローカルホストを指す電子メールアドレスと同じドメイン名を持っているために状況が発生しました.mxレコードは別のサーバーを指していますが、hostsファイルがDNSをオーバーライドしており、WPが電子メールをローカルに配信しようとしています.ホストファイルからドメインを削除してsendmailを再起動すると、この問題は解決しました.
I ran into this today; in my case the situation happened because the server's hosts file has the same domain name of the email address, pointing to localhost. The mx record points to a different server, but the hosts file is overriding DNS and WP is trying to deliver the email locally. Removing the domain from the hosts file and restarting sendmail resolved this issue.
-
- 2014-05-30
これがまだあなたに関係があるかどうかはわかりませんが、答えが選択されていないので、一度試してみようと思いました.
実際、openshiftホストが今日突然道を譲り、メールの送信を停止して以来、まったく同じ問題に直面していました.コードとコーデックスを掘り下げて、wp_mail()関数について知り、ついにグーグルが私をここに導き、それがどのようにオーバーライドされるかを見ました.
@ Ralf912の回答に基づいて、スクリプトを少し変更し、コードがWordPressのデフォルトのAPIではなく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!');*/ }
そしてそれはうまくいきました!
I don't know whether this is still relevant to you or not, but since there is no answer chosen, I thought let me give it a try once.
Actually, I had faced the exact same problem since my openshift host all of a suddenly gave way today and stopped sending mails. Digging through the code and codex, I came to know about the wp_mail() function and finally google led me here and I saw how it could be overridden.
Building on @Ralf912's answer, I modified the script a bit so that the code uses sendgrid.com's web api to send mails instead of wordpress default one (that I presume :
<?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!');*/ }
And it worked!
-
- 2016-08-23
同じエラーが発生し、両方の関数(mailとwp_mail)が機能しましたが、それでもこの厄介なエラーが発生しました.修正はとても簡単でしたが、理由を見つけるのに数時間かかりました.そこで、あなたと同じかもしれない(または同じでないかもしれない)問題についての私の解決策をここで共有します.
mail()関数を試しましたが、機能しましたが、テストするときに、mail()関数で「parameters」と呼ばれる最後のパラメーターを指定していません.そしてWPはそれを使用します.
@mail("[email protected]",$title,$body,$headers,"[email protected]");
したがって、基本的に、フラグ「-f」を持つこのパラメーター( "[email protected]")は、mail()関数に「信頼できる電子メール」リストにリストされている電子メールアドレス「[email protected]」かどうかをチェックさせます. .
そうでない場合はfalseを返します.これにより、wp_mail()はfalseを返し、エラーメッセージが表示されます.
したがって、解決策は、ホスティング業者にこれを行うように依頼するか、cPanelを使用している場合は、このアドレスのメールアカウントを追加するだけで、自動的に「信頼できるリスト」に追加されます.
I had the same error, both functions(mail and wp_mail) worked, but I still had this annoying error. The fix was very easy, but it took me few hours to find the reason. So I will share here my solution on the problem which might be (or might not) the same with yours.
I tried mail() function and it worked, but when you test it you don't specify the last parameter called 'parameters' in mail() function. And WP does use it.
@mail("[email protected]",$title,$body,$headers,"[email protected]");
So, basically, this parameter ("[email protected]") with flag "-f" makes mail() function check if the email address "[email protected]" listed in the "trusted emails" list.
So if it doesn't, it returns false, which makes wp_mail() returns false and leads to the error message.
So, solution is to ask hoster to do this for you, or if you are using cPanel, just add email account for this address and it will automatically will add it into the "trusted list".
-
- 2019-05-31
スクリプトを介してメールを送信するための-ManageRegistered Email-Idsと呼ばれます.(Wordpress)
- Cpanelにログインします.
- [メールセクション]に移動し、[登録済みメールID]をクリックします.
- 次に、([email protected])またはWordPressがホストされている場所を追加します.すなわち([email protected]).次に送信します.ホスティングプロバイダーによって異なりますが、アクティブ化するのに数分かかり、15分から1時間待ちます.その後、機能します.
it called -Manage Registered Email-Ids For Sending Mails via Scripts ie.(Wordpress)
- Login your Cpanel.
- Go to Email Section > then Click Registered Email IDs.
- then add ([email protected]) or where your wordpress hosted. ie ([email protected]) . then submit, it takes few minute to activate wait 15minute to 1 hour depending to your hosting provider, then it will work.
-
- 2019-12-14
私は何年もの間このエラーを抱えていて、うまくいかなかった多くの解決策を試しました.AWSEC2にカスタムWordpressをインストールしています.まず、サポートを通じてAWS SESメールが有効になっていることを確認します.これらは、SESとEC2の同じ(または近い)リージョンにある必要があります. メールの送受信にGoogleSuite(gsuite)を使用しました.
テストメールがAWSSESとGsuiteで送信されることを確認してください.
WordpressプラグインWPMail SMTPをインストールし、[Other SMTP]オプションを使用して、AWSSESからSMTP認証情報を取得します.これが行き詰まりです.
暗号化のチェックボックス「SSL」を有効にする必要があります.これにより、ポートが465に変更されます.ついに私のメールテストがWorpdressから正常に送信されました.
I had this error for ages and tried so many solutions that didn't work. I have a custom Wordpress install on AWS EC2. First off ensure your AWS SES mail is enabled through support, they must be in the same (or close) region in SES and EC2. I used Google suite(gsuite) for email for receiving/sending mail.
Make sure the test email sends in AWS SES and Gsuite.
Install the Wordpress plugin WP Mail SMTP, use the option "Other SMTP", grab your SMTP credentials from AWS SES, this is where I got stuck.
You must enable the tick box "SSL" for Encryption, this changes the port to 465 for me. At last my email test sent from Worpdress successfully.
最近、自分のWebサイトにコメント領域を実装し、電子メール通知を機能させようとしました.新しいコメントが作成されたときに電子メール通知を送信したくないようです.
PHPがメールを送信できるかどうかを確認するために、パスワードをリセットしようとしました(メールで新しいパスワードを取得するため).次のメッセージが表示されました:
[設定]-> [ディスカッション]のチェックボックスをオンにしましたが、メールは有効なので、設定の問題ではありません.PHPファイルを作成して
mail()
を使用して送信しようとしましたが、正常に送信されました.したがって、WordPressで何か奇妙なことが起こっているに違いありません.何かアイデアはありますか?