Сценарий знакомый: форма отправляется, письмо приходит, но файл из поля загрузки в письме отсутствует. Иногда вместо вложения приходит только ссылка, иногда поле пустое, а иногда файл вообще не доезжает до почты. В Contact Form 7 это обычно не «поломка плагина», а одна из нескольких конкретных причин: неверный тег поля, ограничения почтового сервера, неправильная настройка вкладки Mail, конфликт с безопасностью хостинга или лишняя обработка вложений в коде темы.
Ниже разберём, где именно искать проблему, как исправить её без лишних плагинов и как проверить, что вложения действительно уходят так, как вы ожидаете.
Как выглядит проблема на практике
Чаще всего жалобы сводятся к одному из трёх вариантов:
- в письме есть текст заявки, но нет самого файла;
- вложение приходит только для части типов файлов, например
.jpgприходит, а.pdfнет; - файл загружается в WordPress, но письмо уходит без него после обновления темы или плагина.
Если форма работает на сайте с ограничениями хостинга, проблема может проявляться только на больших файлах или на определённых почтовых адресах. Поэтому начинать стоит не с правки кода, а с диагностики конкретного сценария.
Диагностика: что проверить первым делом
1. Поле загрузки в самой форме
В Contact Form 7 для файлов используется тег [file] или [file*]. Если поле названо иначе или в шаблоне формы есть лишняя разметка, письмо может отправляться без вложения. Проверьте, что имя поля совпадает с тем, что вы вставляете во вкладке Mail.
[file your-file limit:10mb filetypes:jpg|jpeg|png|pdf]Если вы используете обязательное поле, лучше явно указывать [file* your-file]. Но это не решает проблему с доставкой само по себе — оно только заставляет пользователя прикрепить файл.
2. Вкладка Mail и поле Attachments
Самая частая ошибка — файл загружается в форму, но его не добавили в поле File attachments во вкладке Mail. Contact Form 7 не прикрепляет файл автоматически, если вы не указали тег поля в этом разделе.
Проверьте, что там стоит именно имя вашего поля, например:
[your-file]Если поле называется your-file, а в письме написано [file] или другое имя, вложения не будет.
3. Ограничения хостинга и почтового сервера
Даже если Contact Form 7 всё делает правильно, письмо может не пройти из-за лимита размера вложений, политики SMTP или фильтров почтового сервиса. Это особенно заметно при отправке PDF, архивов и изображений в высоком качестве. В таком случае форма может считаться отправленной, но письмо приходит без файла или не приходит вовсе.
Если у вас уже настроен SMTP, проверьте лимиты на стороне почтового ящика и сервера. Если SMTP нет, вложения иногда режутся на уровне PHP или MTA хостинга.
Пошаговое решение без лишних обходных путей
Шаг 1. Приведите форму к простому рабочему виду
Сначала уберите всё лишнее и оставьте минимальный набор полей. Так проще понять, где именно ломается цепочка. Пример формы:
[text* your-name placeholder "Ваше имя" ]
[email* your-email placeholder "Email"]
[file* your-file limit:10mb filetypes:jpg|jpeg|png|pdf]
[submit "Отправить"]Если на этом этапе файл уже не прикладывается, проблема почти наверняка в настройках письма, ограничениях сервера или конфликте с кодом.
Шаг 2. Укажите вложение во вкладке Mail
Во вкладке Mail в поле File attachments добавьте тег файла без лишних символов. Для примера выше это будет:
[your-file]Не путайте это поле с текстом письма. В тело письма можно вставить ссылку или имя файла, но само вложение задаётся именно здесь.
Шаг 3. Ограничьте типы и размер файлов
Если пользователи загружают всё подряд, вы быстро упрётесь в ограничения почты. Лучше сразу ограничить типы и размер на уровне формы. Это не только снижает риск ошибок, но и уменьшает нагрузку на сервер.
[file* your-file limit:5mb filetypes:jpg|jpeg|png|pdf]Для большинства рабочих сценариев этого достаточно. Если нужно принимать архивы или большие медиафайлы, лучше не отправлять их вложением по почте, а сохранять на сервере и передавать ссылку в письме.
Шаг 4. Если вложение всё равно теряется, проверьте фильтры и код темы
Иногда в тему или в mu-plugins добавляют фильтры, которые меняют поведение почты. Например, могут переопределять вложения или чистить временные файлы раньше времени. Если у вас есть кастомный код, временно отключите его и проверьте форму на чистой конфигурации.
Для точечной диагностики полезно логировать отправку через стандартный хук Contact Form 7. Ниже пример, который пишет в error_log список вложений, если письмо отправляется через конкретную форму:
add_action( 'wpcf7_before_send_mail', function( $contact_form ) {
$submission = WPCF7_Submission::get_instance();
if ( ! $submission ) {
return;
}
$data = $submission->get_posted_data();
if ( empty( $data['your-file'] ) ) {
error_log( 'CF7: поле your-file пустое или не передано.' );
} else {
error_log( 'CF7: файл передан: ' . print_r( $data['your-file'], true ) );
}
} );Этот код не чинит проблему сам по себе, но помогает понять, доходит ли имя файла до обработки формы. Если поле пустое уже на этом этапе, искать нужно в форме или в загрузке файла на стороне браузера. Если имя есть, а вложения нет, проблема чаще в Mail или на почтовом сервере.
Когда лучше не прикладывать файл к письму
Есть сценарии, где вложение в письме — плохая идея. Например, если пользователи загружают тяжёлые изображения, сканы или несколько файлов сразу. Почтовые сервисы режут размер сообщений, а некоторые хостинги ограничивают отправку вложений жёстче, чем кажется из панели управления.
В таких случаях практичнее сохранять файл на сервере и отправлять в письме ссылку на него. Это снижает риск потери заявки и упрощает доставку. Но такой подход требует аккуратной настройки прав доступа: если файл не должен быть публичным, его нельзя просто складывать в открытый каталог без контроля.
| Подход | Плюсы | Минусы |
|---|---|---|
| Вложение в письме | Удобно менеджеру, файл сразу в почте | Лимиты размера, риск недоставки |
| Ссылка на файл | Меньше проблем с почтой, проще большие файлы | Нужно контролировать доступ и хранение |
| Кастомная обработка через код | Гибкость, можно логировать и валидировать | Требует поддержки и тестирования |
Проверка результата после внедрения
После правок не ограничивайтесь одним тестом. Проверьте форму в нескольких сценариях:
- файл маленький, например
.jpg; - файл на границе лимита;
- файл запрещённого типа, например
.exeили.php; - письмо приходит на основной ящик и на альтернативный адрес;
- вложение открывается на стороне почтового клиента, а не только отображается в интерфейсе.
Если используете SMTP, проверьте логи отправки на стороне почтового сервиса. Если SMTP нет, отправьте тест с другого домена, чтобы исключить локальные фильтры почтового ящика.
Хороший признак — письмо приходит с вложением, а в логах сервера нет ошибок по временным файлам, правам доступа или превышению лимита upload_max_filesize.
Частые ошибки и как их исправить
Неверное имя поля в Attachments
Форма называется your-file, а в письме указан другой тег. Исправление простое: синхронизируйте имя поля в форме и во вкладке Mail.
Файл загружается, но письмо уходит без него
Проверьте лимиты хостинга, размер вложения и почтовый сервис. Если файл больше допустимого размера, лучше не пытаться отправлять его как attachment.
Пользователь загружает файл, но он исчезает после отправки
Часто это связано с очисткой временных файлов или конфликтом с кэширующим/безопасностным плагином. Временно отключите фильтрацию загрузок и проверьте, не удаляется ли файл до формирования письма.
Вложение приходит только на часть адресов
Это уже не проблема Contact Form 7, а поведение почтового сервера получателя. Некоторые фильтры агрессивно относятся к вложениям, особенно если письмо отправляется с неподтверждённого домена.
Безопасность и производительность: что не стоит игнорировать
Формы с загрузкой файлов — это точка входа для мусорных и потенциально опасных файлов. Не принимайте всё подряд. Ограничьте типы файлов, размер и, если нужно, добавьте серверную проверку MIME-типа. Не полагайтесь только на расширение файла.
Если у вас есть кастомная логика обработки, не сохраняйте загруженные файлы в открытый каталог без проверки прав доступа. Для публичных сайтов это частая причина утечек. Также не забывайте чистить временные файлы, если вы храните их отдельно от стандартного механизма WordPress.
На загруженных сайтах полезно дополнительно следить за размером очереди почтовых отправок и не отправлять тяжёлые вложения через обычную форму, если это можно заменить ссылкой на защищённое хранилище.
Когда нужен код, а когда достаточно настроек
Если проблема в имени поля, вкладке Mail или лимите размера, код не нужен. Если же вы хотите логировать отправку, менять поведение вложений или подстраивать обработку под конкретный сценарий, тогда уже имеет смысл подключать небольшой фрагмент в functions.php дочерней темы или в собственный мини-плагин.
Для типовых задач лучше сначала исчерпать штатные настройки Contact Form 7. Это быстрее, безопаснее и проще поддерживать после обновлений.