Алексей Иванов (alexyv) wrote,
Алексей Иванов
alexyv

Category:
  • Mood:

Форма обратной связи

Когда я рассказывал про XSLT, я упоминал сайт-халтурку: Компания «ИСО». Недавно мне написал паренек, который у них занимался наполнением сайта, и попросил убрать со страницы Контакты его телефоны. Оказывается, он указал там свои телефоны, и ему иногда звонят.

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

Можно было сделать ее на Perl, но не так интересно. Хотелось при этом узнать что-то новое, поэтому решил познакомиться с PHP. Поискав в Google, нашел вполне подходящее описание. В статье говорилось, что при использовании функции mail() не получиться правильно указать поле From, поэтому я решил использовать второй вариант: напрямую передавать параметры в sendmail.

После исправления синтаксических ошибок (я не полностью копировал текст из статьи, а сразу модифицировал его; тем более HTML-код формы из статьи не прошел бы валидацию), я получил ошибку-предупреждение: функция popen() заблокирована, так как включен режим safe_mode. Переписал с использованием функции mail(), и почта стала отправляться.

Но ведь неправильно, что существует только простейшая проверка на ошибки, к тому же при выводе ошибки данные, введенные в форму теряются. И если снова ввести имя и адрес эл.почты не так уж сложно, то снова набрать сообщение может быть не так-то просто. Поэтому я приступил к дальнейшему совершенствованию формы.

Над формой выводятся все обнаруженные ошибки, а не одна из них, как в оригинальной программе. (Попробуйте отправить пустую форму.) А введенные в поля значения сохраняются при повторном выводе формы, остается только отредактировать поля с ошибками. Корректность адреса электронной почты проверяется с помощью функции eregi() и регулярного выражения отсюда (зрительно убедился в правильности регулярного выражения).

Кроме того, дополнил тег формы атрибутами action="mail.php" и accept-charset="utf-8". Утверждение о том, что mail() не позволяет установить значение поля From оказалось в корне неверным: еще как позволяет с помощью четвертого аргумента! И можно установить дополнительные заголовки, что я и сделал, добавив Content-Type: text/plain; charset=utf-8\r\nContent-Transfer-Encoding: 8bit\r\n. (Да, согласно RFC 2045, одиночные кавычки вокруг кодировки ненужны, как неправильно указано в базовом примере $headers = "content-type: text/plain; charset='windows-1251'".)

На PHP писать достаточно удобно, удобнее, чем на Perl. HTLM-код и код программы можно легко комбинировать. До этого ни разу с ним не сталкивался.

P.S. Попутно оставил комментарий к статье: PHP sendmail: отправка почты с вложениями посредством PHP, указав на неправильное использование Content-Type: multipart/alternative; вместо multipart/mixed.

P.P.S. Что вообще скажете про дизайн упомянутого сайта Компания «ИСО»?

Tags: html, php, сайт
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 7 comments