Как происходит преобразование запроса POST в GET при отправке формы на электронную почту, и какие шаги необходимо предпринять, чтобы этого избежать?

Добрый день! Я изучаю вёрстку форм и наткнулся на информацию о том, что можно отправлять данные без использования скриптов, просто передавая их почтовой программе. В HTML-коде у меня стоит следующее: 
<br/> 
<pre><code class="html">&lt;form action="mailto:any@adress.net" method="post" enctype="text/plain"&gt;
    &lt;p&gt;Как вас зовут?&lt;br&gt;&lt;input name="cleint-name"&gt;&lt;/p&gt;
    &lt;p&gt;По какому номеру телефона с вами можно связаться?&lt;br&gt;&lt;input name="cleint-phone-number"&gt;&lt;/p&gt;
    &lt;p&gt;&lt;input type="submit"&gt;&lt;/p&gt;
&lt;/form&gt;</code></pre> 
<br/> 
Когда я заполняю форму и нажимаю "отправить", у меня открывается окно почтовой программы, где поле "кому" заполнено правильно, но в теле письма ничего нет (ожидалось увидеть заполненные поля и их значения). 
<br/> 
Я также заметил, что передаётся запрос GET вместо POST (статус 200, метод GET). В книге, которую я читаю, упоминается, что с методом GET это не будет работать. Так почему же запрос POST стал GET? И как получается, что информация частично передаётся в почтовую программу? Как это вообще устроено?
<br/> 
Дополнительная информация: использую Ubuntu 22.04, на компьютере установлен веб-сервер Apache (его остановка не повлияла на результат).
  • 17 апреля 2025 г. 16:25
Ответы на вопрос 2
Добрый день! Давайте разберемся с тем, что происходит, когда вы используете атрибут `action="mailto:"` в форме, и почему наблюдаются упомянутые вами проблемы.

### 1. Как работает `mailto:`?

Когда вы используете `mailto:` как `action` для формы, браузер обрабатывает это как ссылку для отправки электронной почты, а не как обычный обработчик формы. Вот как это работает:

- При нажатии на кнопку отправки формы, браузер создает ссылку типа `mailto:` с соответствующими параметрами, которые включают адрес получателя, тему и тело письма.
- Стандартное поведение для отправки формы с методом `POST` просто перенаправляет данные, но `mailto:` не поддерживает обработку POST-запросов. Вместо этого, браузер создает запрос на основе указанной информации и открывает почтовую программу.

### 2. Почему данные не попадают в тело письма?

Ваша форма использует `enctype="text/plain"`, что не является стандартным для отправки данных по электронной почте через `mailto:`. Метод `GET` может использоваться для формирования URL, в который добавляются параметры. Если вы хотите, чтобы данные передавались корректно, используйте `enctype` по умолчанию (который обычно `application/x-www-form-urlencoded`), но важно понимать, что `mailto:` не может адекватно обрабатывать это.

### 3. Преобразование запроса POST в GET

Когда браузер использует `mailto:`, он не выполняет стандартную отправку данных по методу `POST`. Вместо этого он создает URL и передает данные в формате строки запроса (который используется в `GET`), хотя в данной ситуации метод не имеет значения. В итоге, данные формируются как обычный `query string`, зачастую в не очень дружелюбном для чтения виде, и включены в тело `mailto:` ссылки.

### 4. Как избежать проблем с отправкой формы на почту

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

1. **Создайте серверный скрипт** — используйте PHP, Python или другой язык для обработки данных формы.
2. **Настройте `action` на ваш скрипт** — указывайте URL вашего скрипта как `action` в форме:
   ```html
   <form action="your_script.php" method="post">
   ```
3. **Обработайте данные в скрипте** — получите данные из POST-запроса и используйте функции для отправки почты (например, `mail()` в PHP).

Пример PHP-скрипта, который отправляет электронное письмо:

```php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = $_POST['cleint-name'];
    $phone = $_POST['cleint-phone-number'];
    $to = 'any@adress.net';
    $subject = 'Новая заявка';
    $message = "Имя: $name\nТелефон: $phone";
    $headers = 'From: webmaster@example.com' . "\r\n" .
               'Reply-To: webmaster@example.com';

    mail($to, $subject, $message, $headers);
    echo "Сообщение отправлено!";
}
?>
```

Использование этого подхода гарантирует, что все данные будут правильно обработаны и отправлены на электронную почту.
<code>action="mailto:any@adress.net"</code> <br/> <a href="https://htmlbook.ru/html/form/action" rel="nofollow">https://htmlbook.ru/html/form/action</a> <br/> В данном случае никаких запросов не создаётся, а происходит по факту редирект на урл вида: <br/> <pre><code>mailto:any@adress.net?subject=...&amp;body=cleint-name...cleint-phone-number...</code></pre> <br/> А дальше уже этот урл обрабатывается на уровне операционной системы. Для отправки же именно запроса следует использовать ссылку.
Похожие вопросы