如何使用PHPMailer发送包含CSS的HTML邮件?
我无法使用发送HTML邮件。我制作了一个模板,从中获得了所有的HTML代码。但是当我发送邮件时,我收到的邮件没有附带CSS(只是背景色、字体或类似的东西)。在PHPMailer中,我设置邮件为HTML如何使用PHPMailer发送包含CSS的HTML邮件?,php,html,css,phpmailer,Php,Html,Css,Phpmailer,我无法使用发送HTML邮件。我制作了一个模板,从中获得了所有的HTML代码。但是当我发送邮件时,我收到的邮件没有附带CSS(只是背景色、字体或类似的东西)。在PHPMailer中,我设置邮件为HTML 有没有办法发送包含CSS的HTML邮件?HTML和CSS充满了痛苦和挫折。与PHP无关,很明显,大多数实现cougoutlookcough都是并且仍然是过时的 这是我唯一建议的领域(其他人可能会有更好的理解/计划*),但你应该考虑剪切CSS,并使用,标记编写90年代中期风格的html(哦,我的天)
有没有办法发送包含CSS的HTML邮件?HTML和CSS充满了痛苦和挫折。与PHP无关,很明显,大多数实现cougoutlookcough都是并且仍然是过时的 这是我唯一建议的领域(其他人可能会有更好的理解/计划*),但你应该考虑剪切CSS,并使用,
标记编写90年代中期风格的html(哦,我的天)
**请分享:)*您的样式表是如何引用的
对于电子邮件,您要么必须提供样式表的绝对路径,要么将样式包含在模板的头部我假设您的CSS包含在外部文件中,如果是这样,最简单的解决方案就是将其移动到邮件中的html头部
然而,电子邮件客户端中的css支持非常不稳定,因此对他们来说可能只是糟糕的渲染。至少电子邮件中的css支持非常有限。 最大的问题是不同的客户端支持不同的CSS属性集 你给我们提供的背景很少
- 您的电子邮件显示得如何?CSS根本不被解析吗?您的CSS是否以文本形式显示在屏幕上
- 你的CSS看起来怎么样
- 您的电子邮件模板外观如何
有关电子邮件中CSS支持的更多信息,请参阅此一些电子邮件客户端将删除此部分,以便将您的标记放在中。我发现对CSS的最佳(最广泛)支持是内联(style=“”)。这是一篇关于HTML电子邮件的非常好的文章,“有一种方法
$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=query('//img');
foreach($result作为$node){
$attr=$node->getAttribute('src');
$re='/(http:\/\/.?(\/.+/i');
如果(预匹配所有($re,$attr,$MATCHS)){
如果(!empty($matches[1][0])&&0)
继续;
$attr='http://'.$\u服务器['http\u主机].$matches[2][0];
}
$node->setAttribute('src',$attr);
}
false&&$node=new-DOMElement()&&$child=new-DOMElement();
$result=$xpd->query('//style/。);
foreach($result作为$node){
foreach($node->childNodes作为$child){
if(strtolower($child->nodeName)=='style'){
$node->removeChild($child);
$css=$child->textContent;
$re='/(.*)\{([^}]+)\}/';
if(preg_match_all($re,$css,$matches)){
foreach($idx=>$css\U选择器与[1]匹配){
$css_text=$matches[2][$idx];
$css_text=preg_replace('/\s+/','','$css_text);
$css=新的CSSQuery($doc);
foreach($css->query($css\u选择器)作为$selected\u节点){
$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>
一些html
CSSQuery
类可在中找到。
此实现基于这样一个事实:大多数Web邮件只允许通过内联标记属性样式添加样式,而不允许通过样式标记或链接标记添加样式
由于正则表达式的缘故,它非常有限,语法也很有限。它有点简单,但仍然比您自己编写每个HTML标记中的内联样式属性要好。我在邮件的HTML标题中加入了CSS。但thx for Advice正如我所说,它包含在模板的头部。CSS非常简约,是的,我有,但我真正想要的只是改变背景颜色或一些基本的东西。是的,你是对的“Gmail不支持CSS,除非它是内联的”1。CSS根本没有显示,只有HTML呈现为2。我的css看起来:3。完整的模板外观:谢谢你的链接,我很感激。你使用的是什么电子邮件客户端?我用gmail和webmail(windows exchange)试用过,是的,我发现gmail不支持这样的功能。我发现gmail根本不支持:)我会这样做,我认为这是现在唯一的选择:)查看StackOverflow问题的答案,以获得HTML电子邮件最佳实践的良好链接列表:雄心勃勃,但在较大的HTML中似乎失败:
[:error]PHP致命错误:允许的内存大小为134217728字节(尝试分配4096字节)在第709行的…/CSSQuery.php中
。这一行是if(is_array($arr))
。请注意,这是一个非常旧的线程,我甚至不建议自己这样做。如今,gmail甚至支持媒体查询。所以这是完全过时的。另外128Mb的内存也不多。是的,我采用了另一种方法,即使用专用的PHP文件和ob\u start()/ob\u get\u clean()
组合生成HTML电子邮件。为了解决必须使用内联样式的问题,我创建了PHP变量来保存常用样式,并在必要时注入它们。回复:电子邮件客户端支持:Gmail在电子邮件中更好地支持CSS是件好事,但当我们不知道收件人将使用什么样的电子邮件客户端时,这还不够好。与更新周期更可预测的浏览器不同,您可能会有仍然使用Outlook 1995的客户端。我不喜欢升级页面,但我使用了一个非常好的工具,叫做litmus。它真的可以帮助你测试电子邮件的多功能设计