首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PHPMailer发送包含CSS的超文本标记语言邮件?

问如何使用PHPMailer发送包含CSS的超文本标记语言邮件?
EN

Stack Overflow用户
提问于 2008-12-11 09:33:56
回答 8查看 32.1K关注 0票数 7

我在用PHPMailer发送超文本标记语言邮件时遇到了问题。我制作了一个Smarty模板,并从中获得了所有的代码。但当我发送邮件时,我收到的邮件中没有包含CSS (只有背景颜色、字体或类似的内容)。在PHPMailer中,我将邮件设置为超文本标记语言。

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

EN

回答 8

Stack Overflow用户

发布于 2010-02-06 03:31:59

有个办法..。

代码语言:javascript
复制
    $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输出,如下所示:

代码语言:javascript
复制
<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>

可以在phpclasses.org中找到CSSQuery类。这种实现是基于这样一个事实,即大多数webmails只允许通过内联标签属性样式添加样式,而不允许通过样式标签或链接标签添加样式。

由于使用了正则表达式,所以它非常有限,语法也很严格,这有点简单,但它仍然比您自己在每个HTML标记中编写内联样式属性要好。

票数 6
EN

Stack Overflow用户

发布于 2008-12-11 09:48:45

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

您为我们提供的上下文非常少。

  • 您的电子邮件显示得怎么样?CSS根本不会被解析吗?您的CSS是否在屏幕上显示为文本?
  • 您的CSS外观如何?
  • 您的电子邮件模板外观如何?

有关电子邮件中CSS支持的更多信息,请参阅此excellent overview.

票数 2
EN

Stack Overflow用户

发布于 2008-12-11 09:39:42

HTML和CSS充满了痛苦和挫折。与PHP无关,很明显,大多数cough_outlook_cough实现都是过时的。

这是我唯一的建议(其他人可能对此有更好的理解/计划*),但你应该考虑削减CSS,并编写90年代中期风格的html和标签(哦,我的天)。

**请分享:)*

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/358788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档