![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
*** WEB Star *** #1 Programming
Отправка писем через PHP
Автор: Алекс
aka TrigGer
Источник: kovrik.hut.ru
Как отправить письмо через PHP, используя формы, и как при этом устранить
возникающие проблемы с кодировкой?
Этот вопрос терзает многих начинающих web-мастеров, так как они незнают как
подойти к решению данной проблемы. Попытаюсь облегчить их задачу и влезу в
их шкуру, так как я и сам был когда-то зеленым и этого тоже не знал.
Рассмотрим на простом примере, как отправить вопрос через формы на сайте.
У нас будет 3 поля для ввода:
Ваше имя:
* E-mail:
* Вопрос:
Причем "Ваше имя" не является обязательным параметром. А все остальные
поля, помеченные звездочкой, являються обязательными. От этого и будем плясать,
когда пользователь не введет свое имя или укажет не правильный e-mail или
его вообще не напишет. Выводить будем как ошибку, но об этом позже. Для простоты
и удобства разместим форму и код прогараммы в одном файле. Важно указать кодировку
страницы (windows-1251), чтобы далее не возникало проблем с перекодированием
из win в koi (ниже)
Итак, приступим. Начало документа стандартное:
<!DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Отправка письма</title>
<meta content="text/html;charset=windows-1251" http-equiv="Content-Type">
</head>
<body>
Далее идет 2 логические части:
1 - вывод формы
2 - обработка формы и отправка письма
Вначале идет вывод формы.
Для удобства в начале определяем e-mail через переменную $mailto, на который
будет отсылаться письмо из формы. Далее мы определяем, была ли нажата кнопка
"отправить". В конце формы имеется кнопка "отправить",
она имеет аттрибуты name="ok" и value="отправить". Этот
аттрибут вам придеться вписать самостоятельно, так как он отличается от стандартного
(если такой аттрибут вообще есть). После нажатия на нее переменная $ok будет
иметь значение "отправить". Если кнопка не нажата, то переменная
не определена. Таким образом, выражение if (empty($ok)) означает буквально
"если кнопка отправить не была нажата". Функция empty() возвращает
true, если переменная не определена, содержит 0 или пустоту.
<?
$mailto="name@server.ru";
if (empty($ok))
{
?>
Далее идет вывод формы, если выполнено предыдущее условие if (empty($ok)).
Переменная $PHP_SELF означает, что обработку формы производит текущий файл,
т.е. тот же, на кот. расположена форма.
<h3>Отправьте вопрос автору сайта</h3>
Поля, отмеченные (*), обязательны для заполнения.
<br><br>
<form action="<?echo $PHP_SELF;?>" method="post">
<table>
<tr>
<td>Ваше имя:</td>
<td> <input type="text" name="username" size="30"
maxlength="20"></td>
</tr>
<tr>
<td>* E-mail:</td>
<td><input type="text" name="mailfrom" size="30"
maxlength="50"></td>
</tr>
<tr>
<td>* Вопрос:</td>
<td><textarea cols="50" rows="10" name="question"></textarea></td>
</tr>
</table>
<input type="submit" name="ok" value="отправить">
</form>
В противном случае, т.е. если была нажата
кнопка, идет обработка формы и отправка письма
<?
}
else
{
Хочу предупредить переменная $PHP_SELF не всегда работает на том или ином
хостинге, предоставляющим вам место под сайт. В принципе вы можете оставить
ее как есть и выложить ее на сервак, а там уже тестировать, при условии, что
вам разрешен sendmail. Если окажеться, что эта переменная не работает, то
не отчаивайтесь просто поменяйте ее на название файла, где у вас форма. Должно
получиться так, что файл с формой будет обрабатывать сам себя.
Далее идет проверка на корректность заполнения поля "E-mail". Любители
ругулярных выражений эту проверку поймут. Для остальных немного поясню:
Подразумевается, что e-mail должен быть такого вида:
слово@слово.слово
При этом слово может состоять из всех букв латинского алфавита и цифр и точка
может быть не одна. (например слово@слово.слово.слово)
[a-z,0-9] - означает "любая буква латинского алфавита или цифра"
+ - означает, что [a-z,0-9] может встречаться 1 или более раз.
Если введен неправильный e-mail, то в переменную $error записывается ругательное
сообщение.
if(!preg_match("/^([a-z,0-9])+@([a-z,0-9])+(.([a-z,0-9])+)+$/",
$mailfrom))
{
$error = "Не верно заполнено поле: <b>E-mail</b><br>";
}
Этого может быть оказаться не достаточно для того, чтобы проверить форму на
наличие e-mail. В таком случае записываем ниже:
if
(empty($mailfrom))
{
$error="Не заполнено поле:<b>E-mail</b><br>";
{
Таким же способом можно проверять и имя пользователя, только меняя переменную.
Проверять можно что угодно и выводить на экран тоже - это уже на ваше усмотрение.
Если поле "Вопрос" не заполнили, то к переменно $error добавляем
еше одно ругательство:
if (empty($question))
{
$error = "Не заполнено поле: <b>Ваш вопрос</b><br>";
}
Если переменная $error не пустая, то мы ее выводим на экран и немедленно прекращаем
дальнейшую обработку с помощью exit, то есть скрипт прекращает обработку формы
и выводит сообщение об ошибке.
if
($error)
{
echo $error;
echo "<br><a href=\"javascript:history.go(-1)\"
class=\"text\">Вернуться назад</a>";
exit;
}
Ну а если таки $error осталась пустой и exit не сработал, то можно приступать
к отправке письма, т.е. главной цели всего этого мероприятия...
Сформируем тему и тело сообщения:
$subject="Вопрос
от $mailfrom";
$body="Имя:
$username
E-mail:
$mailfrom
Комментарии:
$question";
А теперь самое главное, чтоб потом можно было прочитать письмо "по-русски"
:) Функция convert_cyr_string перекодирует строку из win в koi (w-win, k-koi)
Это необходимо, т.к. все почтовые клиенты по дефалту принимают письма в koi.
А у нас вверху страницы стоит charset=windows-1251, поэтому функция грамотно
переводит из win в koi Затем с помощью функции mail отправляется письмо на
$mailto, указанный в начале файла.
$body=convert_cyr_string
(stripslashes($body),w,k);
$subject=convert_cyr_string (stripslashes($subject),w,k);
$sucess = mail($mailto, $subject, $body,
"From: $email
X-Mailer: PHP/" . phpversion());
Ну и самое приятное... Если письмо успешно отправлено, то выводим благодарственную
надпись и предлагаем вернуться..
if
($sucess)
{
echo "Спасибо. Ваш вопрос отправлен.<br><br>";
echo "<a href=\"javascript:history.go(-1)\"
class=\"text\">Вернуться назад</a>";
}
Стандартный конец..
}
?>
</body>
</html>
P.S. Как наверно понял читатель, нужно выделить и скопировать все синие блоки
в один файл по порядку и запустить его на сервере. Весь код является полностью
проверенным и рабочим. Кстати. чуть не забыл, когда выложите страницу на сервак,
то нужно выставить им права доступа к этой страницы с помощью любого FTP-клиента.
Это так называемые chmod. Ознакомтесь с интсрукциями на сервере хостинга.
Обычно это 711 или 755. Советую ставить 755, тогда точно пользователь получит
право ознакомиться с вашей страницей. Выставляйте права так: chmod 755 nameyourpage.php
Удачи!!!
©
Copyright Алекс aka TrigGer
& x-graphic
studio
© Все права защищены.
Перепечатка
материалов разрешается, только после письменного разрешения автора (e-mail).
При перепечатке любого материала с журнала видимая ссылка на источник www.kovrik.hut.ru
и все имена, ссылки авторов обязательны.