【问题标题】:How can I send HTML mails with included CSS with PHPMailer?如何使用 PHPMailer 发送包含 CSS 的 HTML 邮件?
【发布时间】:2010-09-26 09:43:47
【问题描述】:

我在使用PHPMailer 发送 HTML 邮件时遇到问题。我制作了一个Smarty 模板,并从中获得了所有的 HTML 代码。但是当我发送邮件时,我收到的邮件没有包含 CSS(它只有背景颜色、字体或类似的东西)。在 PHPMailer 中,我将邮件设置为 HTML。

有没有办法发送包含 CSS 的 HTML 邮件?

【问题讨论】:

标签: php html css phpmailer


【解决方案1】:

HTML 和 CSS 充满了痛苦和挫败感。与 PHP 无关,很明显大多数实现 coughoutlookcough 都过时了。

这是我唯一建议的领域(其他人可能有更好的理解/计划*),但您应该考虑剪切 CSS 并使用

编写 90 年代中期的样式 html和
标签(哦,我的)

** 请分享:)*

【讨论】:

  • 嗯,CSS 真的很简约,是的,我有
,但我真正想要的只是改变背景颜色或一些基本的东西。
  • 是的,你是对的“Gmail 不支持 CSS,除非它是内联的”
  • 【解决方案2】:

    您的样式表是如何引用的?

    对于电子邮件,您要么必须提供样式表的绝对路径,要么在模板头部包含样式

    【讨论】:

    • 正如我所说,它包含在模板的头部
    【解决方案3】:

    我假设您的 CSS 在外部文件中,如果是这样,最简单的解决方案是将其简单地移动到邮件内的 html 标头中。

    但是,电子邮件客户端中的 css 支持非常很不稳定,因此它们可能只是糟糕的渲染。

    【讨论】:

    • 我在邮件中的 html 标头中有 CSS。但是谢谢你的建议
    【解决方案4】:

    至少,电子邮件中的 CSS 支持非常有限。 最大的问题是不同的客户端支持不同的 CSS 属性集。

    您为我们提供的工作环境非常少。

    • 您的电子邮件显示如何? CSS根本没有解析吗?您的 CSS 是否在屏幕上显示为文本?
    • 您的 CSS 看起来如何?
    • 您的电子邮件模板看起来如何?

    有关电子邮件中 ​​CSS 支持的更多信息,请参阅此excellent overview.

    【讨论】:

    • 1. CSS 根本没有显示,只有 HTML 被渲染 2. 我的 css 看起来:pastebin.com/m5787d770 3. 完整的模板看起来:pastebin.com/m346a5475 谢谢你的链接,我很感激。
    • 你用的是什么邮件客户端?
    • 我用gmail和webmail(windows exchange)试过了,是的,我发现它不能像这样用gmail。
    【解决方案5】:

    一些电子邮件客户端会去掉

    部分,因此将 标签放在 中。

    【讨论】:

    • 我看到gmail根本不支持
    【解决方案6】:

    我发现对 CSS 的最佳(阅读最广泛)支持是内联 (style="")。悲伤,但真实。

    【讨论】:

    • 我会这样做,我认为这是现在唯一的选择:)
    【解决方案7】:

    这是一篇非常好的关于 HTML 电子邮件的 SitePoint 文章,“How to Code HTML Email Newsletters”。

    【讨论】:

      【解决方案8】:

      有办法……

          $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 找到。 这个实现是基于这样一个事实,即大多数网络邮件只允许通过内联标签属性样式添加样式,而不是通过样式标签或链接标签。

      由于正则表达式的原因,它非常有限,语法也受到限制,这有点简单,但它仍然比你自己在每个 HTML 标记中编写内联样式属性要好。

      【讨论】:

      • 雄心勃勃,但似乎因 HTML 较大而失败:[:error] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes) in .../CSSQuery.php on line 709。这一行是if (is_array($arr))
      • 请注意,这是一个非常古老的线程,我什至不建议自己这样做。现在 gmail 甚至支持媒体查询。所以这完全过时了。 128Mb 也不是很多内存。
      • 是的,我采用了另一种方法,即使用专用 PHP 文件和 ob_start()/ob_get_clean() 组合生成 HTML 电子邮件。为了解决必须使用内联样式的问题,我创建了 PHP 变量来保存常用样式并在必要时注入它们。 Re:电子邮件客户端支持:Gmail 对电子邮件中的 CSS 有更好的支持是件好事,但是当我们不知道收件人将使用什么电子邮件客户端时,这还不够好。与更新周期更可预测的浏览器不同,您的客户可能仍在使用 Outlook 1995。
      • 我不喜欢推广页面,但是我使用了一个非常好的工具,它叫做 litmus。它确实可以帮助您测试多个平台、网络邮件等的电子邮件设计。不幸的是,它是付费的。
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签