Отправка писем на php. Сборник рецептов

Отправка писем в php осуществляется с помощью функции mail()

mail(to, subject, message, mailheaders);

to — емайл получателя
subject — заголовок письма
message — текст письма, сообщение
mailheaders — почтовые заголовки

Содержание

Отправка обычного текстового письма

Это самый простой способ отправки писем. Вы просто указываете емайл получателя, отправителя и формат text/plain в заголовке. Далее идет пример

<?php

$to = "rockbattle@mail.ru"; 
// емайл получателя 

$subject = "Проверка отправки писем"; 
// тема письма 

$message = "Здравствуйте
Если вы читаете это письмо значит все ок
Почтовый робот"; 
// текст сообщения 

$mailheaders = "Content-type:text/plain;charset=windows-1251rn"; 
// почтовый заголовок, указывает формат письма - текстовый и кодировку

$mailheaders .= "From: SiteRobot <noreply@siterobot.ru>rn"; 
// почтовый заголовок, указывает емайл отправителя


$mailheaders .= "Reply-To: noreply@siterobot.rurn"; 
// почтовый заголовок, указывает емайл для ответа 
// лучше если емайл для ответа совпадает с емайлом отправителя, иначе некоторые почтовые сервисы могут классифицировать письмо как спам 


mail($to, $subject, $message, $mailheaders);
// отправляем письмо 

?>

Отправка html-письма, в которое можно вставлять таблицы, рисунки, различные шрифты, стили оформления

Отправка писем в html формате почти ничем не отличается от отправки писем в текстовом формате. В заголовке вы указываете формат письма text/html а в самом письме вместо обычного текста помещаете html-код.

Рассмотрим на примере

<?php

$to = "rockbattle@mail.ru"; 
// емайл получателя 

$subject = "Проверка отправки писем"; 
// тема письма 

$message = "Здравствуйте<br><br>Если вы это читаете значит все ок <br><br>Почтовый робот "; 
// текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.

$mailheaders = "Content-type:text/html;charset=windows-1251rn"; 
// формат письма html

$mailheaders .= "From: SiteRobot <noreply@siterobot.ru>rn"; 
$mailheaders .= "Reply-To: noreply@siterobot.rurn"; 
// емайл отправителя и емайл для ответа 

mail($to, $subject, $message, $mailheaders);
// отправляем письмо 

?>

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

Чтобы прикрепить файл к письму потребуется немного более длинный код, но это тоже довольно просто. В приведенном далее коде пропишите имя вашего файла который вы хотите отправить а также его расположение

<?php 

$to = "rockbattle@mail.ru"; 
// емайл получателя 

$subject = "Письмо с вложением"; 
// тема письма 

$message = "Здравствуйте
Если с этим письмом вы получили прикрепленный файл значит все ок 
Почтовый робот "; 
// текст сообщения

$filename = "file.doc";
// название файла

$filepath = "files/file.doc"; 
// месторасположение файла 

// письмо с вложением состоит из нескольких частей, которые разделяются разделителем

$boundary = "--".md5(uniqid(time())); 
// генерируем разделитель 
$mailheaders = "MIME-Version: 1.0n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary="$boundary"n"; 
// разделитель указывается в заголовке в параметре boundary 

$mailheaders .= "From: SiteRobot <noreply@siterobot.ru>rn"; 
$mailheaders .= "Reply-To: noreply@siterobot.rurn"; 


$multipart = "--$boundaryn"; 
$multipart .= "Content-Type: text/plain; charset=windows-1251nn"; 
$multipart .= "$messagenn"; 

// первая часть само сообщение

$fp = fopen($filepath,"r"); 
 if (!$fp) 
 { 
 print "Файл не может быть прочитан"; 
 exit(); 
 } 

$file = fread($fp, filesize($filepath)); 
fclose($fp); 

// чтение файла

$message_part = "--$boundaryn"; 
$message_part .= "Content-Type: application/octet-stream; name = "".$filename.""n"; 
$message_part .= "Content-Transfer-Encoding: base64n"; 
$message_part .= "Content-Disposition: attachment; filename = "".$filename.""nn"; 
$message_part .= chunk_split(base64_encode($file))."n"; 

// второй частью прикрепляем файл, можно прикрепить два и более файла
$multipart .= $message_part;

mail($to,$subject,$multipart,$mailheaders);
// отправляем письмо 

?>

Отправка писем сразу нескольким адресатам

Чтобы отправить письмо сразу нескольким адресатам, лучше всего использовать заголовок Bcc: который отправляет копию письма на указанный емайл

Например

<?php

$to = "rockbattle@mail.ru"; 
// емайл получателя 

$subject = "Проверка отправки писем"; 
// тема письма 

$message = "Здравствуйте
Если вы читаете это письмо значит все ок
Почтовый робот"; 
// текст сообщения 

$mailheaders = "Content-type:text/plain;charset=windows-1251rn"; 
$mailheaders .= "From: SiteRobot <noreply@siterobot.ru>rn"; 
$mailheaders .= "Reply-To: noreply@siterobot.rurn"; 
// почтовые заголовки

$mailheaders .= "Bcc: email1@mail.rurn"; 
$mailheaders .= "Bcc: email2@mail.rurn"; 
$mailheaders .= "Bcc: email3@mail.rurn"; 
// заголовков Bcc может быть неограниченное количество

 

mail($to, $subject, $message, $mailheaders);
// отправляем письмо 

?>

Комментарии (18)

Владимир Владимирович 2018-03-16 16:33:13
Всем привет. Помогите разобраться. Я новичок в HTML - сильно не пинайте. Скачал LadingPage шаблон на html и переделал под себя, а вот проблема в том что не отправляются письма как положено через формы. На сайте есть несколько форма. 1) Заказать звонок и 2) Заказать воду. Во 2 форме есть подпункты город,время и т.д. Но при оправке на почту приходить только текст "Заказ на доставку воды", а нужно что бы и телефон и все остальное приходило. Создал файл mail.php и прописал вот такой код
<?php
$to = 'МОЯ ПОЧТА';
$from = 'email@yandex.ru';
$subject = 'Заказ воды на сайте Water24Hours';
$subject = '=?utf-8?b?'. base64_encode($subject ) .'?=';
$headers = 'Content-type: text/plain; charset="utf-8"';
$headers .= "From: ". $from ." <". $from ."> rn";
$message = 'Заказ на доставку воды';
$headers .= "Date: ". date('D, d M Y h:i:s O') ."rn";
mail($to, $subject, $message, $headers, '-f'. $from );
?>
И в файле script.js вот такой код
$(function() {
$('#square').keyup(function(){
var square = $(this).val();
$('#price').val(square*1100)
});
$('#price').keyup(function(){
var price = $(this).val();
$('#square').val((price/1100).toFixed(2))
});

$('.ask-blocks .item h4').click(function(){
var thisH4 = $(this),
thisSpan = $('div', $(this).parent()),
outherH4 = $('.ask-blocks .item h4').not(thisH4),
outherSpan = $('.ask-blocks .item div').not(thisSpan);
outherH4.removeClass('active');
outherSpan.hide().removeClass('active');
thisH4.toggleClass('active');
thisSpan.fadeToggle().toggleClass('active');
});
ymaps.ready(init);
var myMap,
myPlacemark;

function init(){
if( ($(window).width() <= 767) ) {
myMap = new ymaps.Map("map", {
center: [55.75399400, 37.62209300],
zoom: 8
});
} else {
myMap = new ymaps.Map("map", {
center: [55.75399400, 37.62209300],
zoom: 8
});
}

myPlacemark = new ymaps.Placemark([55.75399400, 37.62209300], {
hintContent: 'Алматы',
balloonContent: 'г. Алматы, пр. Достык, д. 291/3'
});
myMap.geoObjects.add(myPlacemark);
}
$('.up').click(function(e){
e.preventDefault();
$('html,body').animate({
scrollTop: 0
}, 1000);
});
$("input.tel").click(function(){
$(this).val('+7');
});
$(window).scroll(function() {
var pos = 86;
if( ($(window).width() <= 1199) || ($(window).width() >= 768) ) {
pos = 150;
}
if( ($(window).width() <= 767) || ($(window).width() >= 576) ) {
pos = 150;
}
if($(window).width() <= 575) {
pos = 290;
}

if($(this).scrollTop() >= pos) {
$('nav').addClass('stickytop');
}
else{
$('nav').removeClass('stickytop');
}
});
$('.smoothScroll').click(function(event) {
event.preventDefault();
var href=$(this).attr('href');
var target=$(href);
var top=target.offset().top;
$('html,body').animate({
scrollTop: top
}, 1000);
});

$('.modal').on('hidden.bs.modal', function (e) {
$('input:not(.type)', $(this)).val('');
});
$('form').submit(function(e){
e.preventDefault();
var form_data = {
'name':$(".name", $(this)).val(),
'tel':$(".tel", $(this)).val(),
'price':$("#price", $(this)).val(),
'square':$("#square", $(this)).val(),
'type':$(".type", $(this)).val()
};
$.ajax({
type: "POST",
url: "mail.php",
data: form_data,
success: function(){
$('.modal').modal('hide');
setTimeout(function() {
$('.success').fadeToggle();
}, 1000);
setTimeout(function() {
$('.success').fadeToggle();
}, 2500);
},
error: function() {
alert("Произошла какая то ошибка!");
}
});
});
new WOW().init();
});
Подскажите что сделал не правильно. Всем спасибо!
Вася 2017-05-20 18:32:37
Можно в $to через ; прописать нужные адреса Е-мэйлов и все отправится!
Александр 2014-08-18 11:36:26
Подскажите пожалуйста, как отправить форму на выбранный пользователем email (email определяется одним из значений выбираемых в combobox)?
Валера 2014-06-07 09:10:29
Подскажите, пожалуйста, как вставить в письмо таблицу HTML, ячейки которой заполняются автоматически из формы регистрации. Что-то вроде:

$headers = 'Content-type: text/html; charset=utf-8' . "rn";
$from = "qaz@mail.ru";
$subject="Новая заявка участника";
$to = 'wsx@rambler.ru';
$message ="
echo "<table border 1>";
echo "<caption align=center>заявка учаcnника конференции: </caption>";
echo "<tr bgcolor=#CCFFFF><td>Пол</td><td>Фамилия</td>
<td>Имя</td><td>Отчество</td><td>Возраст</td>
<td>Страна</td><td>Организация</td><td>Адрес организации</td><td>Название доклада</td>
<td>Тип доклада</td><td>Категория учатсника</td><td>Номер телефона</td><td>E-mail</td></tr>";

echo "<tr><td>pol </td><td>sname</td><td>name</td><td>fname</td><td>old</td>
<td>country</td><td>organiz</td><td>org</td><td>doc</td><td>formdoc</td>
<td>KY</td><td>phone</td><td>pochta</td></tr>";
echo "</table>";
";

if(mail($to, $subject,$message,$headers,$from))
{echo 'Спасибо! Ваша заявка принята.'; }
else
{echo 'Произошла ошибка - заявка не отправлена';}

?>
Новичок 2013-05-03 11:08:02
@Гость: используй JavaScript
Новичок 2013-04-14 21:28:08
Гость, средствами PHP не получится сделать без перезагрузки страницы, ибо Php серверный язык, данные манипуляции возможны при использовании клиентского языка Java Script.
Гость 2012-09-30 23:33:36
А как сделать, чтобы при незаполненых каких-то полях выдавалась ошибка и желательно без перезагрузки и указанием какие поля надо заполнить?
Aqvatarius 2012-05-12 12:33:24
@zed212:

$From = "$mail[$n]";
$To = "ynii@list.ru";

местами поменяй...
$From = "ynii@list.ru";
$To = "$mail[$n]";
zed212 2012-05-05 20:40:22
Приветствую у меня вопрос а кока зделать в таких скриптах как Отправка писем сразу нескольким адресатам только на оборот чтоб отправка писем одному почтавику@ сразу от нескольких почтовиков???? вот есть скрипт:

<?php

$mail = array("yhgfd@mail.ru", "yhg@mail.ru и т д");
for ($n=0;$n<count($mail);$n++)
{
$From = "$mail[$n]";
$To = "ynii@list.ru";
$Subject = "Заголовок";
$body = "Всем привет!";

$headers .= "From: ".$From." $n++rn";
$headers.= "Content-Type: text/html; charset=utf-8 rn";
$headers .= "MIME-Version: 1.0 rn";
mail($To, $Subject, $body, $headers);
}
?>
в чём тут ошибка??? при проверки приходит всеровно от одного а не от не скольких сразу кто нибуть может сказать почему в чём ошибка можно ко мне на почту ynii@list.ru
Чел 2011-06-19 21:57:26
Спасибо за простой и рабочий скрипт отправки письма с вложением. В интернете практически не найти, перелопатил кучу невнятной кодо-хрени, самые главные из которых - разные навороченные phpmailer, mail mime и прочее говно, и которых так и не смог ничего отправить.
Меню