28 мая 2025 г.

Топ-8 тонкостей при создании AMP-писем

Время чтения: 7 минут

AMP в email-рассылках — это способ добавить в письмо интерактив: формы, карусели, смену контента без перехода на сайт. Однако, как и в случае с обычными html-письмами, здесь есть свои особенности отображения и поведения, которые важно учитывать при верстке и тестировании.

В этой статье разбираем 8 распространённых проблем, с которыми сталкиваются верстальщики при работе с AMP-письмами, — и показываем, как их решать на практике: с примерами, кодом и пояснениями.

1. Проблема AMP-карусели в Gmail на iOS

При использовании стандартного компонента <amp-carousel> в Gmail на iOS возникает неприятный баг — при переключении слайдов письмо резко прокручивается вверх. Проблема известна давно, но поведение так и не было исправлено.

Решение: Не использовать <amp-carousel>, а реализовать его имитацию с помощью состояний (amp-bind). Ниже — рабочий пример:

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
35
36
37
38
39
40
41
42
43
<amp-state id="carouselState">
  <script type="application/json">
    {
        "index": 0
    }
  </script>
</amp-state>

<style amp-custom>
  .carousel-wrapper {
    position: relative;
    width: 450px;
    height: 300px;
    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%); }
  .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="https://amp.dev/static/inline-examples/images/image1.jpg" width="450" height="300" class="carousel-slide"></amp-img>
    <amp-img src="https://amp.dev/static/inline-examples/images/image2.jpg" width="450" height="300" class="carousel-slide"></amp-img>
    <amp-img src="https://amp.dev/static/inline-examples/images/image3.jpg" width="450" height="300" class="carousel-slide"></amp-img>
  </div>
</div>

<button on="tap:AMP.setState({carouselState: {index: (carouselState.index - 1 + 3) % 3}})">
  Previous
</button>

<button on="tap:AMP.setState({carouselState: {index: (carouselState.index + 1) % 3}})">
  Next
</button>

2. Проблема начальных AMP-состояний в Mail.ru

Начальное состояние, заданное через <amp-state>, не применяется при загрузке письма — оно подставляется только после действия пользователя (setState). Mail.ru же полностью игнорирует содержимое <amp-state>. Рассмотрим на примере:

1
2
3
4
5
6
7
8
9
<amp-state id="myItem">
  <script type="application/json">
    {
        "el":"some value"
    }
  </script>
</amp-state>
<span [text]="myItem.el"></span>
<button on="tap:AMP.setState({})">Кнопка</button>

При загрузке письма мы не увидим текста. В Gmail он появится только после клика на кнопку. Mail.ru же после клика на кнопку вместо текста отобразит null.

Решение:

1. Добавьте значение по умолчанию в HTML, чтобы текст отображался сразу.

1
<span [text]="myItem.el">some value</span>

2. Для корректной работы в Mail.ru, нициализируйте состояние вручную по действию пользователя. Не используйте <amp-state> для начальной инициализации, а задайте значение через setState:

1
2
3
4
<button on="tap:AMP.setState({ myItem: { el: 'some value' } })">
  Кнопка
</button>
<div [text]="myItem.el"></div>

3. Ограничение длины выражений в Mail.ru

Ещё одна особенность AMP в Mail.ru — ограничение на сложность/длину выражений, используемых в bind. Максимальный размер выражения — 100 единиц. Если выражение превышает этот лимит, Mail.ru выдаёт ошибку вида:

1
amp-bind: Expression eval failed. Expression size (194) exceeds max (100). Please reduce number of operands.

С такой ошибкой мы столкнулись при разработке игры «Змейка» в AMP-письме: вычисления для движения и логики игры требовали выражений длиннее 100, что приводило к их блокировке на стороне Mail.ru.

Решение:

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

4. Переменные ESP и шаблоны AMP (конфликт синтаксиса)

Многие ESP (сервисы рассылок) позволяют вставлять переменные персонализации или условные конструкции в шаблон письма. Нередко синтаксис таких переменных пересекается с синтаксисом шаблонов AMP (amp-mustache), которые используют двойные фигурные скобки {{ }}. Это приводит к тому, что платформа-рассыльщик «подменяет» или искажает AMP-шаблон, считая его своими переменными. В результате письмо может сломаться или вовсе не отправиться (если ESP сочтёт шаблон некорректным).

Решения:

Altcraft: В Altcraft шаблоны тоже используют фигурные скобки, поэтому для обозначения AMP-шаблона нужно добавить префикс $. Например, вместо {{success}} пишем ${{success}}. Символ $ предотвратит интерпретацию платформой, и на выходе в отправленном письме останется чистый {{success}} для AMP. То есть Altcraft пропустит такой фрагмент, позволив AMP-механизму обработать его уже на стороне клиента.

Пример:

<template type="amp-mustache">$\{\{success\}\}</template> — Altcraft не тронет содержимое внутри $ {{ }}, а AMP при отображении увидит стандартный {{success}}.

Mailganer: В Mailganer для таких случаев предусмотрены специальные теги {% verbatim %} ... {% endverbatim %}. Любой код, заключённый в {% verbatim %}, платформа не будет менять. Поэтому AMP-шаблон можно обернуть этими тегами.

Пример:

1
2
3
 <template type="amp-mustache">
  {% verbatim %}{{success}}{% endverbatim %}
</template>

Unisender: В Unisender, наоборот, ничего дополнительно делать не нужно, так как внутри тега <template> платформа вообще не пытается подставлять свои переменные. Unisender по умолчанию игнорирует содержимое <template type="amp-mustache">, полагая, что это для клиентской стороны. Это упрощает жизнь — можно прямо писать {{variable}} — но есть ограничение: вы не сможете вставить персонализацию внутрь amp-mustache.

5. Особенности работы тёмной темы в разных клиентах

AMP-письма в тёмной теме отображаются по-разному в зависимости от почтового клиента. Где-то письмо перекрашивается автоматически, где-то — остаётся как есть, а в некоторых случаях разработчик может сам задать стили.

Разберем подробнее:

Mail.ru. Не перекрашивает AMP-письма сам, но поддерживает кастомные стили для тёмной и светлой темы. Добавьте в <head>:

1
<meta name="supported-color-schemes" content="light dark">

В стилях используйте селекторы с префиксом:

:root[data-ogsc] — для тёмной темы,
:root:not([data-ogsc]) — для светлой.

Gmail на Android. Перекрашивает светлые письма в тёмные автоматически.

Gmail на iOS. Не перекрашивает письмо и не даёт его кастомизировать.

Yahoo. Поведение похоже на Gmail: на Android — автоинверсия, на iOS — письмо остаётся без изменений.

6. Время жизни AMP-письма

AMP-содержимое письма отображается только в течение 30 дней. После этого показывается обычная HTML-версия. Это сделано для того, чтобы обеспечить работоспособность AMP-письма, которое зачастую имеет серверную часть, которая спустя длительное время может перестать работать.

Решения:

Даже в AMP-письмах следует обращать внимание на качество и контент HTML-версии. Она отображается у пользователей, чьи почтовые клиенты не поддерживают AMP, а также спустя 30 дней, когда AMP-содержимое устаревает. Поэтому HTML-версия должена включать всю ключевую информацию и быть полноценной альтернативой интерактивной AMP-части.

7. Ограничение размера письма в Gmail

В Gmail действуют два разных лимита на размер письма:

  • HTML-часть: максимум 102 КБ. Если превышен, письмо обрезается, и Gmail показывает ссылку «Показать полностью». Это нарушит верстку и скроет часть контента.

  • AMP-часть: максимум 200 КБ. Если превышен, AMP-версия просто не будет отображена — пользователь увидит HTML-версию.
    Показана часть сообщения

Решения:

  • Сжимайте код. Удалите комментарии, пробелы, дублирующиеся стили. Используйте специальные инструменты (например, htmlminifier.com).

  • Убирайте лишнее. Сократите трекинг-ссылки, очистите шаблон от неиспользуемых элементов и скрытых блоков.

  • Оптимизируйте стили: общие — в <style amp-custom>, инлайн — только по необходимости.

8. Проблемы с аналитикой AMP-писем

AMP позволяет взаимодействовать с контентом прямо внутри письма — например, нажимать кнопки, заполнять формы или листать карусели — без переходов на сайт. Такие действия не фиксируются обычными трекерами, поскольку внутри AMP нельзя использовать JavaScript, а компонент <amp-analytics> не поддерживается в AMP для email. В результате клики и события остаются «невидимыми» для систем аналитики вроде Google Analytics, «Яндекс.Метрики» и большинства ESP.

Решение:

Для реализации такой аналитики можно использовать сервисы, поддерживающие сбор событий с помощью трекинг-пикселей. Один из надёжных вариантов — Pixcraft, который предоставляет API для трекинга AMP-событий через обычные GET-запросы.

Заключение

При вёрстке AMP-писем важно учитывать, как они ведут себя в разных почтовых клиентах. Даже у таких крупных платформ, как Gmail и Mail.ru, поведение отличается: где-то ломается карусель, где-то игнорируются состояния.

Обязательно тестируйте рассылки в Gmail (веб, Android, iOS), Mail.ru, Yahoo. Главное — не полагаться на «работает в одном месте — значит, везде». Потратьте время на тестирование, и интерактив в письмах будет работать стабильно, независимо от платформы.

Если работаете в Figma, загляните к нам. Здесь мы выкладываем много полезных материалов и инструментов для дизайнеров.

Поделиться: