В этой ветке настройки мейлера от Андрея и мои попытки сделать отправку писем универсальной, учитывая работу с кучей модулей и SOLIDной. Судя по комментариям диписка и моим ощущениям - получилось неплохо, поэтому предлагю все таки разобраться, а не рубить из за кажущейся сложности

This commit is contained in:
vasya
2026-03-15 17:47:40 +03:00
parent e927910fda
commit 8dc2f787f5
+145
View File
@@ -0,0 +1,145 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
use App\Mail\BaseMailerObj;
class Mailer extends Mailable
{
#Гаврилов
//ЗАЧЕМ ОНИ СЮДА ДОБАВИЛИСЬ? ТЕСТИРОВАЛ ОТПРАВКУ ОЧЕРЕДЕЙ? УДАЛИ ЕСЛИ НЕ НУЖНЫ ОТСЮДА И ИЗ USE
use Queueable, SerializesModels;
/**
* @var array данные для письма
*/
public $mailData;
/**
* @var string имя blade шаблона
*/
public $mailLayout;
/**
* @var string название приложения, которое отправляет сообщение
*/
public $appName;
/**
* Конструктор
*
* @param array $to - адресаты письма
* @param string $subject - тема письма
* @param string $body - основной текст письма
* @param array $copy - кто будет в копии
* @param string $header - шапка письма, например, для заголовка
* @param string $footer - подвал письма, например для технической информации
* @param string $appName название приложения назмещается под названием платформы Magic в футере письма
* @param string $mailLayout используемый blade шаблон для отправки
*/
public function __construct(BaseMailerObj $mailerObject)
{
//Преобразуем передаваемых адресатов, добавляя им логин
$this->mailData['to'] = $this->addDomain($mailerObject->to);
//$this->mailData['to'] = $to;
$this->mailData['copy'] = !empty($copy) ? $this->addDomain($mailerObject->copy) : [];
$this->mailData['subject'] = $mailerObject->subject;
$this->mailData['body'] = $mailerObject->body;
$this->mailData['header'] = $mailerObject->header;
$this->mailData['footer'] = $mailerObject->footer;
$this->checkTestEnv();
$this->appName = $mailerObject->appName;
$this->mailLayout = $mailerObject->mailLayout;
}
/**
* Метод корректирует свойства отправляемого письма, если среда разработки тестовая
*
* @return void
*/
private function checkTestEnv()
{
//Если тестировщик аутентифицирован, берется его логин из сессии, в противном случае берется закрепленный в глобальных конфигах тестовый адрес (который разработчик указывает для своего локального тестирования сам). Можно в будущем улучшить логику с определением тестового емейла, например, передавая к api ендпоинту заголовок с тестовым емейлом, но на старте пока так
// if (auth()->user()->login) {
if (session()->has('_auth_login')) {
$userLogin = session()->get('_auth_login');
} else {
$userLogin = config('app.mail_test_addressee');
}
// echo '<pre>'; var_dump($userLogin); echo'</pre>';
// $test = config('app.test_env');
// $test2 = config('app.mail_test_addressee');
// echo '<pre>'; var_dump($test); echo'</pre>';
// echo '<pre>'; var_dump($test2); echo'</pre>';
//}
// $userLogin = auth()->user()->login ? auth()->user()->login : (session()->has('_auth_login') ? session()->get('_auth_login')) : config('MAIL_TEST_ADRESSEE');
//Если работаем из под тестовой среды
if (config('app.test_env')) {
//Информация для тестирования будет добавлена в футер сообщения. В нее включаем информацию об адресатах и копии, если бы письмо отправлялось на проде
$testInfo = "На проде письмо отправится: " . implode(", ", $this->mailData['to']) . ". В копии: " . implode(", ", $this->mailData['copy']);
$this->mailData['footer'] .= $testInfo;
//Копию очищаем
$this->cc('');
//echo '<pre>'; var_dump(['dgavrilov@rencredit.ru']); echo'</pre>';
//echo '<pre>'; var_dump($this->addDomain([$userLogin])); echo'</pre>';
$this->to($this->addDomain([$userLogin]));
//$this->to(['dgavrilov@rencredit.ru']);
} else {
//ГАВРИЛОВ. ДОБАВЬ ДОМЕН К ЛОГИНАМ
$this->to($this->mailData['to']);
$this->to($this->mailData['copy']);
}
}
/**
* Хэлпер преобразует всех адресатов, добавляя им почтовый домен
*
* @param array $addresseesArr адресаты
* @return array
*/
private function addDomain(array $addresseesArr): array
{
$domain = config('mail.mail_domain');
return array_map(function($el) use($domain) {return $el . "@" . $domain;}, $addresseesArr);
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: $this->mailData['subject'],
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
// view: 'view.name',
view: $this->mailLayout,
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}