Библиотека программиста

19.04.2024 - Как отправить письмо через 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" http-equiv="Content-Type">
    </head>
    <body>



    Далее идет 2 логические части:
    1 - вывод формы
    2 - обработка формы и отправка письма

    Вначале идет вывод формы.

    Для удобства в начале определяем e-mail через переменную $mailto, на который будет отсылаться письмо из формы.
    Далее мы определяем, была ли нажата кнопка "отправить".
    В конце формы имеется кнопка "отправить", она имеет аттрибуты name="ok" и value="отправить". После нажатия на нее переменная $ok будет иметь значение "отправить". Если кнопка не нажата, то переменная не определена.
    Таким образом, выражение if (empty($ok)) означает буквально "если кнопка отправить не была нажата". Функция empty() возвращает true, если переменная не определена, содержит 0 или пустоту.

    Код:

    PHP - Код
    $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>



    В противном случае, т.е. если была нажата кнопка, идет обработка формы и отправка письма
    Код:

    PHP - Код
    }
    else
    {



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

    Если введен неправильный e-mail, то в переменную $error записывается ругательное сообщение.
    Код:
    PHP - Код
    if(!preg_match("/^([a-z,0-9])+@([a-z,0-9])+(.([a-z,0-9])+)+$/"$mailfrom))
        {
        
    $error "Не верно заполнено поле: <b>E-mail</b><br>";
        }



    Если поле "Вопрос" не заполнили, то к переменно $error добавляем еше одно ругательство:
    Код:
    PHP - Код
    if (empty($question))
        {
            
    $error .= "Не заполнено поле: <b>Ваш вопрос</b><br>
    "
    ;
        }



    Если переменная $error не пустая, то мы ее выводим на экран и немедленно прекращаем дальнейшую обработку с помощью exit
    Код:
    PHP - Код
    if ($error)
        {
            echo 
    $error;
            echo 
    "<br><a href="Java Scripthistory.go(-1)" class="text">Вернуться назад</a>";
            exit;
        }



    Ну а если таки $error осталась пустой и exit не сработал, то можно приступать к отправке письма, т.е. главной цели всего этого мероприятия...
    Сформируем тему и тело сообщения:
    PHP - Код
    $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, указанный в начале файла.
    Код:
    PHP - Код
    $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());



    Ну и самое приятное... Если письмо успешно отправлено, то выводим благодарственную надпись и предлагаем вернуться..
    Код:
    PHP - Код
    if ($sucess)
        {
            echo 
    "Спасибо. Ваш вопрос отправлен.<br><br>";
            echo 
    "<a href="Java Scripthistory.go(-1)" class="text">Вернуться назад</a>";
        }



    Стандартный конец..
    Код:
    Код
    }

    </body>
    </html>



    P.S. Как наверно понял читатель, нужно выделить и скопировать все зеленые блоки в один файл по порядку и запустить его на сервере
    Весь код является полностью проверенным и рабочим.
    Опубликовано на сайте: http://www.coders-library.ru
    Прямая ссылка: http://www.coders-library.ru/index.php?name=news&op=view&id=327