How can I send HTML mails with included CSS with PHPMailer?

前端 未结 8 1351
一整个雨季
一整个雨季 2020-12-18 07:53

I\'ve problem with sending HTML mails with PHPMailer. I make a Smarty template and I got all the HTML code from it. But when I send mail, I got the mail without included CSS

相关标签:
8条回答
  • 2020-12-18 08:30

    HTML and CSS is fraught with pain and frustration. Nothing to do with PHP, it's apparent that most implementations coughoutlookcough were and remain archaic.

    This is the only area where I would advise this (and someone else might have a better understanding/plan*), but you should look at cutting the CSS and writing mid-90's style html with <table>, <font> and <hr> tags (oh my)

    ** please share :)*

    0 讨论(0)
  • 2020-12-18 08:31

    Some Email Clients will strip out the <head> section so put your <style></style> tags within the <body>.

    0 讨论(0)
  • 2020-12-18 08:32

    I assume you have your CSS in an external file, if so the easiest solution would be to simply move it into the html header inside the mail.

    However, css support in email clients is very wonky, so it might just be crappy rendering on their part.

    0 讨论(0)
  • 2020-12-18 08:35

    There's is a way...

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

    That code will generate an HTML output in $body like this:

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

    The CSSQuery class can be found at phpclasses.org. This implementation is based on the fact that most webmails will only allow to add style by an inline tag attribute style and not through style tags or link tags.

    It's pretty much limited and with a restricted syntax because of the regular expression it's kind of simple, but it's still better than write by your own the inline style attributes in each HTML tag.

    0 讨论(0)
  • 2020-12-18 08:40

    CSS support in e-mail is very limited, at least. The biggest issue is that different clients support different sets of CSS-properties.

    You provide very little context for us to work with.

    • How is your e-mail showing? Is CSS not parsed at all? Is your CSS showing on-screen as text?
    • How does your CSS look?
    • How does your e-mail template look?

    For more information on CSS support in e-mail, please refer to this excellent overview.

    0 讨论(0)
  • 2020-12-18 08:45

    I've found the best (read broadest) support for CSS is inline (style=""). Sad, but true.

    0 讨论(0)
提交回复
热议问题