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 にあります。この実装は、ほとんどの Web メールでは、スタイル タグやリンク タグではなく、インライン タグ属性 style によってのみスタイルを追加できるという事実に基づいています。

これはかなり制限されており、構文が制限されているため、正規表現は単純ですが、各 HTML タグにインライン スタイル属性を独自に記述するよりも優れています。

于 2010-02-05T19:31:59.197 に答える
2

電子メールでのCSSサポートは、少なくとも非常に限られています。最大の問題は、さまざまなクライアントがさまざまなCSSプロパティのセットをサポートしていることです。

あなたは私たちが協力するためのコンテキストをほとんど提供しません。

  • あなたの電子メールはどのように表示されていますか?CSSはまったく解析されませんか?CSSが画面にテキストとして表示されていますか?
  • CSSはどのように見えますか?
  • 電子メールテンプレートはどのように見えますか?

電子メールでのCSSサポートの詳細については、この優れた概要を参照してください。

于 2008-12-11T09:48:44.850 に答える
1

一部の電子メールクライアントは<head>セクションを削除するため、<style></style>タグを<body>内に配置します。

于 2008-12-11T10:13:41.930 に答える
1

これは、HTMLメールに関する非常に優れたSitePointの記事、「HTMLメールニュースレターのコーディング方法」です。

于 2008-12-11T10:38:34.190 に答える
1

HTMLとCSSは苦痛と欲求不満に満ちています。PHPとは何の関係もありません。ほとんどの実装では、の見通し古く、古くから残っていることは明らかです。

これは私がこれをアドバイスする唯一の領域です(そして他の誰かがより良い理解/計画*を持っているかもしれません)が、CSSを切り取り、<table>、<font>、<hrで90年代半ばのスタイルのhtmlを書くことを検討する必要があります>タグ(オーマイ)

** シェアしてください :)*

于 2008-12-11T09:39:41.670 に答える
0

あなたのスタイルシートはどのように参照されていますか?

メールの場合は、スタイルシートへの絶対パスを指定するか、テンプレートの先頭にスタイルを含める必要があります

于 2008-12-11T09:40:57.580 に答える
0

CSSが外部ファイルにあると仮定します。その場合、最も簡単な解決策は、CSSをメール内のhtmlヘッダーに移動することです。

ただし、電子メールクライアントでのcssのサポートは非​​常に不安定であるため、クライアント側でのレンダリングがお粗末な場合があります。

于 2008-12-11T09:41:32.650 に答える
0

CSSの最良の(最も広く読まれている)サポートはインライン(style = "")であることがわかりました。悲しいですが本当。

于 2008-12-11T10:22:26.903 に答える