投稿日:2025年6月24日

エンベロープFrom(Envelope-From)とは、メール送信元のアドレスのことです。

エンベロープは「封筒」を意味します。
封筒の送り主(差出人)がエンベロープfrom。右側の宛名(送信先)はエンベロープtoに該当します。

▲便箋に書く宛名(ヘッダーto)と送り主(ヘッダーfrom)が合致しているかを確認しなりすまし行為を検出する効果があります。
PHPでのエンベロープfromの記述は下記のように、差出人のメールアドレスの接頭辞に「-f」を付与し、mb_send_mail関数の第5引数に指定します。

$return_path = '-f'.env('MAIL_FROM_ADDRESS'); // ← エンベロープfrom

// 管理者宛メール。第5引数に指定
mb_send_mail($email_admin,$subject,$adminMessage,$header_adm,$return_path);

Laravelにはメール送信にMailableクラスという送信処理があります。
フォームの確認画面から完了画面への遷移のmiddlewareに以下のように記載します。

routes/web.php(確認画面から完了画面への遷移)

// 完了ページ
Route::get('/complete', [FormController::class, 'complete'])
        ->name('form.complete');
Route::post('/complete', [FormController::class, 'complete'])
        ->middleware(InfoMiddleware::class)// ← これ
        ->middleware(RegenerateToken::class);

http/Middleware/infoMiddleware.php

// 管理者宛メール
Mail::to($email_admin)->send(new AppFormAdminMail($contents));

// ユーザー宛メール
Mail::to($email_user)->send(new AppFormUserMail($contents));

もちろん、この方法でも管理者、登録者ともにメールは送信されるのですが、管理者メールが下図のような未確認メール扱いになってしまいます。

▲メールヘッダーも以下で紹介するSPF、DKIM、DMARCが適用されずfailが表示されます。

サーバー側の設定でSPFやDKIM、DMARCの設定を行えば解決すると色々なサイトで紹介されてますが、解決にいたりませんでした。

▲さくらサーバーのメールドメインの設定

SPF(Sender Policy Framework):メールの送信元が正当なものかどうかを確認する仕組み。
DKIM (DomainKeys Identified Mail) :メールの送信ドメイン認証技術の一つ。改ざんやなりすましを防ぐために使用される。
DMARC(Domain-based Message Authentication, Reporting, and Conformance):メールの送信元ドメインを認証する技術の一つで、フィッシング詐欺やなりすましメールを防ぐために使用される。

ChatGPTに相談したところ解決に至ったので紹介したいと思います。

.env.example

MAIL_MAILER=sendmail
MAIL_SENDMAIL="/usr/sbin/sendmail -t -i -finfo@xxxxx.jp"
MAIL_FROM_ADDRESS=info@xxxxx.jp
MAIL_FROM_NAME="タイトル"

▲MAILに関する記述を、このようにします。
元からの記述はコメントアウト、もしくは削除します。
本番環境にデプロイ後cp .env.example .envで.envを作成します。

config/mail.php

// 'sendmail' => [
//     'transport' => 'sendmail',
//     'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
// ],

'sendmail' => [
  'transport' => 'sendmail',
  'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -t -i -finfo@xxxxx.jp'),
],

▲元からの記述(1〜4行目)はコメントアウト、もしくは削除し
'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -t -i -finfo@xxxxx.jp'),
のように記述します。

以下はsendmailオプションの詳細です。

オプション意味詳細
-bsSMTPモード SMTPサーバとして動作し、標準入力からSMTPセッションを受け付けます(PostfixやEximが内部で使用)。Laravel等からは通常 使用しません。
-i単独のドット無視 メール本文中の「.(ドット)単独の行」を「メール終了の合図」と解釈せず、そのまま本文として扱います(SMTPの仕様による)。安全対策として推奨されます。
-tヘッダから宛先取得To:、Cc:、Bcc: ヘッダーから宛先を取得して送信します。コマンドラインで宛先を指定しない場合に必須。
-fエンベロープFrom指定 Return-Path(バウンスメールの返送先)を指定します。SPFやDMARCに関係し、正しく設定しないと 迷惑メール判定されやすくなります。

上記を修正したらLaravelで以下を実行しそれぞれのキャッシュをクリアします。

php artisan config:clear
php artisan cache:clear
php artisan route:clear

▲結果、SPF、DKIM、DMARCも通過しきちんと受信できました。

まとめ

当初、かなり時間をかけて検証しましたが解決に至らず。。。
middlewareに素のPHPでガリガリ書いて対応していました。

フォーム制作もこなれてきたので検証を兼ねてさらに探求してみました。
ググっても全くヒットしなかったので解決できたことに手応えを感じています。

AI抜きにはありえない世の中になりつつあります。
面白いようにソースコードが生成され、考えなくてもモノが作れる不安さもありましたが、良きパートナーとして使い続けたいと思います。

最後まで読んでいただき、ありがとうございました。

Laravel関連

【Laravel フォーム】チェックボックスで「その他」「その他入力欄」必須項目の扱いに苦労した話。

【保存版】Laravel 申し込みフォーム 複数、択一のチェックボックス攻略

Laravel シンボリックリンクやgit pullなど、デプロイ後に行うこと。

JavaScriptとLaravel(PHP)のデータ渡しでハマったこと。連想配列を文字列で書き出していたのが原因!

Laravelでフォームを作った話。各項目とバリデーション。ページ遷移で入力内容を保持する方法。

Laravel GitHubからさくらサーバーにデプロイしてみる。

Laravelをローカル環境とさくらサーバーに入れてみる。

Pocket