Почему стандартная отправка Contact Form 7 не всегда подходит для нескольких email
Contact Form 7 по умолчанию поддерживает отправку писем на несколько адресов через поле «Кому» с разделением адресов запятыми, например, email1@example.com, email2@example.com. Но такой способ часто вызывает проблемы с доставкой, особенно при использовании SMTP или внешних почтовых сервисов, из-за особенностей SPF, DKIM и DMARC. Также невозможно динамически менять получателей в зависимости от данных формы.
Для решения этих задач рекомендуется использовать фильтр wpcf7_mail_components, который позволяет программно изменять параметры письма перед отправкой, в том числе список адресатов.
Диагностика проблемы: как понять, что нужно отправлять письма на несколько email через фильтр
- Требуется отправлять письма на разные адреса в зависимости от выбранных пользователем опций в форме.
- Стандартное поле «Кому» с несколькими адресами не работает корректно (письма не доходят или попадают в спам).
- Необходимо отправлять письмо копии нескольким сотрудникам без раскрытия адресов друг другу.
- Хотите реализовать логику, где разные поля email получают разные части письма.
Пошаговое решение: использование фильтра wpcf7_mail_components для отправки на несколько email
1. Создайте или отредактируйте файл functions.php вашей темы или используйте подключаемый плагин для пользовательских функций.
2. Добавьте следующий код, где вы программно указываете адреса получателей в зависимости от данных формы:
add_filter('wpcf7_mail_components', function($mail_components, $contact_form) {
// Получаем объект текущей формы
$submission = WPCF7_Submission::get_instance();
if (!$submission) {
return $mail_components;
}
$data = $submission->get_posted_data();
// Пример: если пользователь выбрал опцию "support", отправляем на support@example.com
// если "sales" - на sales@example.com и дополнительно на manager@example.com
$recipients = [];
if (!empty($data['department'])) {
switch ($data['department']) {
case 'support':
$recipients[] = 'support@example.com';
break;
case 'sales':
$recipients[] = 'sales@example.com';
$recipients[] = 'manager@example.com';
break;
default:
$recipients[] = 'info@example.com';
}
} else {
$recipients[] = 'info@example.com';
}
// Присваиваем адреса в поле "To"
$mail_components['to'] = implode(', ', $recipients);
return $mail_components;
}, 10, 2);3. В форме Contact Form 7 добавьте поле выбора [select department "support" "sales"] с именем department.
Как проверить, что решение сработало
- Отправьте форму с разными значениями поля
department. - Проверьте исходящие письма на почтовом сервере или в почтовом клиенте — письма должны приходить на адреса, предусмотренные в коде.
- Если используется SMTP-плагин, проверьте логи отправки и убедитесь, что письма отправляются корректно.
- При необходимости добавьте в код логирование для отладки, например,
error_log(print_r($mail_components, true));.
Частые ошибки и их исправление
- Письма не отправляются или приходят только на один адрес: проверьте правильность разделения адресов через запятую и отсутствие пробелов внутри адресов.
- Фильтр не срабатывает: убедитесь, что функция подключена в
functions.php, и что при отправке формы используется именно Contact Form 7. - Ошибки PHP в логах: проверьте синтаксис и наличие функции
WPCF7_Submission::get_instance(), которая доступна с версии CF7 5.0+ - Письма попадают в спам: настройте SPF, DKIM, DMARC для домена, используйте SMTP-плагин с правильными учетными данными.
Практические советы по безопасности и производительности
- Не вставляйте в список получателей email из ненадежных источников без валидации — это может привести к рассылке спама с вашего сервера.
- Для повышения производительности не используйте тяжелые операции внутри фильтра, так как он вызывается при каждом отправлении формы.
- Используйте SMTP-плагины (например, WP Mail SMTP) для надежной отправки почты и минимизации попадания в спам.
- Если требуется отправлять разные письма разным адресатам, рассмотрите отправку дополнительных писем через хук
wpcf7_mail_sent.
Сравнение подходов для отправки на несколько email
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Указание нескольких email в поле «Кому» | Простота настройки | Проблемы с доставкой, нет динамики | to: admin@example.com, support@example.com |
Фильтр wpcf7_mail_components |
Динамическая логика, гибкость | Требует кода, внимательности | Пример из статьи выше |
Отправка отдельных писем в wpcf7_mail_sent |
Можно создавать кастомные письма | Сложнее, дублирование кода | Хук для отправки дополнительных писем |