发送带有PHPMailer的HTML邮件时遇到问题。我制作了一个Smarty模板,我从中获取了所有的HTML代码,但是当我发送邮件时,我收到的邮件没有包含CSS(它只是背景颜色,字体或类似的东西)。在PHPMailer中,我设置邮件是HTML。
有没有办法发送包含CSS的HTML邮件?
答案 0 :(得分: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>
可以在phpclasses.org找到CSSQuery
课程。
此实现基于以下事实:大多数Web邮件仅允许通过内联标记属性样式添加样式,而不是通过样式标记或链接标记。
它非常有限且语法有限,因为正则表达式很简单,但它仍然比你自己在每个HTML标签中的内联样式属性更好。
答案 1 :(得分:1)
电子邮件中的CSS支持至少非常有限。 最大的问题是不同的客户端支持不同的CSS属性集。
您提供的工作环境很少。
有关电子邮件中CSS支持的更多信息,请参阅此excellent overview.
答案 2 :(得分:1)
某些电子邮件客户端会删除&lt; head&gt;部分所以把你的&lt; style&gt;&lt; / style&gt; &lt; body&gt;中的标签。
答案 3 :(得分:0)
HTML和CSS充满了痛苦和挫败感。与PHP无关,很明显,大多数实现 cough outlook cough 都是过时的。
这是我建议的唯一区域(其他人可能会有更好的理解/计划*),但是你应该看看切割CSS并用&lt; table&gt;,&lt;写&lt; table&gt;,&lt;字体&GT;和&lt; hr&gt;标签(哦,我的)
**请分享:)*
答案 4 :(得分:0)
你的样式表是如何引用的?
对于电子邮件,您必须提供样式表的绝对路径或在样板头部包含样式
答案 5 :(得分:0)
我假设您将CSS放在外部文件中,如果是这样,最简单的解决方案就是将其移动到邮件内的html标题中。
然而,电子邮件客户端中的css支持非常不稳定,因此它们可能只是蹩脚的渲染。
答案 6 :(得分:0)
我发现CSS的最佳(阅读最广泛)支持是内联(style =“”)。悲伤,但却是真的。
答案 7 :(得分:0)
这是关于HTML电子邮件的一篇非常好的SitePoint文章,“How to Code HTML Email Newsletters”。