2015-04-15 4 views
4

Я работаю над своим первым проектом Laravel 5 и отчаянно нуждаюсь в способе встроить CSS из своих сообщений электронной почты. Я использую Mailgun из-за проблем с доставкой с Mandrill (к сожалению, Mandrill имеет встроенные возможности CSS, но Mailgun этого не делает).Laravel 5 - Inline CSS по электронной почте

Похоже, что большинство пакетов для встраивания CSS в электронные письма для Laravel устарели, большинство из них перестали нормально работать на версии 4.2. Я пробовал:

Inlining CSS when sending an email with Mailgun in Laravel - Antoine Augusti - кажется, ничего не делает, электронные письма не включены. По-видимому, существует несколько фундаментальных различий в L5, которые нарушают этот подход

fedeisas/laravel-mail-css-inliner - Не работает. Кто-то отправил некоторый код в конце этого Issue, но я не могу понять, как его реализовать (также не знаю, предназначено ли оно для Laravel 5).

bweston92/laravel-inline-css-mailer - Выглядит многообещающе, но, похоже, ничего не делает, CSS не является встроенным.

У кого-нибудь есть рекомендации? Мне бы очень хотелось иметь возможность встроить CSS для электронной почты, особенно когда я вставляю HTML перед отправкой (из редактора WYSIWYG).

+0

Просто посоветуйте, опубликовать свой новый класс как ответ на ваш вопрос вместо того, чтобы внедрить его на свой вопрос;) –

+0

I Я надеюсь, что есть лучшие предложения .. – NightMICU

+1

Я понимаю, но вы можете опубликовать его как ответ и не принимать его, ожидая, что кто-то даст вам лучший ответ –

ответ

4

Вдохновленный bweston92/laravel-inline-css-mailer, с которым я не мог работать, я придумал этот маленький класс. Пожалуйста, не стесняйтесь предлагать предложения или указывать мне в лучшем направлении, просто нужно что-то быстро.

<?php namespace App\Library; 

    use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles; 

    /** 

* Class inlineEmail 
* 
* Returns rendered Email view with inlined CSS 
* @package App\Library 
*/ 
class inlineEmail { 
    /** 
    * Filename of the view to render 
    * @var string 
    */ 
    private $view; 
    /** 
    * Data - passed to view 
    * @var array 
    */ 
    private $data; 

    /** 
    * @param string $view Filename/path of view to render 
    * @param array $data Data of email 
    */ 
    public function __construct($view, array $data) 
    { 
     // Render the email view 
     $emailView = view($view, $data)->render(); 
     $this->view = $emailView; 
     $this->data = $data; 
    } 

    /** 
    * Convert to inlined CSS 
    * 
    * @return string 
    * @throws \TijsVerkoyen\CssToInlineStyles\Exception 
    */ 
    public function convert() 
    { 
     $converter = new CssToInlineStyles(); 
     $converter->setUseInlineStylesBlock(); 
     $converter->setCleanup(); 
     $converter->setStripOriginalStyleTags(); 
     $converter->setHTML($this->view); 
     $content = $converter->convert(); 

     return $content; 
    } 
} 

Использование:

$data = ['someVar' => 'someValue']; 
     $inlineEmail = new inlineEmail('emails.group-email', $data); 
     $content = $inlineEmail->convert(); 
     Mail::queue('emails.raw', ['content' => $content], function($message) use ($data) { 
      $message->subject('Hello World') 
       ->to('[email protected]') 
       ->bcc($data['recipients']); 
     }); 

Преобразованными, встраиваемый HTML/CSS затем передается emails.raw, который содержит только {!! $content !!}.

Вот шаблон, который я использую для большинства своих писем - это, по сути, минимальная версия Bootstrap для электронной почты. Я бы отблагодарил его автора, но у меня возникли проблемы с отслеживанием того, где я его нашел, если кто-то знает, пожалуйста, оставьте комментарий. Есть много других шаблонов, просто найдите шаблон Bootstrap Email Template или HTML Email Boilerplate.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>Email Title</title> 
    <style type="text/css"> 
     * { 
      margin: 0; 
      padding: 0; 
      font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; 
      font-size: 100%; 
      line-height: 1.6; 
     } 
     img { 
      max-width: 100%; 
     } 
     body { 
      -webkit-font-smoothing: antialiased; 
      -webkit-text-size-adjust: none; 
      width: 100%!important; 
      height: 100%; 
     } 
     a { 
      color: #348eda; 
     } 
     .btn-primary { 
      text-decoration: none; 
      color: #FFF; 
      background-color: #348eda; 
      border: solid #348eda; 
      border-width: 10px 20px; 
      line-height: 2; 
      font-weight: bold; 
      margin-right: 10px; 
      text-align: center; 
      cursor: pointer; 
      display: inline-block; 
      border-radius: 25px; 
     } 
     .btn-secondary { 
      text-decoration: none; 
      color: #FFF; 
      background-color: #aaa; 
      border: solid #aaa; 
      border-width: 10px 20px; 
      line-height: 2; 
      font-weight: bold; 
      margin-right: 10px; 
      text-align: center; 
      cursor: pointer; 
      display: inline-block; 
      border-radius: 25px; 
     } 
     .last { 
      margin-bottom: 0; 
     } 
     .first { 
      margin-top: 0; 
     } 
     .padding { 
      padding: 10px 0; 
     } 
     table.body-wrap { 
      width: 100%; 
      padding: 20px; 
     } 
     table.body-wrap .container { 
      border: 1px solid #f0f0f0; 
     } 
     table.footer-wrap { 
      width: 100%; 
      clear: both!important; 
     } 
     .footer-wrap .container p { 
      font-size: 12px; 
      color: #666; 

     } 
     table.footer-wrap a { 
      color: #999; 
     } 
     h1, h2, h3 { 
      font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 
      line-height: 1.1; 
      margin-bottom: 15px; 
      color: #000; 
      margin: 40px 0 10px; 
      line-height: 1.2; 
      font-weight: 200; 
     } 
     h1 { 
      font-size: 36px; 
     } 
     h2 { 
      font-size: 28px; 
     } 
     h3 { 
      font-size: 22px; 
     } 
     p, ul, ol { 
      margin-bottom: 10px; 
      font-weight: normal; 
      font-size: 14px; 
     } 
     ul li, ol li { 
      margin-left: 5px; 
      list-style-position: inside; 
     } 
     .container { 
      display: block!important; 
      max-width: 600px!important; 
      margin: 0 auto!important; /* makes it centered */ 
      clear: both!important; 
     } 
     .body-wrap .container { 
      padding: 20px; 
     } 
     .content { 
      max-width: 600px; 
      margin: 0 auto; 
      display: block; 
     } 
     .content table { 
      width: 100%; 
     } 
    </style> 
</head> 

<body bgcolor="#f6f6f6"> 
<!-- Main Body --> 
<table class="body-wrap"> 
    <tr> 
     <td></td> 
     <td class="container" bgcolor="#FFFFFF"> 
      <div class="content"> 
       <table> 
        <tr> 
         <td align="center"> 
          <img src="https://example.com/images/logo.png" alt="Company Logo"/> 
         </td> 
        </tr> 
        <!-- Email content goes here .. --> 
        @yield('content') 
       </table> 
      </div> 
     </td> 
     <td></td> 
    </tr> 
</table> 
<!-- /Main Body --> 
<!-- Footer --> 
<table class="footer-wrap"> 
    <tr> 
     <td></td> 
     <td class="container"> 
      <div class="content"> 
       <table> 
        <tr> 
         <td align="center"> 
          <p>Footer goes here</p> 
         </td> 
        </tr> 
       </table> 
      </div> 
     </td> 
     <td></td> 
    </tr> 
</table> 
<!-- /Footer --> 
</body> 
</html> 

Типичная электронная почта, которая расширяет этот вид будет выглядеть примерно так:

@extends('emails.template') 
@section('content') 
    <tr> 
     <td> 
      <h1>Example Email</h1> 
      <p>This is an example email. There are many like it but this one is mine.</p> 
     </td> 
    </tr> 
    <tr> 
     <td align="center"> 
      <p> 
       <a href="http://example.com" class="btn-primary">This is a Button</a> 
      </p> 
     </td> 
    </tr> 
@endsection 
+0

Я тоже пробовал ваш класс, но я не вижу, где вы конвертируете свой css ?? Я добавил эту строку в функцию преобразования: $ css = file_get_contents (public_path(). '/css/main.css'); для конвертирования css также, но макет не на 100%, как я ожидал! – arakibi

+0

Вы используете Laravel и установили ли вы CssToInlineStyles через Composer? – NightMICU

+0

yes Я установил CssToInlineStyles в laravel 5 – arakibi