Nasıl PHPMailer birlikte CSS ile HTML postalar gönderebilir?

9 Cevap php

I PHPMailer ile HTML postaları gönderme ile sorun var. Ben bir Smarty şablonu yapmak ve ondan tüm HTML kodunu aldım, ama ben posta gönderirken, ben (sadece arka plan rengini, yazı ya da buna benzer bir şey) dahil CSS olmadan posta aldım. PHPMailer ben posta HTML olduğunu ayarlayabilirsiniz.

Dahil CSS ile HTML e-posta göndermek için herhangi bir yolu var mı?

9 Cevap

CSS desteği getirmedi e-posta istemcileri durumunun oldukça kapsamlı bir analiz için Email Standards Project bakın.

Bir yolu var mi ...

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

Bu kod böyle $ vücutta bir HTML çıktı üretecektir:

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

Bu tür basit hoş çok sınırlı ve kısıtlı bir sözdizimi ile çünkü düzenli ifadenin, ama yine inline stil her HTML etiketine niteliklerini kendi tarafından yazmak daha iyidir.

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

Sen bize çalışmak için çok az bağlam sağlar.

  • Nasıl e-posta gösteriyor? CSS hiç çözümlü değil mi? CSS metin olarak ekranda gösteriyor?
  • Nasıl CSS görünüyor?
  • Nasıl e-posta şablonu görünüyor?

E-posta CSS desteği hakkında daha fazla bilgi için, bu excellent overview. başvurun

Nasıl stil başvurulan?

E-posta için size biçembente mutlak yolunu sağlamak zorunda kalırsınız ya da şablon baş stilleri içerir

Böylece kolay çözüm sadece posta içindeki html başlık içine taşımak olurdu ben, harici dosyada CSS var sayıyorum.

Ancak, e-posta istemcileri css desteği very sakat, bu yüzden sadece kendi açınızdan boktan render olabilir.

Bazı e-posta istemcileri dışarı şerit olacak bölüm böylece