Добрый день!
Делаю отправку писем через laravel. Но шаблон у меня задается через админку, а не через view. Далее в коде я проверяю картинки внутри сообщения, подменяю их на inline и делаю отправку. Использую для этого вот такой код:
$this->withSwiftMessage(function ($message) use ($msg) {
$message->setBody (preg_replace_callback("|<img.*?data-id=[\'\"]{1}(\d+)[\'\"]{1}.*?>|", function ($matches) use ($message) {
$img = $matches[0];
$imgId = $matches[1];
if (($imgObj = \Backend\Root\Upload\Models\MediaFile::find($imgId))) {
$sizes = 'orig';
if (preg_match('/width=[\'\"]{1}(\d+)[\'\"]{1}/', $img, $width) && preg_match('/height=[\'\"]{1}(\d+)[\'\"]{1}/', $img, $height)) {
$sizes = \Backend\Root\Upload\Services\Uploads::sizesToStr([ $width[1], $height[1] ]);
}
if (isset($imgObj['sizes'][$sizes])) {
$fName = $message->embed(new \Swift_Image(
Storage::disk($imgObj->disk)->get($imgObj->path.$imgObj['sizes'][$sizes]['path'].$imgObj['sizes'][$sizes]['file']), $imgObj['orig_name'])
);
$img = preg_replace("/src=[\'\"]{1}.*?[\'\"]{1}/", "src=\"".$fName."\"", $img);
}
}
return $img;
}, $msg ), 'text/html' );
});
Но дело в том, что метод $message->setBody отказывается работать, так как в ларавеле в классе Mailer методе send сделано так
call_user_func($callback, $message);
$this->addContent($message, $view, $plain, $raw, $data);
И функция addContent перекрывает мой вызов setBody из калбэк функции.
Можно конечно весь этот код в шаблоне реализовать, но это как то не правильно. А как корректно это реализовать? Если я комичну метод $this->addContent то все работает хорошо...