2008-12-11 3 views
5

У меня проблема с отправкой почтовых сообщений HTML с PHPMailer. Я делаю шаблон Smarty, и я получил от него весь код HTML, но когда я отправляю почту, я получил почту без включенного CSS (это только фоновый цвет, шрифт или что-то в этом роде). В PHPMailer я устанавливаю, что почта - это HTML.Как отправить HTML-письма с включенным CSS с помощью PHPMailer?

Есть ли способ отправить HTML-письмо с включенным CSS?

+0

Отметьте ответ на этот вопрос StackOverflow для хорошего списка ссылок на лучшие практики для электронных писем HTML: [Рекомендации и рекомендации при написании электронных писем HTML] (http://stackoverflow.com/questions/2229822/best-practices -considerations-when-writing-html-emails/21437734 # 21437734) – 2008-12-11 09:47:01

ответ

0

HTML и CSS чреваты болью и разочарованием. Нет ничего общего с PHP, очевидно, что большинство реализаций cough outlook cough были и остаются архаичными.

Это единственная область, где я советовал бы это (и кто-то может иметь более глубокое понимание/план *), но вы должны смотреть на отрезания CSS и стиль написания HTML середине 90-х с < столом >, < шрифта > и < ч > теги (о мой)

** пожалуйста, разделяющие:) *

+0

ну CSS действительно минималистичен, и да, у меня есть

, но только я действительно хочу изменить цвет фона или некоторые основные вещи. – gizmo2008-12-11 09:46:55

+0

Просто добавьте его в строку Я предлагаю – annakata 2008-12-11 09:51:05

+0

да, вы были правы «Gmail не поддерживает CSS, если он не встроен» – gizmo 2008-12-11 10:19:04

0

Как упоминается ваша таблица стилей?

Для электронной почты вы должны либо обеспечить абсолютный путь к таблице стилей или включать стили в голове шаблона

+0

, как я уже сказал, он включен в заголовок шаблона – gizmo 2008-12-11 09:44:37

0

я предполагаю, у вас есть CSS во внешнем файле, если это самое простое решение будет просто переместить его в заголовок html внутри почты.

Однако, поддержка css в почтовых клиентах - очень wonky, так что это может быть просто дерьмовая рендеринг с их стороны.

+0

У меня есть CSS в заголовке html внутри почты. Но thx за советом – gizmo 2008-12-11 09:44:03

1

Поддержка CSS по электронной почте очень ограничена, по крайней мере. Самая большая проблема заключается в том, что разные клиенты поддерживают разные наборы CSS-свойств.

Вы предоставляете нам очень мало условий для работы.

  • Как выглядит ваше сообщение электронной почты? Совпадает ли CSS вообще? Ваш CSS отображается на экране как текст?
  • Как выглядит ваш CSS?
  • Как выглядит ваш шаблон электронной почты?

Для получения дополнительной информации о поддержке CSS в электронной почте, пожалуйста, обратитесь к этому excellent overview.

+0

1. CSS вообще не отображается, только HTML отображается 2. my css выглядит: http://pastebin.com/m5787d770 3. и полный вид шаблонов: http: // pastebin .com/m346a5475 Спасибо за ссылку, я ценю ее. – gizmo 2008-12-11 10:01:44

+0

какой почтовый клиент вы используете? – 2008-12-11 10:20:28

1

некоторые почтовые клиенты будут вычистить > секции < голову так положить < стиль > </стиль > метки в пределах < корпус >.

0

Я нашел, что лучшая (самая читаемая) поддержка CSS является встроенной (style = ""). Печально, но верно.

6

Есть способ ...

$body = <<< YOUR_HTML_WITH_CSS_STYLE_TAGS 
<html> 
<head> 
    <style> 
     body * {width:1px;} 
     #adiv {padding:2px;} 
     .aclass {margin:3px;} 
    </style> 
</head> 
<body> 
    <div> 
     some html 
    </div> 
    <div id="adiv"> 
     <p class="aclass"> 
     </p> 
    </div> 
</body> 
</html> 
YOUR_HTML_WITH_CSS_STYLE_TAGS; 
    $doc = new DOMDocument(); 
    @$doc->loadHTML($body); 
    $xpd = new DOMXPath($doc); 
    0&&$node = new DOMElement(); 
    $result = $xpd->query('//img'); 
    foreach($result as $node){ 
     $attr = $node->getAttribute('src'); 
     $re = '/(http:\/\/.*?)?(\/.*+)/i'; 
     if(preg_match_all($re, $attr, $matches)){ 
      if(!empty($matches[1][0])&&0) 
       continue; 
      $attr = 'http://'.$_SERVER['HTTP_HOST'].$matches[2][0]; 
     } 
     $node->setAttribute('src',$attr); 
    } 
    false&&$node=new DOMElement()&&$child=new DOMElement(); 
    $result = $xpd->query('//style/..'); 
    foreach($result as $node){ 
     foreach($node->childNodes as $child){ 
      if(strtolower($child->nodeName)=='style'){ 
       $node->removeChild($child); 
       $css = $child->textContent; 
       $re = '/(.*?)\{([^}]+)\}/'; 
       if(preg_match_all($re, $css, $matches)){ 
        foreach($matches[1] as $idx=>$css_selector){ 
         $css_text = $matches[2][$idx]; 
         $css_text = preg_replace('/\s+/',' ',$css_text); 
         $css = new CSSQuery($doc); 
         foreach($css->query($css_selector) as $selected_node){ 
          $style = $selected_node->getAttribute('style'); 
          $selected_node->setAttribute('style', $style?$css_text:$style.';'.$css_text); 
         } 
        } 
       } 
      } 
     } 
    } 
    $body = $doc->saveHTML(); 

Этот код будет генерировать выходной сигнал HTML в $ тела, как это:

<html> 
<head> 
</head> 
<body> 
    <div style="width:1px;"> 
     some html 
    </div> 
    <div id="adiv" style="width:1px;padding:2px;"> 
     <p class="aclass" style="width:1px;margin:3px;"> 
     </p> 
    </div> 
</body> 
</html> 

CSSQuery класс можно найти на phpclasses.org. Эта реализация основана на том факте, что большинство веб-сайтов позволяют добавлять стиль только с помощью стиля атрибута встроенного тега, а не через теги стиля или теги ссылок.

Это довольно ограниченный и ограниченный синтаксис из-за регулярного выражения, это просто, но все же лучше, чем писать собственные атрибуты стиля в каждом теге HTML.

Смежные вопросы