Как сделать чтобы данные отправлялись на почту


В очередной раз встретил на форуме сообщение: “Скажите, как сделать скрипт на php для отправки на мыло через сайт. Например, я ввожу на сайте в поля нужный текст и нажимаю “Отправить”. После чего текст отправляется кому-нибудь на e-mail. Очень нужно!“. Быстро набросал простенький скрипт отправки сообщений на e-mail. Когда в следующий раз услышу такой вопрос - буду давать ссылку на эту страницу.

Для отправки почтового сообщения создадим HTML-форму, состоящую из трех текстовых полей для имени автора name, его e-mail адреса email, темы сообщения subject и текстовой области message для ввода содержимого письма.

Письмо будем отправлять по адресу администратора сайта $admin = ‘’

<?php
session_start();
$admin = '';
if ( как сделать чтобы данные отправлялись на почту isset( $_POST['sendMail'] ) почту ) {
  $name  = substr( $_POST['name'], 0, 64 );
  $email   = substr( $_POST['email'], 0, 64 );
  $subject = substr( $_POST['subject'], 0, 64 );
  $message = substr( $_POST['message'], 0, 250 );
 
  $error = '';
  if ( empty( $name ) ) $error = $error.'<li>Не заполнено поле "Имя"</li>';
  if ( empty( $email ) ) $error = $error.'<li>Не заполнено поле "E-mail"</li>';
  if ( empty( $subject ) ) $error = $error.'<li>Не заполнено поле "Тема"</li>';
  if ( empty( $message ) ) $error = $error.'<li>Не заполнено поле "Сообщение"</li>';
  if (!empty( $email ) and!preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
    $error = $error.'<li>поле "E-mail" должно соответствовать формату </li>';
  if (!empty( $error ) ) {
    $_SESSION['sendMailForm']['error']   = '<p>При заполнении формы были допущены ошибки:</p><ul>'.$error.'</ul>';
    $_SESSION['sendMailForm']['name']    = $name;
    $_SESSION['sendMailForm']['email']   = $email;
    $_SESSION['sendMailForm']['subject'] = $subject;
    $_SESSION['sendMailForm']['message'] = $message;
    header( 'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
 
  $body = "АВТОР:\r\n".$name."\r\n\r\n";
  $body.= "E-MAIL:\r\n".$email."\r\n\r\n";
  $body.= "ТЕМА:\r\n".$subject."\r\n\r\n";
  $body.= "СООБЩЕНИЕ:\r\n".$message;
  $body = quoted_printable_encode( $body );
  $theme   = '=?windows-1251?B?'.base64_encode('Заполнена форма на сайте').'?=';
  $headers = "From: ".$_SERVER['SERVER_NAME']." <".$email.">\r\n";
  $headers = $headers."Return-path: <".$email.">\r\n";
  $headers = $headers."Content-type: text/plain; charset=\"windows-1251\"\r\n";
  $headers = $headers."Content-Transfer-Encoding: quoted-printable\r\n\r\n";
 
  if ( mail($admin, $theme, $body, $headers) )
    $_SESSION['success'] = true;
  else
    $_SESSION['success'] = false;
  header( 'Location: '.$_SERVER['PHP_SELF'] );
  die();
}
 
function quoted_printable_encode ( $string ) {
   // rule #2, #3 (leaves space and tab characters in tact)
   $string = preg_replace_callback (
   '/[^\x21-\x3C\x3E-\x7E\x09\x20]/',
   'quoted_printable_encode_character',
   $string
   );
   $newline = "=\r\n"; // '=' + CRLF (rule #4)
   // make sure the splitting of lines does not interfere with escaped characters
   // (chunk_split fails here)
   $string = preg_replace ( '/(.{73}[^=]{0,3})/', ''.$newline, $string);
   return $string;
}
function quoted_printable_encode_character ( $matches ) {
   $character = $matches[0];
   return sprintf ( '=%02x', ord ( $character ) );
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Отправить письмо</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<?php
if ( isset( $_SESSION['success'] ) ) {
  if ( $_SESSION['success'] )
    echo '<p>Письмо успешно отправлено</p>';
  else
    echo '<p>Ошибка при отправке письма</p>';
  unset( $_SESSION['success'] );
}
if ( isset( $_SESSION['sendMailForm'] ) ) {
  echo $_SESSION['sendMailForm']['error'];
  $name    = htmlspecialchars ( $_SESSION['sendMailForm']['name'] );
  $email   = htmlspecialchars ( $_SESSION['sendMailForm']['email'] );
  $subject = htmlspecialchars ( $_SESSION['sendMailForm']['subject'] );
  $message = htmlspecialchars ( $_SESSION['sendMailForm']['message'] );
  unset( $_SESSION['sendMailForm'] );
} else {
  $name    = '';
  $email   = '';
  $subject = '';
  $message = '';
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="POST">
<table>
<tr><td>Имя:</td><td><input type="text" name="name" maxlength="64" value="<?php echo $name?>" /></td></tr>
<tr><td>E-mail:</td><td><input type="text" name="email" maxlength="64" value="<?php echo $email?>" /></td></tr>
<tr><td>Тема:</td><td><input type="text" name="subject" maxlength="64" value="<?php echo $subject?>" /></td></tr>
<tr><td>Сообщение:</td><td><textarea name="message" rows="5" cols="30"><?php echo $message?></textarea></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" name="sendMail" value="Отправить" /></td></tr>
</table>
</form>
</body>
</html>

Чтобы понять, зачем здесь сессия и редирект после вызова функции mail(), надо прочитать статью Обработка ошибочного заполнения формы.

Попробуйте убрать редирект и поработать со скриптом. Во-первых, если после отправки формы нажать Refresh, то браузер выдаст сообщение о том, что страницу обновить невозможно без повторной отсылки данных. Во-вторых, если после отправки сообщения уйти на другую страницу, то при нажатии на кнопку Back (т.е. при попытке вернуться на POST-страницу) опять будет выведено сообщение о необходимости повторной отсылки данных. Мало того, что это совершенно нелогично и неудобно с точки зрения пользователя (он ведь уже отправил данные!), так ещё и если он в этот момент нажмёт “OK”, то данные формы будут отправлены повторно. Соответственно, и письмо будет отправлено еще раз.

Проблем этих можно избежать, если после обработки POST-запроса сразу же делать GET-редирект.

Теперь по поводу сессии. В случае ошибочного заполнения пользователем формы, хорошим тоном считается показать ему эту же форму, заполненною введёнными данными (чтобы пользователю не пришлось заполнять всё заново) и снабжённую сообщением об ошибке. При этом ошибочно введённые данные передаются через механизм сессий.

Ссылки по теме:



Рекомендуем посмотреть ещё:


Закрыть ... [X]

Отправка данных формы на почту, как сделать? пожалуйста помогите. Форум Как сделать качели из дерева чертеж

Как сделать чтобы данные отправлялись на почту Как сделать чтобы данные отправлялись на почту Как сделать чтобы данные отправлялись на почту Как сделать чтобы данные отправлялись на почту Как сделать чтобы данные отправлялись на почту Как сделать чтобы данные отправлялись на почту Как сделать чтобы данные отправлялись на почту Как сделать чтобы данные отправлялись на почту