У меня проблема с отправкой HTML-писем с помощью PHPMailer . Я делаю шаблон Smarty, и у меня есть весь HTML-код, но когда я отправляю почту, я получаю почту без встроенного CSS (это только фоновый цвет, шрифт или что-то в этом роде). В PHPMailer я устанавливаю, что почта – это HTML.
Есть ли способ отправить HTML-почту с включенным CSS?
Есть способ …
$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 в $ body следующим образом:
<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.
Поддержка CSS в электронной почте очень ограничена, по крайней мере. Самая большая проблема заключается в том, что разные клиенты поддерживают разные наборы CSS-свойств.
Для нас очень мало условий для работы.
Для получения дополнительной информации о поддержке CSS в электронной почте, пожалуйста, ознакомьтесь с этим превосходным обзором.
Некоторые клиенты электронной почты отделяют раздел <head>, поэтому добавьте теги <style> </ style> в <body>.
Как ссылается ваша таблица стилей?
Для электронной почты вам нужно либо предоставить абсолютный путь к вашей таблице стилей, либо включить стили в начало шаблона
Я предполагаю, что у вас есть CSS во внешнем файле, и поэтому самым простым решением было бы просто переместить его в заголовок html внутри почты.
Тем не менее, поддержка css в почтовых клиентах очень неудобна, поэтому с их стороны может быть просто дерьмовая рендеринг.
Я нашел, что самая лучшая (самая читаемая) поддержка CSS – inline (style = ""). Печально, но верно.
Вот действительно хорошая статья SitePoint, посвященная HTML-сообщениям электронной почты « Как кодировать HTML-бюллетени электронной почты ».
HTML и CSS чреваты болью и разочарованием. Ничего общего с PHP, очевидно, что большинство кашлей кашля кашля были и остаются архаичными.
Это единственная область, где я бы посоветовал это (и у кого-то еще могло бы быть лучшее понимание / план *), но вы должны посмотреть на сокращение CSS и написание стиля html в стиле середины 90 с помощью <table>, <font> и <hr > теги (о мой)
** Поделись, пожалуйста :)*