diff --git a/src/app/Mail/Helper.php b/src/app/Mail/Helper.php --- a/src/app/Mail/Helper.php +++ b/src/app/Mail/Helper.php @@ -69,10 +69,12 @@ $mail->cc($params['cc']); } - $fromAddress = Tenant::getConfig($tenantId, 'mail.from.address'); - $fromName = Tenant::getConfig($tenantId, 'mail.from.name'); - $replytoAddress = Tenant::getConfig($tenantId, 'mail.reply_to.address'); - $replytoName = Tenant::getConfig($tenantId, 'mail.reply_to.name'); + // Note: We're not using Laravel's global 'from' and 'reply_to' settings + + $fromAddress = Tenant::getConfig($tenantId, 'mail.sender.address'); + $fromName = Tenant::getConfig($tenantId, 'mail.sender.name'); + $replytoAddress = Tenant::getConfig($tenantId, 'mail.replyto.address'); + $replytoName = Tenant::getConfig($tenantId, 'mail.replyto.name'); if ($fromAddress) { $mail->from($fromAddress, $fromName); diff --git a/src/config/mail.php b/src/config/mail.php --- a/src/config/mail.php +++ b/src/config/mail.php @@ -92,9 +92,13 @@ | */ - 'from' => [ - 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), - 'name' => env('MAIL_FROM_NAME', 'Example'), + // Note: Laravel uses 'from', we added 'sender'. This way we make sure + // Laravel does not overwrite our From header that we set in App\Mail\Helper::sendMail(). + + 'from' => null, // do not use! + 'sender' => [ + 'address' => env('MAIL_FROM_ADDRESS', ''), + 'name' => env('MAIL_FROM_NAME', ''), ], /* @@ -108,7 +112,13 @@ | */ - 'reply_to' => [ + // Note: Laravel uses 'reply_to', we added 'replyto'. This way we make sure + // Laravel does not add an extra Reply-To header on top of our per-tenant + // Reply-To header that we set in App\Mail\Helper::sendMail(). + // More https://github.com/laravel/framework/issues/43034. + + 'reply_to' => null, // do not use! + 'replyto' => [ 'address' => env('MAIL_REPLYTO_ADDRESS', ''), 'name' => env('MAIL_REPLYTO_NAME', ''), ], diff --git a/src/tests/Feature/Jobs/Password/RetentionEmailJobTest.php b/src/tests/Feature/Jobs/Password/RetentionEmailJobTest.php --- a/src/tests/Feature/Jobs/Password/RetentionEmailJobTest.php +++ b/src/tests/Feature/Jobs/Password/RetentionEmailJobTest.php @@ -68,8 +68,8 @@ // Assert sender Mail::assertSent(PasswordExpirationReminder::class, function ($mail) { - return $mail->hasFrom(\config('mail.from.address'), \config('mail.from.name')) - && $mail->hasReplyTo(\config('mail.reply_to.address'), \config('mail.reply_to.name')); + return $mail->hasFrom(\config('mail.sender.address'), \config('mail.sender.name')) + && $mail->hasReplyTo(\config('mail.replyto.address'), \config('mail.replyto.name')); }); } } diff --git a/src/tests/Feature/Jobs/PasswordResetEmailTest.php b/src/tests/Feature/Jobs/PasswordResetEmailTest.php --- a/src/tests/Feature/Jobs/PasswordResetEmailTest.php +++ b/src/tests/Feature/Jobs/PasswordResetEmailTest.php @@ -68,8 +68,8 @@ // Assert sender Mail::assertSent(PasswordReset::class, function ($mail) { - return $mail->hasFrom(\config('mail.from.address'), \config('mail.from.name')) - && $mail->hasReplyTo(\config('mail.reply_to.address'), \config('mail.reply_to.name')); + return $mail->hasFrom(\config('mail.sender.address'), \config('mail.sender.name')) + && $mail->hasReplyTo(\config('mail.replyto.address'), \config('mail.replyto.name')); }); } } diff --git a/src/tests/Unit/Mail/HelperTest.php b/src/tests/Unit/Mail/HelperTest.php --- a/src/tests/Unit/Mail/HelperTest.php +++ b/src/tests/Unit/Mail/HelperTest.php @@ -51,8 +51,8 @@ Mail::assertSent(\App\Mail\SignupInvitation::class, function ($mail) { return $mail->hasTo('to@test.com') && $mail->hasCc('cc@test.com') - && $mail->hasFrom(\config('mail.from.address'), \config('mail.from.name')) - && $mail->hasReplyTo(\config('mail.reply_to.address'), \config('mail.reply_to.name')); + && $mail->hasFrom(\config('mail.sender.address'), \config('mail.sender.name')) + && $mail->hasReplyTo(\config('mail.replyto.address'), \config('mail.replyto.name')); }); // Test with a tenant (but no per-tenant settings) @@ -67,18 +67,18 @@ Mail::assertSent(\App\Mail\SignupInvitation::class, function ($mail) { return $mail->hasTo('to@test.com') && $mail->hasCc('cc@test.com') - && $mail->hasFrom(\config('mail.from.address'), \config('mail.from.name')) - && $mail->hasReplyTo(\config('mail.reply_to.address'), \config('mail.reply_to.name')); + && $mail->hasFrom(\config('mail.sender.address'), \config('mail.sender.name')) + && $mail->hasReplyTo(\config('mail.replyto.address'), \config('mail.replyto.name')); }); // Test with a tenant (but with per-tenant settings) Mail::fake(); $tenant->setSettings([ - 'mail.from.address' => 'from@test.com', - 'mail.from.name' => 'from name', - 'mail.reply_to.address' => 'replyto@test.com', - 'mail.reply_to.name' => 'replyto name', + 'mail.sender.address' => 'from@test.com', + 'mail.sender.name' => 'from name', + 'mail.replyto.address' => 'replyto@test.com', + 'mail.replyto.name' => 'replyto name', ]); $mail = new \App\Mail\SignupInvitation($invitation);