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

前端 未结 8 1404
一整个雨季
一整个雨季 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:35

    There's is a way...

        $body = <<< YOUR_HTML_WITH_CSS_STYLE_TAGS
    
    
        
    
    
        
    some 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:

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

提交回复
热议问题