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

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

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

Ознакомьтесь с ответом на этот вопрос StackOverflow, чтобы получить хороший список ссылок на лучшие практики для электронных писем в формате HTML: Рекомендации и рекомендации при написании электронных писем в формате HTML

Paul Dixon 11.12.2008 12:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
1
30 010
8

Ответы 8

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

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

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

ну, CSS действительно минималистичен, и да, у меня есть <table>, но я действительно хочу только изменить цвет фона или некоторые базовые вещи.

gizmo 11.12.2008 12:46

да, вы были правы "Gmail не поддерживает CSS, если он не является встроенным"

gizmo 11.12.2008 13:19

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

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

как я уже сказал, он включен в заголовок шаблона

gizmo 11.12.2008 12:44

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

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

У меня есть CSS в заголовке html внутри почты. Но спасибо за совет

gizmo 11.12.2008 12:44

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

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

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

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

1. CSS вообще не отображается, отображается только HTML 2. мой css выглядит: pastebin.com/m5787d770 3. и полный шаблон выглядит: pastebin.com/m346a5475 Спасибо за ссылку, я ценю это.

gizmo 11.12.2008 13:01

какой почтовый клиент вы используете?

Aron Rotteveel 11.12.2008 13:20

Я пробовал это с gmail и webmail (обмен Windows), и да, я видел, что он не будет работать с gmail таким образом.

gizmo 11.12.2008 13:30

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

Я видел, что Gmail вообще не поддерживает <style> :)

gizmo 11.12.2008 13:30

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

Я так и сделаю, думаю, сейчас это единственный вариант :)

gizmo 11.12.2008 13:37

Вот действительно хорошая статья SitePoint об электронных письмах в формате HTML, "Как кодировать электронные информационные бюллетени в формате 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();

Этот код сгенерирует вывод 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.

Амбициозно, но, похоже, не работает с большим 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 17:35

обратите внимание, что это очень старая ветка, я даже не рекомендую себе это делать. в настоящее время Gmail поддерживает даже медиа-запросы. так что это полностью устарело. также 128Мб памяти не много.

useless 22.11.2016 00:17

Да, я прибег к другому подходу, а именно к созданию электронного письма в формате HTML с использованием специального файла PHP и комбинации ob_start()/ob_get_clean(). Чтобы обойти проблему использования встроенных стилей, я создал переменные PHP для хранения общих стилей и внедрил их везде, где это необходимо. Re: поддержка почтового клиента: Хорошо, что Gmail лучше поддерживает CSS в электронных письмах, но этого недостаточно, когда мы не знаем, какой почтовый клиент будет использовать получатель. В отличие от браузеров, которые имеют более предсказуемый цикл обновления, у вас могут быть клиенты, которые все еще используют Outlook 1995.

ADTC 23.11.2016 05:51

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

useless 23.11.2016 15:26

Другие вопросы по теме