Функция предназначена для отправки письма с сайта с вложенным файлом и разработана участниками нашего форума Trianon и elenaki во время совместного обсуждения. Создадим HTML-форму, предназначенную для заполнения пользователем
HTML-форма index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<HTML> <HEAD> <TITLE>Отправка сообщения с вложением</TITLE> </HEAD> <BODY> <H3> <center><font color="#1E90FF">Отправка сообщения с вложением</font></H3> <center> <table width="1" border="0"> <form action="simple_mail.php" enctype="multipart/form-data" method="post"> <tr><td width="50%">To:</td><td align="right"><input type="text" name="mail_to" maxlength="32"></td></tr> <tr><td width="50%">Subject:</td><td align="right"><input type="text" name="mail_subject" maxlength="64"></td></tr> <tr><td colspan="2">Сообщение:<br><textarea cols="50" rows="8" name="mail_msg"></textarea></td> <tr><td width="50%">Photo:</td><td align="right"><input type="file" name="mail_file" maxlength="64"></td></tr> </tr><tr><td colspan="2"><input type="submit" value="Отправить"></td></tr> </form> </table> </center> </BODY> </HTML> |
Обработчик simple_mail.php HTML-формы index.php может выглядеть следующим образом
Обработчик simple_mail.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?php if(empty($_POST['mail_to'])) exit("Введите адрес получателя"); // проверяем правильности заполнения с помощью регулярного выражения if (!preg_match("/^[0-9a-z_][email protected][0-9a-z_^\.]+\.[a-z]{2,3}$/i", $_POST['mail_to'])) exit("Введите адрес в виде [email protected]"); $picture = ""; // Если поле выбора вложения не пустое - закачиваем его на сервер if (!empty($_FILES['mail_file']['tmp_name'])) { // Закачиваем файл $path = $_FILES['mail_file']['name']; if (copy($_FILES['mail_file']['tmp_name'], $path)) $picture = $path; } $thm = $_POST['mail_subject']; $msg = $_POST['mail_msg']; $mail_to = $_POST['mail_to']; // Отправляем почтовое сообщение if(empty($picture)) mail($mail_to, $thm, $msg); else send_mail($mail_to, $thm, $msg, $picture); // Вспомогательная функция для отправки почтового сообщения с вложением (Trianon) function send_mail($mail_to, $thema, $html, $path) { if ($path) { $fp = fopen($path,"rb"); if (!$fp) { print "Cannot open file"; exit(); } $file = fread($fp, filesize($path)); fclose($fp); } $name = "file.ext"; // в этой переменной надо сформировать имя файла (без всякого пути) $EOL = "\r\n"; // ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём $boundary = "--".md5(uniqid(time())); // любая строка, которой не будет ниже в потоке данных. $headers = "MIME-Version: 1.0;$EOL"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL"; $multipart = "--$boundary$EOL"; $multipart .= "Content-Type: text/html; charset=windows-1251$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= $EOL; // раздел между заголовками и телом html-части $multipart .= chunk_split(base64_encode($html)); $multipart .= "$EOL--$boundary$EOL"; $multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL"; $multipart .= $EOL; // раздел между заголовками и телом прикрепленного файла $multipart .= chunk_split(base64_encode($file)); $multipart .= "$EOL--$boundary--$EOL"; if(!mail($mail_to, $thema, $multipart, $headers)) {return False; //если не письмо не отправлено } else { //// если письмо отправлено return True; } exit; } ?> |