AMP-письма: как различается их обработка в Gmail и Mail.ru
При создании AMP-писем важно учитывать не только корректность разметки, но и среду, в которой письмо будет открываться и рендериться у получателя. Почтовые клиенты могут по-разному интерпретировать одни и те же механизмы, что отражается на поведении компонентов email-шаблона.
В статье разбираем отличия отображения AMP-писем в Gmail и Mail.ru, а также какие ограничения необходимо учитывать при вёрстке.
Состояния (amp-state) и их начальные значения
Состояния в AMP-письмах используются как переменные, где можно хранить любые данные и строить на их базе условную логику отображения. Эти значения подставляются в атрибуты ([text], [class] и другие) и обновляются в ответ на действия пользователя.
Важно учитывать, что значение внутри <amp-state> применяется только после инициализации состояния через AMP.setState. Если какие-либо данные необходимо показать сразу после открытия письма, их можно задать как обычный контент элемента или значение атрибута:
1<span [text]="myItem.el">default value</span>
В данном случае изначально будет отображаться default value, а после действия пользователя — значение myItem.el. При этом само действие может быть любым, в том числе формальным. Например:
1 2 3 4 5 6 7<amp-state id="myItem"> <script type="application/json"> { "el": "new value" } </script> </amp-state> <span [text]="myItem.el">default value</span> <button on="tap:AMP.setState({})">Кнопка</button>
В Gmail этот процесс работает в соответствии со стандартом. Здесь при клике на кнопку инициализируется состояние, и в элементе <span> появляется текст new value.
Mail.ru, в свою очередь, не учитывает начальные значения, заданные в <amp-state>. Из-за этой особенности атрибуты, которые рассчитывают на данные по умолчанию, после инициализации будут отображаться как null.
Для обхода этого ограничения вместо <amp-state> используйте setState, чтобы значения динамически обновлялись в момент действия пользователя:
1 2 3 4<button on="tap:AMP.setState({ myItem: { el: 'new value' } })"> Кнопка </button> <div [text]="myItem.el">default value</div>
Ограничение на размер выражений
Хотя в amp-bind стандартом не предусмотрены какие-либо ограничения, Mail.ru устанавливает строгий лимит на длину выражений — не более 100 единиц. В частности, команда Pixcraft столкнулась с этим ограничением во время разработки AMP-игры «Змейка». При клике на кнопку в письме Mail.ru отображал ошибку:
1amp-bind: Expression eval failed. Expression size (194) exceeds max (100)
В то же время с Gmail подобных сложностей не возникало.
Здесь практическое решение — проектировать логику письма с учётом лимита в Mail.ru: оптимизировать вычисления таким образом, чтобы не выходить за установленные рамки.
Работа AMP‑каруселей
<amp-carousel> — полезный инструмент для создания интерактивных галерей изображений. Он работает предсказуемо в большинстве клиентов с поддержкой AMP, однако в Gmail для iOS при нажатии на стрелку навигации письмо прокручивается вверх, а контекст просмотра теряется. Исправить проблему настройками самого <amp-carousel> нельзя, так как она не связана с параметрами type, layout или размерами компонента.
Надёжным решением для этой ситуации становится сборка собственной карусели с использованием amp-bind. В этом варианте письмо при взаимодействии не смещается самопроизвольно. Ниже — пример такой AMP‑карусели, включающий 4 слайда:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34<style amp-custom> .carousel-wrapper { position: relative; width: 500px; height: 400px; overflow: hidden; } .carousel-container { display: flex; transition: transform 0.5s ease-in-out; } .slide-0 { transform: translateX(0%); } .slide-1 { transform: translateX(-100%); } .slide-2 { transform: translateX(-200%); } .slide-3 { transform: translateX(-300%); } .carousel-slide { min-width: 100%; flex: 0 0 auto; } </style> <div class="carousel-wrapper"> <div class="carousel-container" [class]="'carousel-container slide-' + carouselState.index"> <amp-img src="pic1.jpg" width="500" height="400" class="carousel-slide"></amp-img> <amp-img src="pic2.jpg" width="500" height="400" class="carousel-slide"></amp-img> <amp-img src="pic3.jpg" width="500" height="400" class="carousel-slide"></amp-img> <amp-img src="pic4.jpg" width="500" height="400" class="carousel-slide"></amp-img> </div> </div> <button on="tap:AMP.setState({carouselState: {index: (carouselState.index - 1 + 4) % 4}})"> Previous </button> <button on="tap:AMP.setState({carouselState: {index: (carouselState.index + 1) % 4}})"> Next </button>
Базовая логика здесь следующая:
- индекс текущего слайда хранится в состоянии;
- контейнер со слайдами сдвигается через
transform: translateX(...); - навигация реализуется через
AMP.setStateпо кнопкам «вперёд» и «назад».
Поддержка CSS
Восприятие AMP-CSS в Gmail и Mail.ru заметно различается. Например, Gmail следует спецификации AMP for Email максимально строго, что проявляется в нескольких аспектах:
- Разрешён только ограниченный набор CSS-свойств. Конструкции, выходящие за рамки спецификации, приводят к тому, что письмо не проходит валидацию.
- Запрещено использование псевдоэлементов
:beforeи:after. Это критично для привычных приёмов вёрстки, таких как декоративные иконки, маркеры списков, оверлеи и тени, реализуемые через псевдоэлементы. - Анимация и переходы сильно ограничены на уровне рендеринга. Поддерживаются только базовые CSS-анимации, без сложных таймингов и цепочек эффектов.
Mail.ru на практике предъявляет более мягкие требования к использованию CSS. Здесь:
- шире поддержка CSS-анимаций;
- меньше ограничений на декоративные приёмы и визуальные эффекты;
- допустимы решения, которые Gmail блокирует или игнорирует при рендеринге.
Из-за этого если при вёрстке письма ориентироваться только на Mail.ru, почти неизбежно появляется CSS, который Gmail не принимает. Поэтому более надёжная стратегия работы с AMP-CSS выглядит так:
- основная вёрстка с учётом ограничений Gmail: только разрешённые свойства, без псевдоэлементов, с минимальными анимациями;
- контрольная проверка, что AMP стабильно отображается в Gmail;
- аккуратное расширение под Mail.ru: использование дополнительных анимаций и визуальных приёмов поверх базовой вёрстки, уже прошедшей проверку в Gmail.
Тёмная тема в AMP‑письмах
На работу тёмной темы влияют как сам почтовый клиент, так и используемая платформа. Из-за этого один и тот же AMP-шаблон может выглядеть по-разному в Mail.ru, Gmail на Android и Gmail на iOS.
Mail.ru не перекрашивает AMP-письма автоматически. Цвета, фоны и контраст здесь задаются через CSS. Для управления темами используется meta-тег:
1<meta name="supported-color-schemes" content="light dark">
Также задействуются CSS-селекторы в style:
:root[data-ogsc]— тёмная тема;:root:not([data-ogsc])— светлая тема.
В Gmail для Android ситуация иная. При включённой тёмной теме светлые AMP-письма автоматически перекрашиваются по общей логике преобразования светлого макета в тёмный. Если же AMP-письмо изначально выполнено в тёмной цветовой схеме, в Gmail на Android оно сохраняет свой внешний вид. По этой причине тёмные дизайны здесь обычно отображаются стабильнее, чем светлые.
В Gmail для iOS AMP-письма не перекрашиваются автоматически, а управлять тёмной темой через CSS нельзя. Письмо отображается в исходных цветах вне зависимости от настроек системы или самого приложения Gmail.
Таким образом, полноценная поддержка светлой и тёмной темы доступна только для Mail.ru. Поэтому при жёстких требованиях к цветам рекомендуется использовать нейтральный или базовый тёмный дизайн, а проверку письма стоит проводить отдельно в каждом клиенте.
Тестирование AMP‑писем
Тестирование — финальный этап перед отправкой рассылки. Он позволяет оценить валидность AMP-кода, корректность CSS и то, как почтовый клиент реагирует на ошибки.
Для этого Gmail предлагает инструмент Gmail AMP for Email Playground, с помощью которого можно:
- проверять разметку на соответствие спецификации AMP for Email;
- обнаруживать недопустимые компоненты или атрибуты;
- отправлять тестовые письма на собственный адрес @gmail.com.

Если после отправки в клиенте отображается AMP-версия — значит, проверка пройдена. Если же вместо неё открывается HTML-версия, над письмом появится уведомление: код ошибки (например, недопустимый компонент) и ссылка на документацию.
Собственный Playground есть и у Mail.ru. В нём также можно выявить ошибки, связанные с нарушением спецификации или внутренних ограничений почтового клиента, и отправить тестовую рассылку себе на почту.

Таким образом, оптимальным решением становится тестирование в обоих клиентах:
- сначала общая проверка валидности AMP-кода;
- затем тестирование интерактива и логики в Gmail;
- после этого обязательная проверка рендеринга и поведения в Mail.ru.
Подробнее о том, как подготовить AMP-письмо к тестированию и отправке, читайте в нашей подробной инструкции.
Заключение
Поведение AMP-писем зависит не только от реализации кода, но и от правил его обработки в почтовом клиенте. Учёт особенностей Gmail и Mail.ru помогает сохранить контроль над интерактивом и визуальной частью письма. В этом контексте различия между клиентами задают понятные рамки, на основании которых строится реализация email-кампаний.
Кстати, если вы хотите прокачать навыки в email-маркетинге, загляните в наш Telegram-канал. Там мы делимся полезными материалами, лайфхаками и идеями для работы.