Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день!
Снова пытаюсь довести до ума отправляемые письма через laravel Mail. Нужно вставить картинку в теле письма, как inline.
Делаю так
$fName = $mail->embedData(
Storage::disk($imgObj->disk)->get($imgObj->path.$imgObj['sizes'][$sizes]['path'].$imgObj['sizes'][$sizes]['file']),
$imgObj['orig_name']
);
И потом уже подменяю src у img на $fName.
Письмо приходит и почтовик показывает, как в коде картинку, так и в конце письма. А вот если через Яндекс веб интерфейс смотреть, то там совсем не показывает картинку(судя по коду яндекс пытается ее уменьшить...). Но вот другие письма из тех же рассылок приходят хорошо...
Или пользовать другую либу для работы с почтой?
Не в сети
покажи пример проблемного html и беспроблемного html. может статься, в процессе ты сам увидишь разницу.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Да и в правду косяк был, не заметил сразу. Но вот трабл появился другой. У меня шаблон письма задается через админку(система рассылок). Далее я в методе build хочу проверить все картинки и заменить их на инлайн.
В конце метода вызвать код
return $this->view('MailList::mail-send', ['data' => $msg]);
Где и обрисую шаблон. Но трабл в том, что я совсем не могу понять как теперь получить доступ к embedData...
Не в сети
Нашел вот такое решение
$this->withSwiftMessage(function($swift) {
$cid = $swift->embed(
\Swift_Image::fromPath(public_path('/images/logo.png'))
);
$body = $swift->getBody();
$body = str_replace('LOGO-REPLACEMENT', $cid, $body);
$swift->setBody($body);
});
Но тут не почему то метода embedData. А так же getBody выдает null. Может я что не так еще сделал, не пойму
Вот мой кусок кода в методе build
$this->withSwiftMessage(function($message)
use ($msg)
{
// print_r($message);
// dd($message->getBody());
$message->setBody ( preg_replace_callback("|<img.*?data-id=[\'\"]{1}(\d+)[\'\"]{1}.*?>|", function($matches)
use ($message)
{
// dd('23');
$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])) {
//dd($message);
$fName = $message->embedData(
Storage::disk($imgObj->disk)->get($imgObj->path.$imgObj['sizes'][$sizes]['path'].$imgObj['sizes'][$sizes]['file']),
$imgObj['orig_name']
);
//dd($fName);
$img = preg_replace("/src=[\'\"]{1}.*?[\'\"]{1}/", "src=\"".$fName."\"", $img);
}
}
return $img;
}, $message->getBody() ) );
});
Не в сети
С embed разобрался. Доки надо в другом месте читать .
$fName = $message->embed(
new \Swift_Image(
Storage::disk($imgObj->disk)->get($imgObj->path.$imgObj['sizes'][$sizes]['path'].$imgObj['sizes'][$sizes]['file']),
$imgObj['orig_name']
)
);
Вот теперь не понятно как боди подменить, метод setBody ничего не меняет. Может тут нужно от шаблона отказаться и через код задавать боди? Просто убрать View не прокатывает...
Не в сети
Вообщем поглядел код ларавела mailer, там $message->setBody($msg); отрабатывает после вызова withSwiftMessage в итоге перетирает значение, что я ставлю ... Есть ли какие идеи как корректно реализовать данную мне задачу? Может как то работать напрямую со Swift ?
Не в сети
Напрашивается парсинг весь делать во вьюхе, но это ведь не совсем правильно с точки зрения кода...
Не в сети
Решение таки найдено на просторах инета . Нужно в конце вызвать код $this->view([], []); Тогда функция $message->setBody() начнет работать. Не знаю насколько это вообще где то документировано и не поломают ли разработчики в дальнейшем этот код, но пока работает
Не в сети
Страницы 1