EC-CUBE4系のメール送信は、ルートディレクトリに設置されている.envのMAILER_DSNで設定します(4.0/4.1では名称がMAILER_URLです。記事末尾で触れます)。
設置したのに会員登録や注文のメールが届かない、という場合にまず確認するのがこの値です。
「エラーは出ないのにメールが来ない」初期値に注意
.envのMAILER_DSNは、app/config/eccube/packages/mailer.yamlを経由してメール送信機能(Symfony Mailer)に渡されます。
注意したいのは、未設定時のフォールバックが null://null(送信処理は成功扱いになるが、実際にはどこにも送らない設定)であることです(EC-CUBE 4.3.1の実機で確認)。
この状態ではエラーログに何も出ません。そのため「エラーは無いのにメールだけ来ない」という一見不可解な状態になります。設置直後にメールが届かないときは、真っ先に.envのMAILER_DSNが実在する送信先になっているかを確認してください。
送信方法別のMAILER_DSNの書き方
SMTPサーバーを指定する
契約しているサーバーやメールサービスのSMTPを指定するのが一般的です。
MAILER_DSN=smtp://ユーザー名:パスワード@ホスト名:587
詰まりやすいのは次の3点です。
- Gmailは通常のログインパスワードでは認証できません。Googleアカウントでアプリパスワードを発行して指定します
- パスワードに@や#などの記号が含まれる場合はURLエンコードが必要です。そのまま書くとDSNの区切り文字として解釈され、認証に失敗します
- ポート番号は省略しないでください
サーバーのsendmailを使う
外部SMTPを使わない場合は、サーバーのsendmailを指定できます。
MAILER_DSN=sendmail://default
旧記事にあるgmail://構文は4.2以降では使えません
4.0/4.1時代の情報にある gmail://username:password@localhost?auth_mode=oauth のような書き方は、4.2以降のSymfony Mailerでは動きません。Gmail専用のトランスポートは標準では同梱されていないため(4.3.1のcomposer構成で確認)、GmailもSMTP形式で指定してください。
変更後の反映とテスト
MAILER_DSNは実行時に読み込まれるため、書き換え後のキャッシュクリアは不要です。保存したら問い合わせフォームなどでテスト送信し、実際に届くかを確認してください。
「送信できていないのか、送信できているのに受信側で弾かれているのか」の切り分けは、ログの見方から順を追って次の記事にまとめています。
設定が正しいのに届かない場合
ログにエラーが無いのに届かない場合、送信はできていて、受信側で拒否または迷惑メールに振り分けられています。特にGmailは、SPF・DKIMなどの送信ドメイン認証を満たさないメールの受信を制限しており、.env側をいくら直しても解決しません。DNS側の設定が必要です。
GmailにEC-CUBEのメールが届かない・迷惑メールになる時の対策
EC-CUBE 4.0/4.1(MAILER_URL)の場合
4.0/4.1では設定キーの名称がMAILER_URLで、送信機能はSwiftMailerです。SMTPの指定は同様ですが、sendmailは MAILER_URL=sendmail://localhost と書きます。
エックスサーバーではこのsendmail指定でメールが送信できることを確認しています。初期値の MAILER_URL=smtp://localhost のままではレンタルサーバーで動作しないことが多く、タイムアウトまで長時間待たされた末に送信されない、という症状になります。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。