Php mail sendmail отправляет plain text html. Отправка почты
В последние полгода я рьяно взялся за изучение PHP . Как-то давно я скачал себе книжку и читал ее в свободное время. Знаний от этой книги получил ровно ноль. Сейчас в течение полугода я делаю сайт автомобильных объявлений, практически на чистом PHP .
Сегодня решился на написание скрипта, отвечающего за отправку e-mail сообщений с сайта. Оказывается, что в PHP – это делается очень просто.
Как отправляются письма через PHP ?
Для начала хотелось бы пояснить, что PHP не способен отсылать письма самостоятельно. В PHP есть функция, которая работает с почтовыми серверами.
Большинство современных платных хостингов, даже самых дешевых, имеют в своем наборе такой сервер. Чаще всего это sendmail . Вам только остается отослать запрос на отправку и sendmail это сделает.
Еще бы хостинги делали бы бесплатно продвижение сайтов , было бы вообще красота.
PHP -код отправки email`ов
За отправку e-mail в PHP
отвечает всего одна функция mail();
, которая имеет синтаксис:
Mail (куда слать, тема сообщений, сообщение, доп. информация);
Лучшим объяснением считается пример, поэтому чтобы избежать лишней воды и сразу объяснить все как есть, пример:
$email = "[email protected]";
$subject = "Тема письма";
$message = "Поздравляем, Вы только что получили письмо.\n
Это письмо отправлено средствами PHP";
$headers = "From: adminwa.ru
А теперь немного комментариев к приведенному куску кода.
В $email нужно указать адрес получателя вашего сообщения, если их несколько, то через запятую. Только учтите, что каждый, кто получил ваше письмо увидит всех получателей.
$subject должен быть не более 255 символов. Это не ограничение PHP , а стандарт электронных писем.
Переносы строки в $subject и $message осуществляются специальным символом(выражением) – \n
В $headers можно описать дополнительные параметры From – от кого мейл, Content-type – формат письма (можно указать text/plain – обычный текст или text/html – html-разметка), charset – кодировка письма и несколько других.
Все строки в $headers должны быть отделены \r\n.
Вот в принципе и все хитрости. Есть еще конечно несколько дополнительных параметров, как дополнительный 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. Например
:
- [email protected]
- [email protected], [email protected]
- Имя пользователя < [email protected]>
- Имя пользователя < [email protected]> , Имя ещё одного пользователя < [email protected]>
- 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) . " Письмо отправлено. Произошла ошибка.
Думаю, что комментарии излишни, так как я и без того уделил достаточно много внимание различным деталям. Варианты набора RFC-заголовков могут отличаться, но на локальном сервере я получил следующее:
X-Sendmail-Cmdline: sendmail.pl -t -i
To: =?windows-1251?B?yOz/IO/u6/P36PLl6/w=?=
Sendmail vs php mail()
Напоследок небольшой ликбез. Sendmail является одним из почтовых серверов (MTA), в то время как php-функция mail() просто реализует процесс отправки писем через SMTP соединение. Понятно, что использование php-функции является удобным, но далеко не оптимальным решением. Обычно mail() используется в тех случаях, когда речь не заходит о масштабных рассылках.
Рад видеть вас на моем блоге сайт. Сегодня рассмотрим, зачем нужна Php функция Mail. Какой бы вы не создали интернет-проект на нем должна быть форма обратной связи, чтобы люди могли с вами общаться. Особенно это актуально для коммерческих проектов. Это сложная тема, о которой я уже говорил в статье « ». Рассмотрим, как использовать данную функцию для отправки сообщений.
Немного теории
Для отправки писем необходим SMTP-сервер. Он есть на всех качественных платных хостингах. Для приема понадобится POP-сервер. Необходимо понимать, что php не отправляет сообщение, он передает команды приложению sendmail, которое и занимается отправкой. Поэтому его нужно иметь. Если вы используете Денвер, то это приложение уже встроено. Все сообщения помещаются в директорию «tmp/!sendmail». Кстати, рекомендую вам, . Это особенно актуально, если вы занимаетесь сайтостроением.
Что это такое
Mail применяется для отправки сообщений при условии что будут выполняться некоторые правила. Самое главное - эта функция не подходит для пересылки большого числа писем. Потому что после каждой отправки она закрывает, а потом опять открывает соединение с почтовым сервером. Это приведет к перерасходу мощностей на хостинге.
Настройка функции происходит в конфигурационном файле php.ini. В нем прописывают путь к лог-файлам, задают значение порта и так далее.
Mail принимает пять аргументов из которых три - обязательные:
- Адрес отправителя;
- Тайтл письма;
- Текст сообщения.
Например, напишем такие строки кода
Некоторые особенности
При работе возникает много нюансов. Они зависят от используемой платформы ОС и других настроек и параметров. Рассмотрим самые основные:
- При отправке письма заголовок Form нужно задать через необязательный параметр «additional_headers». При его отсутствии может возникнуть ошибка при отправлении;
- Заголовки разделите символами перевода на новую строку и каретки (\r\n);
- Длина строки не более семидесяти знаков. Ее регулируйте (\r\n).
Что делать если функция не отправляет письма
Даже с учетом всех перечисленных выше моментов, mail может не работать. При этом на локальном сервере все отправляется как следует. Одной из причин почему так происходит - неправильная настройка функции на хостинге. Поэтому нужно обратиться к конфигурационному файлу php.ini, в котором посмотрите функцию «disable_functions».
Для проверки работоспособности напишите такой несложный код и разместите его в корне созданного интернет-проекта.
print mail ("name@my.ru" , "header" , "text" ) ; ?> |
print mail("name@my.ru","header","text"); ?>
Если все работает правильно, то на экране браузера появится цифра один «1». Ее возвратит «print» после выполнения.
Важно! Если вы , то письма сохраняются в папке C:\openserver\userdata\temp\email. При условии, что его вы установили на локальный диск «С».
Отправка с вложением
Рассмотрим пример, как отсылать сообщения с прикрепленным файлом. Для этого используется функция sendMailAttachment(). Рассмотрим, как это работает на примере:
$file = "./files/test.txt" ; // прописываем путь к файлу, который нужно отправить $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)?Отправлено" : "Ошибка. Не отправлено!" ; ?> |
$file = "./files/test.txt"; // прописываем путь к файлу, который нужно отправить $mailTo = "test@gmail.com"; // адрес отправителя $from = "test@files.com"; // от кого $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, поэтому используете ее. Например,
$to
=
"Адрес куда отправлять"
;
$from
=
"От кого"
;
$subject
=
"Тема"
;
$message
=
"
|
$to = "Адрес куда отправлять"; $from = "От кого"; $subject = "Тема"; $message = "
При таком варианте заголовки могут быть нечитаемые. Чтобы решить данную проблему напишите заголовок в таком виде:
$subject = "=?UTF-8?B?" . base64_encode ("Обратная связь" ) . "?=" ; |
$subject = "=?UTF-8?B?".base64_encode("Обратная связь")."?=";
Важно! Используйте исключительно UTF-8.
Остались еще вопросы? Рекомендую вам ознакомиться с хорошим курсом Русакова «Создание движка на PHP и MySQL 2.0 ». Изучив его вы не только разберетесь с веб-программированием, но и научитесь писать собственный движок сайта.
Вывод
Итак, работа функции mail, не очень сложна. Мы рассмотрели самые распространенные ошибки, которые могут возникнуть при ее реализации. Хочется порекомендовать вам посетить портал для программистов GeekBrains.ru , где вы наверняка найдете что-то интересное. Подписывайтесь на мою группу ВКонтакте, там тоже вы найдете много полезной информации.
Одной из самых востребованных функций на сайте является форма заявки или заказа, данные из которой отправляются на почту владельцу сайта. Как правило такие формы являются простыми и состоят из двух трех полей для ввода данных. Как же создать такую форму заказа? Здесь потребуется использование языка разметки HTML и языка программирования PHP.
Язык разметки HTML сам по себе несложен, нужно всего лишь разобраться в том как и где ставить те или иные теги. С языком программирования PHP все немного сложнее.
Для программиста создать такую форму не составит труда, а вот HTML верстальщику может показаться сложным некоторые действия.
Создаем форму отправки данных в html
Первая строка будет следующей
Теперь соберем все вместе.
Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:
Создаем файл, принимающий данные из 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. Если будуту переименовывать файл, то не забудьте переименовать название файла и в строке
Теперь соберем все вместе.
Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:
Создаем файл, принимающий данные из 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. Если будуту переименовывать файл, то не забудьте переименовать название файла и в строке