вторник, 13 сентября 2011 г.

php Отправка почты с сайта с вложениями

Задача
Интернет магазин. покупатель выбирает товар, выбирает способ доставки и оплаты.
Если способ доставки выбран "Почтой России" - отправлять менеджерам сайта сообщение с  заполненным почтовым бланком ф.116.
Если выбран способ оплаты "Наложенный платеж" - отправлять заполненный почтовый бланк ф.112.

Решение

Для начала нужно создать эти бланки. Код бланков описывать не буду. (скачать их можно тут html файлы, в формате php для принятия post'данных).
112.php и 116.php - каждый бланк будет принимает GET данные.

Обращаться к ним следующим образом:
http://****/112.php?fio1=".$_POST['firstname']."&fio2=".$_POST['lastname']."&fio3=".$_POST['thirdname']."&adr1=".$_POST['area'].",".$_POST['city']."&adr2=".$_POST['address'].",&pst=".$_POST['postindex'])
Бланки готовы, и ждут обращения с GET 'данными.
Переходим к функции отправки почты.
Создаем файл mail.php в который передаются данные формы. (В форме пользователь заполняет свои данные, ФИО, почтовый адрес, телефон.. описывать форму не буду.)

Для начала нужно сформировать запрос обращения к бланкам:

$file = str_replace(" ", "%20", "http://****/112.php?fio1=".$_POST['firstname']."&fio2=".$_POST['lastname']."&fio3=".$_POST['thirdname']."&adr1=".$_POST['area'].",".$_POST['city']."&adr2=".$_POST['address'].",&pst=".$_POST['postindex']);  
$file2 =str_replace(" ", "%20", "http://****/116.php?fio1=".$_POST['firstname']."&fio2=".$_POST['lastname']."&fio3=".$_POST['thirdname']."&adr1=".$_POST['area'].",".$_POST['city']."&adr2=".$_POST['address'].",&pst=".$_POST['postindex']);   
Пробелы обязательно заменить на %20

Далее проверим, выбрана ли доставка почтой, и выбран ли способ оплаты - наложенным платежом. и создаем массив файлов $files.
if($_POST['pays'] == 3)
   { $files = array('112.html' => file_get_contents($file), '116.html' => file_get_contents($file2));}
elseif($_POST['pays'] == 2)
   { $files = array('116.html' => file_get_contents($file2));}
else $files = "";
112.html и 116.html  - это имена создаваемых файлов, для последующего вложения к письму.

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


function mail_to($to, $from, $subj, $text, $files=null){
Подготовка заголовков сообщения
$boundary = md5(uniqid(time()));
$headers[] ="MIME-Version: 1.0";
$headers[] ="Content-Type: multipart/mixed;boundary=\"$boundary\"; type=\"text/html;\"";
$headers[] ="From: ".$from;
$headers[] ="Reply-To: ".$from;
$headers[] ="Return-Path: ".$from;
$headers[] ="X-Mailer: PHP/" . phpversion();
Подготовка заголовков вложения
$multipart[]= "--".$boundary;
$multipart[]= "Content-Type: text/html; charset=cp1251";
$multipart[]= "Content-Transfer-Encoding: Quot-Printed";
$multipart[]= ""; // раздел между заголовками и телом html-части
$multipart[]= $text;
$multipart[]= "";
Читаем созданные массив файлов и вкладываем их в письмо
if ((is_array($files))&&(!empty($files)))
{
foreach($files as $filename => $filecontent)
{
$multipart[]="--".$boundary;
$multipart[]= "Content-Type: application/octet-stream; name=\"".$filename."\"";
$multipart[]= "Content-Transfer-Encoding: base64";
$multipart[]= "Content-Disposition: attachment; filename=\"".$filename."\"";
$multipart[]= "";
$multipart[]= chunk_split(base64_encode($filecontent));
}
}
$multipart[]= "--$boundary--";
$multipart[]= "";
Отправляем почту
$headers=implode("\r\n", $headers);
$multipart=implode("\r\n", $multipart);
return mail($to, $subj, $multipart, $headers);
}

Вызов функции и передача параметров

$to="<email@email>
$from="email@from";
$subj="Тема сообщения - Почтовые бланки";
$text="Текст сообщения - ";
mail_to($to, $from, $subj, $text, $files);

4 комментария:

Анонимный комментирует...

Огромное спасибо!
Заработал только этот скрипт!
Перегуглил все что можно... но заработад только он....
Еще раз спасибо.

Naild комментирует...

Алексей, не могли бы вы перезалить архив с бланками?

Alexey Kostryukov комментирует...

Перезалил

Naild комментирует...

Благодарю. Полезная статья.