Функция mail() — самый простой способ отправить письмо с помощью PHP

HTML / PHP·
02.04.2016

Сегодня на курсы программирования в Москве все чаще.
Одной из самых востребованных функций на сайте является форма заявки или заказа, данные из которой отправляются на почту владельцу сайта. Как правило такие формы являются простыми и состоят из двух трех полей для ввода данных. Как же создать такую форму заказа? Здесь потребуется использование языка разметки HTML и языка программирования PHP.

Язык разметки HTML сам по себе несложен, нужно всего лишь разобраться в том как и где ставить те или иные теги. С языком программирования PHP все немного сложнее.

Для программиста создать такую форму не составит труда, а вот HTML верстальщику может показаться сложным некоторые действия.

Создаем форму отправки данных в html

На этом этапе нужно создать файл form.php, в него добавить html код формы. Подробности о каждом элементе формы читайте в статье Как сделать форму в HTML для сайта.

Первая строка будет следующей

Теперь соберем все вместе.

Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:

Создаем файл, принимающий данные из HTML формы

Это будет файл с именем send.php

В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:

$fio = $_POST['fio'];$email = $_POST['email'];

Перед названиями переменных в php ставится знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method=»post». Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров — функций php.

Первая функция преобразует все символы, которые пользователь попытается добавить в форму:

$fio = htmlspecialchars($fio);$email = htmlspecialchars($email);

При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ «<" в '<'. Также он поступить с другими символами, встречающимися в html коде.

Вторая функция декодирует url, если пользователь попытается его добавить в форму.

$fio = urldecode($fio);$email = urldecode($email);

Третей функцией мы удалим пробелы с начала и конца строки, если таковые имеются:

$fio = trim($fio);$email = trim($email);

Существуют и другие функции, позволяющие отфильтровать переменные php. Их использование зависит от того , насколько вы опасаетесь того, что злоумышленник попытается добавить программный код в данную форму отправки данных на почту html.

Проверка данных, передаваемых от HTML формы в файл PHP

Для того, чтобы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:

echo $fio;echo "";echo $email;

Вторая строка здесь нужна для того, чтобы разделить вывод переменных php на разные строки.

Отправляем полученные данные из формы HTML на почту при помощи PHP

Для отправки данных на почту нужно воспользоваться функцией mail в PHP.

mail(«на какой адрес отправить», «тема письма», «Сообщение (тело письма)»,»From: с какого email отправляется письмо rn»);

Например, нужно отправить данные на email владельца сайта или менеджера example@mail.ru.

Тема письма должна быть понятной, а сообщение письма должно содержать то, что указал пользователь в HTML форме.

mail("example@mail.ru", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: example2@mail.ru rn");

Необходимо добавить условие, которе проверит отправилась ли форма при помощи PHP на указанные адрес электронной почты.

if (mail("example@mail.ru", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: example2@mail.ru rn")) {     echo "сообщение успешно отправлено"; } else {     echo "при отправке сообщения возникли ошибки"; }

Таким образом программный код файла send.php, который отправит данные HTML формы на почту будет выглядеть следующим образом:

$fio = $_POST['fio'];$email = $_POST['email'];$fio = htmlspecialchars($fio);$email = htmlspecialchars($email);$fio = urldecode($fio);$email = urldecode($email);$fio = trim($fio);$email = trim($email);//echo $fio;//echo "";//echo $email;if (mail("example@mail.ru", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: example2@mail.ru rn")) {     echo "сообщение успешно отправлено"; } else {     echo "при отправке сообщения возникли ошибки";}

Три строки для проверки, передаются ли данные в файл закомментированы. При необходимости их можно удалить, так как они нужны были только для отладки.

Помещаем HTML и PHP код отправки формы в один файл

В комментариях к этой статье многие задают вопрос о том, как сделать, чтобы и HTML форма и PHP код отправки данных на почту находились в одном файле, а не двух. 

Для реализации такой работы нужно поместить HTML код формы в файл send.php и добавить условие, которое будет проверять наличие переменных в массиве POST (этот массив передается из формы). То есть, если переменные в массиве не существуют, то нужно показать пользователю форму. Иначе нужно принять данные из массива и отправить их адресату.

Давайте посмотрим как изменить PHP код в файле send.php:

Форма заявки с сайта//проверяем, существуют ли переменные в массиве POSTif(!isset($_POST['fio']) and !isset($_POST['email'])){  } else { //показываем форму $fio = $_POST['fio']; $email = $_POST['email']; $fio = htmlspecialchars($fio); $email = htmlspecialchars($email); $fio = urldecode($fio); $email = urldecode($email); $fio = trim($fio); $email = trim($email); if (mail("example@mail.ru", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: example2@mail.ru rn")){  echo "Сообщение успешно отправлено";  } else {  echo "При отправке сообщения возникли ошибки"; }}

ествование переменной в POST массиве мы проверяем PHP функцией isset(). Восклицательный знак перед этой функцией в условии означает отрицание. То есть, если переменной не существует, то нужно показать нашу форму. Если бы я не поставил восклицательный знак, то условие дословно означало бы — «если существует, то показать форму». А это неправильно в нашем случае. Естественно, что вы можете переименовать его в index.php. Если будуту переименовывать файл, то не забудьте переименовать название файла и в строке  Вам нужно вставить ключ сайта вместо текста в соответствующей строке.Программный код send.php:

 $recaptcha = $_POST['g-recaptcha-response'];   if(!empty($recaptcha)) {     $recaptcha = $_REQUEST['g-recaptcha-response'];     $secret = 'секретный ключ';     $url = "https://www.google.com/recaptcha/api/siteverify?secret=".$secret ."&response=".$recaptcha."&remoteip=".$_SERVER['REMOTE_ADDR'];     $curl = curl_init();     curl_setopt($curl, CURLOPT_URL, $url);     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);     curl_setopt($curl, CURLOPT_TIMEOUT, 10);     curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0");     $curlData = curl_exec($curl);     curl_close($curl);      $curlData = json_decode($curlData, true);     if($curlData['success']) {         $fio = $_POST['fio'];         $email = $_POST['email'];         $message = $_POST['message'];         $fio = htmlspecialchars($fio);         $email = htmlspecialchars($email);         $message = htmlspecialchars($message);         $fio = urldecode($fio);         $email = urldecode($email);         $message = urldecode($message);         $fio = trim($fio);         $email = trim($email);         $message  = trim($message);         if (mail("kuda@otpravit.ru", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email." Сообщение: ".$message ,"From: info@satename.ru rn")){           echo "Сообщение успешно отправлено";          } else {          echo "При отправке сообщения возникли ошибки";         }     } else {         echo "Подтвердите, что вы не робот и попробуйте еще раз";     } } else {     echo "поставьте галочку в поле 'Я не робот' для отправки сообщения"; } 

Также нужно вписать секретный ключ.

Поделиться в соц. сетях:

Работая над проектом, мне пришлось создать специфичную «анкету соискателя» в котором надо была отправлять всю анкету на указные за ране e-mail адрес, и я сразу же вспомнил про PHP функцию mail().

bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]]) 

Обязательные параметры:

  • E-mail получателя
  • Заголовок письма
  • Текст письма

Необязательные параметры:

  • Дополнительные заголовки письма
  • Дополнительные параметры командной строки

Возвращаемое значение:

  • true, если письмо было принято к доставке
  • false, в противном случае.
Простейший пример
  mail("E-mail получателя", "Загаловок", "Текст письма n 1-ая строчка n 2-ая строчка n 3-ая строчка");   
Перейдем к более сложному примеру
  $to  = ", " ;  $to .= "mail2@example.com>";   $subject = "Заголовок письма";   $message = ' 

Текст письма


1-ая строчка
2-ая строчка
'; $headers = "Content-type: text/html; charset=windows-1251 rn"; $headers .= "From: От кого письмо $headers .= "Reply-To: reply-to@example.comrn"; mail($to, $subject, $message, $headers);

В начале мы определяем кому адресовано письмо, за это отвечает переменная &to, если же получателей несколько человек, то записываем через запятую адреса эл. почты. Переменные $subject и $message, не буду описывать, это и так понятно. В нашем примере переменная $headers состоит из 3-строк:

  • В первой строчке ми определяем ты отправляемого письма-HTML и кодировку windows-1251.
  • В 2-ом мы указываем от кого пришло письмо.
  • В 3-ем указываем e-mail адрес, для ответа на письмо.
А теперь самое интересное отправка письма c вложением (attachment)
$subject = "тема письма";   $message ="Текст сообщения";  // текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.  $filename = "file.doc"; // название файла  $filepath = "files/file.doc"; // месторасположение файла   //исьмо с вложением состоит из нескольких частей, которые разделяются разделителем  $boundary = "--".md5(uniqid(time()));  // генерируем разделитель  $mailheaders = "MIME-Version: 1.0;rn";  $mailheaders .="Content-Type: multipart/mixed; boundary="$boundary"rn";  // разделитель указывается в заголовке в параметре boundary   $mailheaders .= "From: $user_email rn";  $mailheaders .= "Reply-To: $user_emailrn";   $multipart = "--$boundaryrn";  $multipart .= "Content-Type: text/html; charset=windows-1251rn"; $multipart .= "Content-Transfer-Encoding: base64rn";     $multipart .= rn; $multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message))); // первая часть само сообщение   // Закачиваем файл  $fp = fopen($filepath,"r");  if (!$fp)  {  print "Не удается открыть файл22";  exit();  }  $file = fread($fp, filesize($filepath));  fclose($fp);  // чтение файла   $message_part = "rn--$boundaryrn";  $message_part .= "Content-Type: application/octet-stream; name="$filename"rn";   $message_part .= "Content-Transfer-Encoding: base64rn";  $message_part .= "Content-Disposition: attachment; filename="$filename"rn";  $message_part .= rn; $message_part .= chunk_split(base64_encode($file)); $message_part .= "rn--$boundary--rn"; // второй частью прикрепляем файл, можно прикрепить два и более файла  $multipart .= $message_part;  mail($to,$subject,$multipart,$mailheaders); // отправляем письмо   //удаляем файлы через 60 сек. if (time_nanosleep(5, 0)) { unlink($filepath); } // удаление файла 
Подробности
Родительская категория: Программирование
Категория: PHP

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

Работающий php-скрипт для отправки письма с помощью функции mail()

Как обычно, сперва приведу код программы на php, а потом объясню: как и что работает.

        $headers ='From: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.' . "rn" .  'Reply-To: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.' . "rn" .  'X-Mailer: PHP/' . phpversion();  if (isset($_POST['to']) && isset($_POST['subject']) && isset($_POST['message']))  if (mail($_POST['to'], $_POST['subject'], $_POST['message'], $headers)) {  echo 'письмо было принято для передачи';  } else {  echo 'что-то пошло не так...';  }  

Форма для получения данных, которые нужно отправить по электронной почте

Первые 10 строк кода, приведённого выше — это HTML-форма, в которую вводим email, куда будем отправлять письмо, тему письма и собственно сам текст письма. Это поля с именами tosubject и message.

Ниже идёт php-код, обрабатывающий полученные данные из этой формы и, если все поля заполнены, пытается отправить письмо на указанный адрес электронной почты.

PHP функция mail()

Перед тем, как рассматривать код, разберёмся вкратце с php-функций mail(), которая присутствует во всех версиях php и имеет следующий формат:

mail ( string $to , string $subject , string $message [, mixed $additional_headers [, string $additional_parameters ]] ) : bool
  • в первой строковой переменной $to должен содержаться получатель или список получателей письма в формате, описанном в RFC 2822, например,
    • Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
    • Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра., Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
    • User <Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.>
    • User <Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.>, Another User <Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.>
  • во второй строковой переменной $subject может быть указана тема письма. (Тема должна соответствовать RFC 2047, но не будем углубляться.)
  • в третьей строковой переменной $message может находиться тело письма (собственно сообщение). Каждая строка должна быть отделена символом CRLF (rn). Строки не должны быть длиннее 70 символов.
  • в четвертой переменной $additional_headers могут находиться дополнительные заголовки, влияющие на то, как к этому письму отнесётся почтовый сервер получателя и его программа, которой он будет читать это сообщение. Обычно используется для добавления дополнительных заголовков (From, Cc и Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (rn). Если в эту переменную передан массив, то его ключи будут именами заголовка, а значения значениями. Так как последнее время спамеры в конец расшалились, то заголовок From стал обязательным (хотя, это конечно не спасает от спама — в это поле можно подставить абсолютно любой адрес).

Это если вкратце.

Стоит ещё обратить внимание на то, какие значения возвращает функция mail(): возвращает TRUE, если письмо было принято для передачи, иначе FALSE. Так можно отслеживать, что что-то пошло не так при попытке отправить сообщение на электронную почту.

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

Вернёмся к нашему коду. В строчках 13..14 в переменную $headers мы как раз записываем три заголовка:

  • From — адрес отправителя (можно подставить какое угодно мыло, но лучше своё) =)
  • Reply-To — адрес, который подставится почтовой программой при попытке получателя ответить на это сообщение.
  • X-Mailer — поможет для того, чтобы отследить, кто (какая программа) отправила письмо. Бывает полезно для отлова и отстрела спамеров.

Отправка письма функцией mail() с предварительной проверкой полей перед отправкой

В 16-й строке проверяем, что все поля заполнены. Более полную проверку на соответствие всем требованиям RFM всех заголовков пока писать лень. Кому интересно, могут почитать про валидацию электронной почты (email) из данных формы на стороне сервера с помощью php в → этой статье.

В 17-й строке запускаем функцию mail() и… письмо полетело.

  • если полёт нормальный, в 18-й строке выводим зелёное сообщение о том, что всё хорошо;
  • если при попытке передать письмо возникли проблемы: функция mail() вернула значение FALSE, сообщаем об этом.

Резюме

Таким образом можно достаточно легко и быстро отправлять сообщения с помощью php-функции mail(), подписываясь Санта Клаусом, Кукусклановцем или Биллом Гейтсом. Но, надеюсь, что прочитав эту статью, никто не решил стать ещё одним рассыльным почтового спама. Для этого нужно знать немного больше. 😉

Но этих сведений будет достаточно, чтобы отправить письмо с сайта пользователю со ссылкой подтверждения регистрации. Что и требовалось. =D

Заберите ссылку на статью к себе, чтобы потом легко её найти 😉

Выберите, то, чем пользуетесь чаще всего:

Спасибо за внимание, оставайтесь на связи! Ниже ссылка на форум и обсуждение ; )

Обсудить эту статью

Войдите, чтобы комментировать

Тема на форуме: Функция mail() — самый простой способ отправить письмо с помощью PHP
Подробнее…

Обсудить эту статью

INFO: Вы отправляете сообщение как ‘Гость’
  • Вы здесь:  
  • Главная
  • Программирование
  • PHP
  • Функция mail() — самый простой способ отправить письмо с помощью PHP
Ссылка на основную публикацию