Отправка писем php mail. Простейшая форма отправки данных на почту при помощи HTML и PHP

Рад видеть вас на моем блоге сайт. Сегодня рассмотрим, зачем нужна Php функция Mail. Какой бы вы не создали интернет-проект на нем должна быть форма обратной связи, чтобы люди могли с вами общаться. Особенно это актуально для коммерческих проектов. Это сложная тема, о которой я уже говорил в статье « ». Рассмотрим, как использовать данную функцию для отправки сообщений.

Немного теории

Для отправки писем необходим SMTP-сервер. Он есть на всех качественных платных хостингах. Для приема понадобится POP-сервер. Необходимо понимать, что php не отправляет сообщение, он передает команды приложению sendmail, которое и занимается отправкой. Поэтому его нужно иметь. Если вы используете Денвер, то это приложение уже встроено. Все сообщения помещаются в директорию «tmp/!sendmail». Кстати, рекомендую вам, . Это особенно актуально, если вы занимаетесь сайтостроением.

Что это такое

Mail применяется для отправки сообщений при условии что будут выполняться некоторые правила. Самое главное - эта функция не подходит для пересылки большого числа писем. Потому что после каждой отправки она закрывает, а потом опять открывает соединение с почтовым сервером. Это приведет к перерасходу мощностей на хостинге.

Настройка функции происходит в конфигурационном файле php.ini. В нем прописывают путь к лог-файлам, задают значение порта и так далее.

Mail принимает пять аргументов из которых три - обязательные:

  • Адрес отправителя;
  • Тайтл письма;
  • Текст сообщения.

Например, напишем такие строки кода

Некоторые особенности

При работе возникает много нюансов. Они зависят от используемой платформы ОС и других настроек и параметров. Рассмотрим самые основные:

  • При отправке письма заголовок Form нужно задать через необязательный параметр «additional_headers». При его отсутствии может возникнуть ошибка при отправлении;
  • Заголовки разделите символами перевода на новую строку и каретки (\r\n);
  • Длина строки не более семидесяти знаков. Ее регулируйте (\r\n).

Что делать если функция не отправляет письма

Даже с учетом всех перечисленных выше моментов, mail может не работать. При этом на локальном сервере все отправляется как следует. Одной из причин почему так происходит - неправильная настройка функции на хостинге. Поэтому нужно обратиться к конфигурационному файлу php.ini, в котором посмотрите функцию «disable_functions».

Для проверки работоспособности напишите такой несложный код и разместите его в корне созданного интернет-проекта.

Если все работает правильно, то на экране браузера появится цифра один «1». Ее возвратит «print» после выполнения.

Важно! Если вы , то письма сохраняются в папке C:\openserver\userdata\temp\email. При условии, что его вы установили на локальный диск «С».

Отправка с вложением

Рассмотрим пример, как отсылать сообщения с прикрепленным файлом. Для этого используется функция sendMailAttachment(). Рассмотрим, как это работает на примере:

// прописываем путь к файлу, который нужно отправить $mailTo = "[email protected]" ; // адрес отправителя $from = "[email protected]" ; // от кого $subject = "Test file" ; // тема $message = "Текст с вложением" ; // контент письма $r = sendMailAttachment($mailTo , $from , $subject , $message , $file ) ; // отправка письма c вложением echo ($r ) ?Отправлено":" Ошибка. Не отправлено! "; //$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения //echo ($r)?Отправлено" : "Ошибка. Не отправлено!" ; ?>

Проблемы с кодировкой

Иногда сообщения приходят в виде вопросов «?» или непонятных символов. От того насколько правильно оно будет перекодировано, зависит прочтет ли его получатель. При стандартных способах отправки php не учитывает кодировку. На эту тему на моем блоге уже была статья «UTF-8 и ». Сам контент сообщения может быть любой кодировки. Вся сложность заключается в заголовке From. По стандарту они должны быть в US-ASCII. Есть две формы кодирования -BASE64 и Quoted-Printable. Первая - более универсальная и работает с UTF-8, поэтому используете ее. Например,

"Адрес куда отправлять" ; $from = "От кого" ; $subject = "Тема" ; $message = " Привет Текст " ; $headers = "Content-type: text/html; charset= UTF-8 \r \n " ; $headers .= "From: Любой текст <$from >\r \n " ; mail ($to , $subject , $message , $headers ) ; ?>

Привет Текст "; $headers = "Content-type: text/html; charset= UTF-8 \r\n"; $headers .= "From: Любой текст <$from>\r\n"; mail($to, $subject, $message, $headers); ?>

При таком варианте заголовки могут быть нечитаемые. Чтобы решить данную проблему напишите заголовок в таком виде:

$subject = "=?UTF-8?B?" . base64_encode ("Обратная связь" ) . "?=" ;

$subject = "=?UTF-8?B?".base64_encode("Обратная связь")."?=";

Важно! Используйте исключительно UTF-8.

Остались еще вопросы? Рекомендую вам ознакомиться с хорошим курсом Русакова «Создание движка на PHP и MySQL 2.0 ». Изучив его вы не только разберетесь с веб-программированием, но и научитесь писать собственный движок сайта.


Вывод

Итак, работа функции mail, не очень сложна. Мы рассмотрели самые распространенные ошибки, которые могут возникнуть при ее реализации. Хочется порекомендовать вам посетить портал для программистов GeekBrains.ru , где вы наверняка найдете что-то интересное. Подписывайтесь на мою группу ВКонтакте, там тоже вы найдете много полезной информации.

Содержит только текст (малый вес сообщения)

$name = "Пётр Петрович"; // необязательная переменная в качестве примера вставки в сообщение

$subject = "Тема сообщения"; //тема сообщения
$message = "Здравствуйте,".$name."!\n
Просто спросить как дела!\n
С уважением, Иван Иванович";//содержание сообщения
mail($email, $subject, $message, "From: [email protected]\nReply-To: [email protected]\nContent-type:text/plain; Charset=utf-8\r\n"); //отправляем сообщение
?>

2. Отправка письма mail php Тип text/html

Могут содержать графические html-элементы, сслыки и тп.
Больше объём передаваемой информации

// отправка нескольким адресатам
$to = "[email protected]" . ", "; // кому отправляем
$to .= "[email protected]" . ", "; // Внимание! Так пишем второй и тд адреса
// не забываем запятую. Даже в последнем контакте лишней не будет
// Для начинающих! $to .= точка в этом случае для Дописывания в переменную

// устанавливаем тип сообщения Content-type, если хотим
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=utf-8 \r\n";

// дополнительные данные
$headers .= "From: yournick \r\n"; // от кого
$headers .= "Cc: [email protected]" . "\r\n"; // копия сообщения на этот адрес
$headers .= "Bcc: [email protected]\r\n"; // скрытая копия сообщения на этот
mail($to, $subject, $message, $headers);
?>

3. Как использовать в письме CSS?

Тут я хочу сразу немного огорчить Вас - CSS в привычном для Вас виде не стоит использовать. Mail, Yandex, Google, Outlook - выкидывают стили из писем. Однако, есть выход.

Выполним несколько условий:
1) Надеюсь не нужно пояснять, что используем Content-type: text/html

2) Вспоминаем, что такое table вёрстска. Теперь все стили вписываем только в неё. Можно также вспомнить center , font .




От кого: Иванов Иван Иванович
Адрес: [email protected]
Сообщение: Смотрим и радуемся

С div то же самое

Нужный Вам текст

3) В примере выше с отправкой письма приводилась данная строка. Так вот её не забываем

$headers = "MIME-Version: 1.0" . "\r\n";

4) Используем HTML 3.2 . Вставляем в начало html письма.


5) В качестве background - можно цвет. Хотите фон-изображение - тогда делайте весь текст и фон изображением. Как вариант: можно указать background-image для body.

6) У единственной в ячейке картинки в Gmail появляется 3px отступ снизу, чтобы избежать этого указываем ей

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

Могут помочь и следующие RFC-документы: RFC 1896 , RFC 2045 , RFC 2046 , RFC 2047 , RFC 2048 и RFC 2049 .

mail() возвращает TRUE , если почта была успешно принята для доставки, FALSE в ином случае.

Важно! Обратите внимание, успешно принято для доставки не подразумевает, что почта фактически достигнет предназначенного назначения.

Пример 1. Отправка почты.

mail("[email protected]", "My Subject", "Line 1\nLine 2\nLine 3");

Если передаётся четвёртый строковой аргумент, эта строка вставляется в конце шапки/header. Обычно это используют для добавления дополнительных шапок. Несколько дополнительных шапок разделяются символами carriage return и newline.

Примечание: вы обязаны использовать \r\n для разделения шапок, хотя некоторые почтовые агенты Unix могут работать с одиночными символами newline (\n).

Параметр additional_parameters можно использовать для передачи дополнительных параметров программе, сконфигурированной для использования при отправке почты установкой конфигурации sendmail_path . Например, это можно применять для установки адреса отправителя при использовании sendmail. Вам может понадобиться добавить пользователя под которым работает ваш web-сервер, в вашу sendmail-конфигурацию для предотвращения добавления шапки "X-Warning!" к сообщению, когда вы устанавливаете отправителя с использованием этого метода.

Примечание: этот пятый параметр был введён в PHP 4.0.5.

Вы можете также использовать простую технику построения строк для создания сложных email-сообщений.

"; /* Для отправки HTML-почты вы можете установить шапку Content-type. */ $headers= "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; /* дополнительные шапки */ $headers .= "From: Birthday Reminder \r\n"; $headers .= "Cc: [email protected]\r\n"; $headers .= "Bcc: [email protected]\r\n"; /* и теперь отправим из */ mail($to, $subject, $message, $headers);

Примечание: убедитесь, что у вас нет символов newline в to или в subject , иначе почта может не отправиться корректно.

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

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

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

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

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

Это очень важный элемент формы. В нем мы указываем каким способом будут передаваться данные и какому файлу. В данном случае все передачется методом POST файлу send.php. Программа в этом файле соответственно должна принять данные, они будут содержаться в post массиве, и отправить их на указанный email адрес.

Вернемся к форме. Вторая строка будет содержать поле для ввода ФИО. Имеет следующий код:

Тип формы text, то есть пользователь сможет ввести или скопировать сюда текст с клавиатуры. Под параметром name содержится название формы. В данном случае это fio, именно под таким именем будет передаваться все, что пользователь введен в данноу поле. Параметр placeholder указывает на то, что будет записано в этом поле в виде пояснения.

Следующая строка:

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

Следующей строкой будет кнопка "отправить":

И последней строкой в форме будет тэг

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





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





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Например, нужно отправить данные на email владельца сайта или менеджера [email protected].

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

mail("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n");

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

if (mail("[email protected]", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{
echo "сообщение успешно отправлено";
} else {
}

Таким образом программный код файла 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("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))
{ echo "сообщение успешно отправлено";
} else {
echo "при отправке сообщения возникли ошибки";
}?>

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

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

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

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

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



Форма заявки с сайта


//проверяем, существуют ли переменные в массиве POST
if(!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("[email protected]", "Заявка с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n")){
echo "Сообщение успешно отправлено";
} else {
echo "При отправке сообщения возникли ошибки";
}
}
?>

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

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

Частые ошибки, возникающие при отправке PHP формы с сайта

Первая, наверное самая популярная ошибка, это когда вы видите пустую белую страницу без сообщений. Это означает, что вы допустили ошибку в коде страницы. Вам нужно включить отображение всех ошибок в PHP и тогда вы увидите, где допущена ошибка. Добавьте в код:

ini_set("display_errors","On");
error_reporting("E_ALL");

Файл send.php должен запускаться только на сервере, иначе код просто не будет работать. Желательно, чтобы это был не локальный сервер, так как он не всегда настроен на отправку данных на внешний почтовый сервер. Если вы запустите код не на сервере, то вам отобразиться код PHP прямо на странице.

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

Еще одна частая ошибка, когда появляется оповещение "Сообщение успешно отправлено", а письмо не приходит на почту. В этом случае нужно внимательно проверить строку:

if (mail("[email protected]", "Заказ с сайта", "ФИО:".$fio.". E-mail: ".$email ,"From: [email protected] \r\n"))

Вместо [email protected] должен быть email адрес на который нужно отправить письмо, а вместо [email protected] должен быть существующий email данного сайта. Например для сайта сайт это будет . Только в этом случае письмо с данными из формы будет отправлено.

Знакомство с php-функцией mail() и простейший пример её использования для отправки писем по электронной почте. Что лучше или Sendmail vs mail.

PHP-функция mail() позволяет вам отправлять письма на указанный адрес электронной почты.

Синтаксис :

Bool mail (string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]]);

Параметры :

  • to — адрес электронной почты получателя письма в соответствии с форматом RFC 2822. Например :
  • subject — тема отправляемого письма в соответствии с форматом RFC 2047
  • message — содержание отправляемого письма. Каждая строка должна быть не длиннее 70 символов и заканчиваться символом новой строки (\n).

    Только для Windows : Когда PHP обращается к SMTP серверу напрямую, точка в начале строки удаляется. Для борьбы с этим нюансом, следует использовать замену на двойную точку в начале строки.

    $message = str_replace ("\n.", "\n..", $message);

  • additional_headers (не обязательно) – строка, которая будет добавлена после заголовков письма. Обычно используется для добавления дополнительных заголовков (From, Cc и Bcc). Строки должны быть разделены CRLF (\r\n).
  • additional_parameters (не обязательно) – дополнительные параметры, используемые программой назначенной для отправки писем.

Возвращает : TRUE если письмо отправлено успешно или FALSE если нет. Следует отметить, если письмо успешно поставлено в очередь на отправление, это не значит, что оно достигнет адресата.

Теперь, когда мы разобрались в теории, можно приступить к практике. Но для начала я хочу привести парочку полезных функций, которые позволят в значительной степени облегчить нашу задачу.

Пример : php-функция MIME base64 кодирования, с учетом кодировки

Function mime_base64($string, $charset="windows-1251") { return "=?" . $charset . "?B?" . base64_encode(trim($string)) . "?="; }

Одна из проблем, возникающих при отправке почты, заключается в формировании заголовка письма. В частности, заголовок, имена отправителя и получателя, написанные кириллицей могут быть распознаны почтовым клиентом получателя в искаженном виде. Для того чтобы избежать этой проблемы, можно воспользоваться MIME base64 кодированием, преобразующее последовательность байт в последовательность печатных ASCII символов.

Function is_email($string) { return preg_match("/^()+([\.a-zA-Z0-9_-])*@()+(\.+)*\.({2,6})$/", $string); }

С эти тоже разобрались. А теперь то, ради чего и писалась данная заметка.

Пример : отправка писем с помощью php-функции mail()

$charset = "windows-1251"; $from = mime_base64("Имя отправитель", $charset) . " "; $to = mime_base64("Имя получитель", $charset) . " "; $subject = mime_base64("Тема отправляемого письма", $charset); $message = "Содержание отправляемого письма."; $message = wordwrap($message, 70); $headers = "From: " . $from . "\r\n" . "Reply-To: " . $from . "\r\n" . "X-Mailer: PHP/" . phpversion(). "\r\n" . "MIME-Version: 1.0" . "\r\n" . "Content-type: text/plain; charset="" . $charset . """; if (mail($to, $subject, $message, $headers)) { echo "

Письмо отправлено.

"; } else { echo "

Произошла ошибка.

"; }

Думаю, что комментарии излишни, так как я и без того уделил достаточно много внимание различным деталям. Варианты набора RFC-заголовков могут отличаться, но на локальном сервере я получил следующее:

X-Sendmail-Cmdline: sendmail.pl -t -i To: =?windows-1251?B?yOz/IO/u6/P36PLl6/w=?= Subject: =?windows-1251?B?0uXs4CDu8u/w4OLr/+Xs7uPuIO/o8fzs4A==?= From: =?windows-1251?B?yOz/IO7y7/Dg4ujy5ev8?= Reply-To: =?windows-1251?B?yOz/IO7y7/Dg4ujy5ev8?= X-Mailer: PHP/5.3.3 MIME-Version: 1.0 Content-type: text/plain; charset="windows-1251"

Sendmail vs php mail()

Напоследок небольшой ликбез. Sendmail является одним из почтовых серверов (MTA), в то время как php-функция mail() просто реализует процесс отправки писем через SMTP соединение. Понятно, что использование php-функции является удобным, но далеко не оптимальным решением. Обычно mail() используется в тех случаях, когда речь не заходит о масштабных рассылках.