Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 16.08.2018 12:28:28

Mail тонкости

Добрый день!

Снова пытаюсь довести до ума отправляемые письма через 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.

Письмо приходит и почтовик показывает, как в коде картинку, так и в конце письма. А вот если через Яндекс веб интерфейс смотреть, то там совсем не показывает картинку(судя по коду яндекс пытается ее уменьшить...). Но вот другие письма из тех же рассылок приходят хорошо...

Или пользовать другую либу для работы с почтой?

Не в сети

#2 16.08.2018 13:06:33

Re: Mail тонкости

покажи пример проблемного html и беспроблемного html. может статься, в процессе ты сам увидишь разницу.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 18.08.2018 19:28:44

Re: Mail тонкости

Да и в правду косяк был, не заметил сразу. Но вот трабл появился другой. У меня шаблон письма задается через админку(система рассылок). Далее я в методе build хочу проверить все картинки и заменить их на инлайн.
В конце метода вызвать код

return $this->view('MailList::mail-send', ['data' => $msg]); 

Где и обрисую шаблон. Но трабл в том, что я совсем не могу понять как теперь получить доступ к embedData...

Не в сети

#4 18.08.2018 19:43:30

Re: Mail тонкости

Нашел вот такое решение

$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() ) );
			});

Не в сети

#5 19.08.2018 06:09:09

Re: Mail тонкости

С embed разобрался. Доки надо в другом месте читать smile.

		                	 $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 не прокатывает...

Не в сети

#6 23.08.2018 07:10:22

Re: Mail тонкости

Вообщем поглядел код ларавела mailer, там $message->setBody($msg); отрабатывает после вызова withSwiftMessage в итоге перетирает значение, что я ставлю sad... Есть ли какие идеи как корректно реализовать данную мне задачу? Может как то работать напрямую со Swift ?

Не в сети

#7 23.08.2018 07:24:12

Re: Mail тонкости

Напрашивается парсинг весь делать во вьюхе, но это ведь не совсем правильно с точки зрения кода... sad

Не в сети

#8 25.08.2018 19:22:31

Re: Mail тонкости

Решение таки найдено на просторах инета smile . Нужно в конце вызвать код $this->view([], []); Тогда функция $message->setBody() начнет работать. Не знаю насколько это вообще где то документировано и не поломают ли разработчики в дальнейшем этот код, но пока работает smile

Не в сети

Подвал раздела