ユーザ新規登録やパスワードリセット時のメールが送信されない

パスワードリセット・ユーザ追加などの際に以下のエラーが出てメールが届かない場合はこちらをご確認ください。

The email could not be sent.

Possible reason: your host may have disabled the mail() function.

発生するケース

  • セルフホスティングをご利用の方。
  • wp-setup 等で使用するドメイン名を追加していない方。

※ マネージドホスティングをご利用の方には本事象が発生しません。

 

事象の解消方法

A. WordPress の DB からホスト名を取得し、メールのホスト部として利用する

以下のコードで functions.php を作成し、使用する

Amimoto Plugin Dashboard ではこの対策が施されていますので、有効化するだけで解消できます。

function my_wp_mail_from( $original_email_address ) {
    return 'wordpress@' . parse_url( get_home_url( get_current_blog_id() ), PHP_URL_HOST );
}
add_filter( 'wp_mail_from', 'my_wp_mail_from' );

B. server_name ディレクティブを変更する

/etc/nginx/conf.d/default.conf  にある以下の設定を変更する。

変更前

server {
    listen      80;
    server_name _ default;
    root        /var/www/vhosts/i-a39asg02ar234srgas7293hga9w745;
    index       index.html index.htm;
    charset     utf-8;

 
変更後

server {
    listen      80;
    server_name www.example.com default;
    root        /var/www/vhosts/i-a39asg02ar234srgas7293hga9w745
    index       index.html index.htm;
    charset     utf-8;

変更後は nginx を再起動を行ってください。

※ www.example.com は実際のURLやドメイン名に置き換えてください。

  

C. バーチャルホストを追加し、そちらを使う

WordPress (バーチャルホスト) を追加をする。
コンテンツなどがすでにあればデータの移行が必要です。

$ sudo su -

# cd /var/www/vhosts/
# wp-setup www.example.com

原因

WordPress のコアで行っているの処理の問題です。
WordPress 4.9 では以下の部分です:
https://core.trac.wordpress.org/browser/branches/4.9/src/wp-includes/pluggable.php#L330


nginx の /etc/nginx/fastcgi_params  では nginx の変数 $server_name を渡しています。

fastcgi_param  SERVER_NAME        $server_name;

これは http://nginx.org/en/docs/http/ngx_http_core_module.html にもあるように
> $server_name
>    name of the server which accepted a request

$server_name はリクエストされたサーバ名です。これは conf 内の server_name ディレクティブから決定されます。
$server_name が未設定の場合、メールの送信が正しく処理されないためです。