Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHPMailer发送包含CSS的HTML邮件?_Php_Html_Css_Phpmailer - Fatal编程技术网

如何使用PHPMailer发送包含CSS的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(哦,我的天)

我无法使用发送HTML邮件。我制作了一个模板,从中获得了所有的HTML代码。但是当我发送邮件时,我收到的邮件没有附带CSS(只是背景色、字体或类似的东西)。在PHPMailer中,我设置邮件为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。它真的可以帮助你测试电子邮件的多功能设计