Невозможно отправить электронное письмо в формате HTML в Laravel 5.8

Мне сложно отправлять электронную почту в формате HTML через приложение Laravel. Я попытался вернуть представление, и оно хорошо возвращается, но когда я отправляю электронное письмо на настоящее электронное письмо, оно приходит в виде обычного текстового сообщения без всякого анализа HTML.

Макет My View для электронного письма выглядит следующим образом:

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">

<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" 
rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Roboto&display=swap" 
  rel="stylesheet">
<!-- Bootstrap CSS File -->
<link href="{{ url('design-assets/lib/bootstrap/css/bootstrap.min.css')}}" 
 rel="stylesheet">

 <!-- Main Stylesheet File -->
 <link href="{{ url('design-assets/css/style.css" rel="stylesheet')}}">
 <link href="{{ url('design-assets/css/prof-custom.css')}}" 
 rel="stylesheet">
 @yield('styles')
</head>

<body id="body">
@yield('content')
<!-- JavaScript Libraries -->
<script src="{{ url('design-assets/lib/jquery/jquery.min.js')}}"></script>
<script src="{{ url('design-assets/lib/jquery/jquery-migrate.min.js')}}"> 
</script>
 <script src="{{ url('design-assets/lib/bootstrap/js/bootstrap.bundle.min.js') }}/"></script>

<!-- Contact Form JavaScript File -->
<!-- Template Main Javascript File -->
<script src="{{ url('design-assets/js/main.js') }}"></script>
@yield('scripts')
</body>

The actual email view is as follows:

@extends('layouts.mail')
@section('content')
<div class="card montserrat-font">
<div class="card-header">
    <div class="card-title">Contact Message from the Website</div>
</div>
<div class="card-body">
    <div class="card-text">
        Dear Sir,<br /><br />
    We have a contact from our events website with the following details<br/><br />
    </div>
    <div class="table-responsive">
        <table class="table table-striped">
            <tr>
                <th>Name of Sender:</th><td>{{$mail_info['name']}}</td>
            </tr>
            <tr>
                <th>Email of Sender:</th><td>{{$mail_info['email']}}</td>
            </tr>
            <tr>
                <th>Phone number of Sender:</th><td>{{$mail_info['phone']}}</td>
            </tr>
            <tr>
                <th>Subject of Message:</th><td>{{$mail_info['subject']}}</td>
            </tr>                       
            {{--  <tr>
                <th>Message:</th><td>{{$mail_info['message']}}</td>
            </tr>  --}}
        </table>
    </div>
    <div class="card-title">Message body</div>
    <div class="card-text">
        {!! $mail_info['message'] !!}
    </div>
</div>
</div>
@endsection

The problem is that when I check the format returned from the email view by returning the view as follows:

 return new \App\Mail\ContactMail(['email' => '[email protected]', 'name' => 'Testing Name','phone'=>'08033776502', 'subject' => 'Just a test', 'message' => "This is  a message returned from testing the view email template"]);

Я получаю представление, которое представляет именно то, что я хочу, но когда я отправляю электронное письмо, оно приходит в виде обычного текстового сообщения.

Вот как я называю представление через почтовый класс

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class ContactMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public $mail_info;

public function __construct($mail_info_array)
{
    $this->mail_info = $mail_info_array;
}

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    // return $this->view('view.name');
    return $this->view('mails.web-contact', ['mail_info'=>$this->mail_info]);
}
}

а затем через контроллер следующим образом:

 public function post_contact(Request $request)
{
    try
    {
        $data = $request->all();
        $this->validate_recaptcher($data['g-recaptcha-response']);
        $this->validator($request->all())->validate();
        \Mail::to('[email protected]')->send(new \App\Mail\ContactMail(['email' => $request->email, 'name' => $request->name,'phone'=>$request->phone, 'subject' => $request->subject, 'message' => $request->message]));
        return redirect()->route('ContactForm')->with('msg',"<div class='alert alert-success'><span class='fa fa-check'></span> Message successfully sent. I will get back to you soon if necessary</div>");
        // return new \App\Mail\ContactMail(['email' => $request->email, 'name'=> $request->name,'phone'=>$request->phone, 'subject' => $request->subject, 'message' => $request->message]);
    }
        catch(Exception $e)
    {
        return back()->withInputs()->with('msg',"<div class='alert alert-danger'><span class='fa fa-warning'></span> ".$e->getMessage()."</div>");
    }        
}

Я использую драйвер электронной почты smtp, и все остальное работает, как ожидалось.

Я буду признателен за любое руководство, чтобы решить эту проблему

Спасибо


person Josh    schedule 13.07.2019    source источник
comment
Как вы на самом деле отправляете электронное письмо?   -  person ADyson    schedule 13.07.2019
comment
@ADyson, я обновил свой вопрос, чтобы показать это. Спасибо   -  person Josh    schedule 13.07.2019
comment
В порядке. Итак, что вы на самом деле видите, когда приходит электронное письмо? Можете ли вы увидеть все теги HTML, напечатанные на экране, вместо того, чтобы использовать их для управления макетом?   -  person ADyson    schedule 13.07.2019
comment
@ADyson, я не вижу напечатанных тегов. Оно выглядит как обычное текстовое сообщение электронной почты.   -  person Josh    schedule 13.07.2019
comment
Вы просматривали источник сообщения? Есть ли там HTML-теги? Что такое пантомима? С какими почтовыми клиентами вы тестировали? Они могут сильно различаться по способу представления результатов. Может быть, это HTML, но просто не использует CSS, потому что ссылки на него внешние. Многим почтовым клиентам это не нравится. Если вы читали электронную почту в формате HTML, она всегда рекомендует использовать встроенные стили или, по крайней мере, помещать блок <style> в тело письма.   -  person ADyson    schedule 13.07.2019
comment
@ADyson, спасибо за ваши усилия, но в Laravel обычной практикой является отправка html-сообщения таким способом без необходимости переписывать встроенные стили. Тем не менее, я попробую это и посмотрю, как это пойдет.   -  person Josh    schedule 13.07.2019


Ответы (1)


Добавьте свои стили в head часть макета электронной почты. Почтовые клиенты обычно игнорируют CSS, на который есть внешние ссылки. Пример:

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">

...

<style type="text/css">
    your custom styles here
</style>

...

</head>
</html>

Это можно сделать с помощью Markdown.

Настройка CSS После экспорта компонентов каталог resources / views / vendor / mail / html / themes будет содержать файл default.css. Вы можете настроить CSS в этом файле, и ваши стили будут автоматически встроены в HTML-представления ваших почтовых сообщений Markdown.

person adam    schedule 13.07.2019
comment
Но @Adam, в Laravel обычной практикой является отправка электронной почты html таким образом. - person Josh; 13.07.2019
comment
@Josh The Laravel: Markdown - person adam; 13.07.2019