Как выслать письмо через PHP, используя формы, и как при всем этом убрать возникающие препядствия с кодировкой?
Разглядим на ординарном примере, как выслать вопрос через формы на веб-сайте. У нас будет 3 поля для ввода:
Ваше имя: * E-mail: * Вопрос:
При этом "Ваше имя" не является неотклонимым параметром.
Для простоты и удобства разместим форму и код прогараммы в одном файле. Принципиально указать шифровку странички (windows-1251), чтоб дальше не появлялось заморочек сперекодированием из win в koi(ниже)
Итак, приступим. Начало документа стандартное:
Код:
Отправка письма
Дальше идет 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>
Поля, отмеченные (*), неотклонимы для наполнения.
<form 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
{
Дальше идет проверка на правильность наполнения поля "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] ";
}
Если поле "Вопрос" не заполнили, то к переменно $error добавляем еше одно ругательство:
Код: if (empty($question))
{
$error.= "Не заполнено поле: [b]Ваш вопрос[/b]
";
}
Если переменная $error не пустая, то мы ее выводим на экран и немедля прекращаем последующую обработку при помощи exit
Код: if ($error)
{
echo $error;
echo " <a 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());</div>
Ну и самое приятное... Если письмо удачно отправлено, то выводим благодарственную надпись и предлагаем вернуться..
<div class="codetitle">Код:</div><div class="code"> if ($sucess)
{
echo "Спасибо. Ваш вопрос выслан.
";
echo "<a class="text">Вернуться назад</a>";
}
Стандартный конец..
Код: }
?>
P.S. Как наверное сообразил читатель, необходимо выделить и скопировать все зеленоватые блоки в один файл по порядку и запустить его на сервере
Весь код является стопроцентно испытанным и рабочим.
|