Как я могу отправлять HTML письма с включенным CSS с помощью PHPMailer?

У меня проблема с отправкой писем в формате HTML с помощью PHPMailer . Я сделал шаблон Smarty и получил от него весь HTML-код. Но когда я отправляю почту, я получаю почту без включенного CSS (это только фоновый цвет, шрифт или что-то в этом роде). В PHPMailer я установил, что почта - это HTML.

Есть ли способ отправить HTML-почту с включенным CSS?

11.12.2008 09:33:56
Ознакомьтесь с ответом на этот вопрос StackOverflow, чтобы получить хороший список ссылок на лучшие практики для электронных писем в формате HTML. Лучшие практики и соображения при написании электронных писем в формате HTML
Paul Dixon 11.12.2008 09:47:01
8 ОТВЕТОВ

HTML и CSS чреваты болью и разочарованием. Ничего общего с PHP, это очевидно , что большинство реализаций кашель перспективы кашель были и остаются архаичными.

Это единственная область, где я бы посоветовал это (и у кого-то еще может быть лучшее понимание / план *), но вы должны взглянуть на сокращение CSS и написание html-стиля середины 90-х с помощью <table>, <font> и <hr > теги (о боже)

** Поделись, пожалуйста :)*

0
5.12.2010 14:24:58
ну, CSS действительно минималистичен, и да, у меня есть <table>, но я действительно хочу изменить цвет фона или некоторые основные вещи.
gizmo 11.12.2008 09:46:55
да, вы были правы: «Gmail не поддерживает CSS, если он не встроенный»
gizmo 11.12.2008 10:19:04

Как на вашу таблицу стилей ссылаются?

Для электронной почты вам нужно будет либо указать абсолютный путь к вашей таблице стилей, либо включить стили в заголовок шаблона.

0
11.12.2008 09:40:57
как я уже сказал, он включен в
gizmo 11.12.2008 09:44:37

Я предполагаю, что у вас есть CSS во внешнем файле, если так, то самым простым решением было бы просто переместить его в заголовок html внутри почты.

Тем не менее, поддержка css в почтовых клиентах очень сложна, так что это может быть просто дерьмовый рендеринг с их стороны.

0
11.12.2008 09:41:32
У меня есть CSS в заголовке HTML внутри почты. Но спасибо за совет
gizmo 11.12.2008 09:44:03

Поддержка CSS в электронной почте, по крайней мере, очень ограничена. Самая большая проблема заключается в том, что разные клиенты поддерживают разные наборы CSS-свойств.

Вы предоставляете очень мало контекста для нас, чтобы работать с.

  • Как отображается ваша электронная почта? CSS вообще не анализируется? Ваш CSS отображается на экране как текст?
  • Как выглядит ваш CSS?
  • Как выглядит ваш шаблон электронной почты?

Для получения дополнительной информации о поддержке CSS в электронной почте, пожалуйста, обратитесь к этому превосходному обзору.

1
11.12.2008 09:48:44
1. CSS вообще не отображается, отображается только HTML 2. Мой CSS выглядит: pastebin.com/m5787d770 3. И полный шаблон выглядит: pastebin.com/m346a5475 Спасибо за ссылку, я ценю это.
gizmo 11.12.2008 10:01:44
какой почтовый клиент вы используете?
Aron Rotteveel 11.12.2008 10:20:28
Я попробовал это с Gmail и веб-почтой (Windows Exchange), и да, я увидел, что это не будет работать с Gmail, как это.
gizmo 11.12.2008 10:30:11

Некоторые почтовые клиенты удаляют раздел <head>, поэтому поместите ваши теги <style> </ style> в <body>.

1
11.12.2008 10:13:41
Я видел, что gmail вообще не поддерживает <style> :)
gizmo 11.12.2008 10:30:58

Я обнаружил, что лучшая (читай самая широкая) поддержка CSS - встроенная (style = ""). Грустно, но верно.

0
11.12.2008 10:22:26
Я сделаю так, я думаю, что это единственный вариант сейчас :)
gizmo 11.12.2008 10:37:42

Вот действительно хорошая статья SitePoint о электронных письмах в формате HTML: « Как кодировать HTML-рассылки по электронной почте ».

0
5.12.2010 11:03:57

Есть способ ...

    $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 в $ body следующим образом:

<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-теге.

6
5.12.2010 10:57:21
Амбициозные, но , похоже, не в состоянии с большой 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)).
ADTC 21.11.2016 14:35:54
обратите внимание, что это очень старая тема, я даже не рекомендую себе это делать. В настоящее время Gmail даже поддерживает медиа-запросы. так что это полностью устарело. также 128Mb не так много памяти.
useless 21.11.2016 21:17:36
Да, я прибег к другому подходу, а именно к генерации электронной почты в формате HTML, используя выделенный файл PHP и ob_start()/ob_get_clean()комбо. Чтобы обойти проблему использования встроенных стилей, я создал переменные PHP для хранения общих стилей и вставил их в случае необходимости. Re: поддержка почтового клиента: хорошо, что Gmail лучше поддерживает CSS в электронных письмах, но этого недостаточно, когда мы не знаем, какой почтовый клиент будет использовать получатель. В отличие от браузеров с более предсказуемым циклом обновления, у вас могут быть клиенты, которые все еще используют Outlook 1995.
ADTC 23.11.2016 02:51:09
Я не люблю продвигать страницы, но есть очень хороший инструмент, который я использовал для этого, он называется лакмусовая бумажка. это действительно поможет вам проверить дизайн электронной почты для нескольких платформ, веб-почты и т. д. К сожалению, это платно.
useless 23.11.2016 12:26:50