WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Советы » **Отправка писем через PHP

**Отправка писем через PHP


Дата публикации: 31-01-2008

dina,

Webscript.ru

 

 

Как отправить письмо через 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 означает, что обработку формы производит текущий файл, т.е. тот же, на кот. расположена форма. В противном случае, т.е. если была нажата кнопка, идет обработка формы и отправка письма

<?
}
else
{

Далее идет проверка на корректность заполнения поля "E-mail". Любители ругулярных выражений эту проверку поймут. Для остальных немного поясню:
Подразумевается, что e-mail должен быть такого вида:
слово@слово.слово
При этом слово может состоять из всех букв латинского алфавита и цифр и точка может быть не одна. (например слово@слово.слово.слово)
[a-z,0-9] - означает "любая буква латинского алфавита или цифра"
+ - означает, что [a-z,0-9] может встречаться 1 или более раз.

Если введен неправильный e-mail, то в переменную $error записывается ругательное сообщение.

   {
    $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. Как наверно понял читатель, нужно выделить и скопировать все зеленые блоки в один файл по порядку и запустить его на сервере
Весь код является полностью проверенным и рабочим. 

Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Оноре де Бальзак:

"Тот, кто ищет миллионы, весьма редко их находит, но зато тот, кто не ищет, не находит их никогда."

Опрос

Какой текстовый редактор Вы используете?

OpenOffice
AbiWord
Notepad++
UltraEdit
PSPad
Microsoft Office
Microsoft Блокнот
Другой...