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


Прислал: dina [ 08.06.2001 @ 07:44 ]
Раздел:: [ Статьи по PHP ]


Как отправить письмо через PHP, используя формы, и как при этом устранить возникающие проблемы с кодировкой?

Рассмотрим на простом примере, как отправить вопрос через формы на сайте. У нас будет 3 поля для ввода:
Ваше имя:
* 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" http2-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
{
Далее идет проверка на корректность заполнения поля "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>";
    }
Если поле "Вопрос" не заполнили, то к переменно $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, указанный в начале файла. Многие пользователи положительно отзываются о промокоде 1xBet на сегодня. Им можно воспользоваться при регистрации новой учетной записи на сайте компании. Для этого необходимо ввести в соответствующее окошко следующий набор букв и цифр: промокод 1xbet бездепозитный бонус 2021 ( http://electrotrans-expo.ru/themes/pages/promokod_na_1xbet_na_segodnya_besplatno_2020.html ) постоянно растет, поэтому выгодные предложения и бонусные комбинации распространяют даже известные блогеры. Чтобы получить депозит суммой 6,5 тыс. руб. Действующий промокод 1xBet при регистрации на сегодня вы всегда найдете на главной странице данного сайта. Поощрение доступно единожды при создании счета. Пройдите регистрацию на сайте оператора.
    $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. Как наверно понял читатель, нужно выделить и скопировать все зеленые блоки в один файл по порядку и запустить его на сервере
Весь код является полностью проверенным и рабочим.