Как я могу отправлять HTML письма с включенным CSS с помощью PHPMailer? - PullRequest
5 голосов
/ 11 декабря 2008

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

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

Ответы [ 8 ]

6 голосов
/ 05 февраля 2010

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

    $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.

1 голос
/ 11 декабря 2008

Некоторые почтовые клиенты удаляют раздел , поэтому поместите теги

в .
1 голос
/ 11 декабря 2008

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

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

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

Дополнительную информацию о поддержке CSS в электронной почте см. В этом превосходном обзоре.

0 голосов
/ 11 декабря 2008

Вот действительно хорошая SitePoint статья о электронных письмах в формате HTML, " Как кодировать HTML-рассылки по электронной почте ".

0 голосов
/ 11 декабря 2008

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

0 голосов
/ 11 декабря 2008

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

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

0 голосов
/ 11 декабря 2008

Как ссылка на вашу таблицу стилей?

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

0 голосов
/ 11 декабря 2008

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

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

...