2008-12-11 74 views
5

我在發送HTML郵件時遇到問題PHPMailer。我製作了一個Smarty模板,並從中獲取了所有的HTML代碼,但是當我發送郵件時,我收到了未包含CSS的郵件(它只是背景顏色,字體或類似的東西)。在PHPMailer中,我將該郵件設置爲HTML。如何使用PHPMailer發送包含CSS的HTML郵件?

有沒有任何方式發送包含CSS的HTML郵件?

+0

查看此StackOverflow問題的答案,獲取有關HTML電子郵件最佳實踐的鏈接的良好鏈接:[編寫HTML電子郵件時的最佳做法和注意事項](http://stackoverflow.com/questions/2229822/best-practices -considerations-when-writing-html-emails/21437734#21437734) – 2008-12-11 09:47:01

回答

0

HTML和CSS充滿了痛苦和沮喪。與PHP無關,顯然大多數實現咳嗽展望咳嗽過去和現在都是古老的。

這是我會建議這(和其他人可能有更好的理解/計劃*)的唯一地區,但你應該看看切割CSS與<表>,<字體寫90年代中期風格的HTML >和<小時>標籤(噢,我的)

**請分享:)*

+0

以及CSS是真的簡約,是的,我有

,但只有我真的想要改變背景顏色或一些基本的東西。 – gizmo2008-12-11 09:46:55

+0

只需添加內聯我建議 – annakata 2008-12-11 09:51:05

+0

是的,你是對的「Gmail不支持CSS,除非它是內聯的」 – gizmo 2008-12-11 10:19:04

0

如何樣式表引用?

對於電子郵件,你將不得不提供給您的樣式表的絕對路徑,或者在模板中包括

+0

正如我所說,它包含在模板的頭部 – gizmo 2008-12-11 09:44:37

0

我假設你有一個外部文件你的CSS,如果是最簡單的解決辦法是頭樣式簡單地將它移動到郵件內的html頭部。

但是,電子郵件客戶端的css支持是 won so,所以它可能只是蹩腳的渲染而已。

+0

我把CSS放入郵件內的html頭部。但thx的意見 – gizmo 2008-12-11 09:44:03

1

電子郵件中的CSS支持至少非常有限。 最大的問題是不同的客戶端支持不同的CSS屬性集。

您爲我們提供的工作環境非常少。

  • 您的電子郵件如何顯示? CSS根本不被解析?您的CSS是否以文本的形式顯示在屏幕上?
  • 你的CSS看起來如何?
  • 電子郵件模板的外觀如何?

對於在電子郵件上的CSS支持的詳細信息,請參閱本excellent overview.

+0

1.CSS根本沒有顯示,只有HTML呈現 2.我的CSS看起來: http://pastebin.com/m5787d770 3.和完整的模板看起來: http:// pastebin .com/m346a5475 謝謝你的鏈接,我很感激。 – gizmo 2008-12-11 10:01:44

+0

您使用的是什麼電子郵件客戶端? – 2008-12-11 10:20:28

1

一些電子郵件客戶端會剝離出<頭>部分,從而把內你<風格> < /風格>標籤<主體>。

0

我發現最好的(閱讀最廣泛的)對CSS的支持是inline(style =「」)。傷心,但是真的。

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

該代碼將產生$身體的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找到。 此實現基於這樣一個事實:大多數webmails只允許通過內聯標記屬性樣式添加樣式,而不能通過樣式標記或鏈接標記添加樣式。

由於正則表達式,它非常有限且語法有限,這很簡單,但它比您自己的每個HTML標記中的內聯樣式屬性更好。