7

我在使用PHPMailer发送 HTML 邮件时遇到问题。我制作了一个Smarty模板,并从中获得了所有的 HTML 代码。但是当我发送邮件时,我收到的邮件没有包含 CSS(它只有背景颜色、字体或类似的东西)。在 PHPMailer 中,我将邮件设置为 HTML。

有没有办法发送包含 CSS 的 HTML 邮件?

4

8 回答 8

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();

该代码将在 $body 中生成一个 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 标记中编写内联样式属性要好。

于 2010-02-05T19:31:59.197 回答
2

至少,电子邮件中的 CSS 支持非常有限。最大的问题是不同的客户端支持不同的 CSS 属性集。

您为我们提供的工作环境非常少。

  • 您的电子邮件显示如何?CSS根本没有解析吗?您的 CSS 是否在屏幕上显示为文本?
  • 你的 CSS 看起来如何?
  • 您的电子邮件模板看起来如何?

有关电子邮件中 ​​CSS 支持的更多信息,请参阅此出色的概述。

于 2008-12-11T09:48:44.850 回答
1

这是一篇关于 HTML 电子邮件的非常好的SitePoint文章,“如何编写 HTML 电子邮件通讯”。

于 2008-12-11T10:38:34.190 回答
1

HTML 和 CSS 充满了痛苦和挫败感。与 PHP 无关,很明显,大多数实现咳咳前景咳咳,并且仍然过时。

这是我建议的唯一领域(其他人可能有更好的理解/计划*),但您应该考虑使用 <table>、<font> 和 <hr 剪切 CSS 并编写 90 年代中期的样式 html > 标签(哦,我的)

** 请分享 :)*

于 2008-12-11T09:39:41.670 回答
1

一些电子邮件客户端会去掉 <head> 部分,因此将 <style></style> 标签放在 <body> 中。

于 2008-12-11T10:13:41.930 回答
0

您的样式表是如何引用的?

对于电子邮件,您要么必须提供样式表的绝对路径,要么将样式包含在模板的头部

于 2008-12-11T09:40:57.580 回答
0

我假设您将 CSS 保存在外部文件中,如果是这样,最简单的解决方案是将其简单地移动到邮件内的 html 标头中。

但是,电子邮件客户端中的 CSS 支持非常不稳定,因此它们可能只是糟糕的渲染。

于 2008-12-11T09:41:32.650 回答
0

我发现对 CSS 的最佳(阅读最广泛)支持是内联(style="")。悲伤,但真实。

于 2008-12-11T10:22:26.903 回答