Все разделы | CMS Joomla 2.5 | Общее | PHP | Javascript + jQuery
24 октября 2014
Чтобы приступить к написанию скрипта необходимо собрать скелет формы, через которую будет производится отправка.
<form class="rezume" method="post" enctype="multipart/form-data"> <p><label for="comments">Комментарий</label><textarea id="comments" name="comments"></textarea></p> <p><label>Вложите ваше резюме</label><input type="file" name="upfile"></p> <p><button name="button" type="submit">Отправить</button></p> </form>
Очень важно чтобы у формы существовал атрибут enctype="multipart/form-data", так как без него форма не сможет передавать данные на сервер. Почему на сервер? Дело в том, что то что после нажатия на кнопку "Отправить", файл письма не сразу отправляется на заданную электронку, а изначально отправляется на сервер, находясь там его можно скорвертировать, проверить его формат, изменить размер и т.д. И только после того как он появится на сервере функция mail производит отправку письма с сервера (сайта).
Важно усвоить, что при обмене сообщениями через сайт, например, при отправки письма клиента через сайт, отправителем письма для администратора является не клиент, а сайт, а для сайта отправителем является клиент. Все письма отправленные с сайта имеют свой обработчик, который способен проверять, записывать их в базу данных, присваивать номер, отправлять письма и т.д.
Для обработки формы отправки письма из формы представленной выше необходимо использовать следующий обработчик.
if (isset ($_POST['button'])) { function send_mail($to, $subject, $message, $path) { if ($path) { $fp = fopen($path,"rb"); if (!$fp) { exit(); } $file = fread($fp, filesize($path)); fclose($fp); } $name = $path; $EOL = " "; $boundary = "--".md5(uniqid(time())); $headers = "MIME-Version: 1.0;$EOL"; $headers .= "Content-Type: multipart/mixed; boundary="$boundary"$EOL"; $headers .= "From: address@server.com"; //адрес отправителя $multipart = "--$boundary$EOL"; $multipart .= "Content-Type: text/html; charset=UTF-8$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= $EOL; $multipart .= chunk_split(base64_encode($message)); $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($to, $subject, $multipart, $headers)) { echo 'Сообщение не отправлено'; } else { echo 'Ваше сообщение успешно отправлено'; } } $to='test@test.ru'; //здесь email получателя $subject = 'Отправка письма с сайта с вложением'; $message = '<p>Комментарий: '.$_POST['comments'].'</p>'; $picture = ""; $headers = 'Content-Type: text/html; charset="UTF-8"'." ". 'From: address@server.com'. //адрес отправителя 'X-Mailer: PHP/' . phpversion(); if (!empty($_FILES['upfile']['tmp_name'])) { $path = $_FILES['upfile']['name']; if (copy($_FILES['upfile']['tmp_name'], $path)) $picture = $path; } if(empty($picture)) { if (mail($to, $subject, $message, $headers)) { echo 'Ваше сообщение успешно отправлено'; } } else send_mail($to, $subject, $message, $picture); }
Самым первым условием в данном обработчике является проверка на нажатие на кнопку с аттрибутом name="button". В обработчике также описана функция отправки сообщения с вложением send_mail, а также проверка на существование файла во вложении, если файл не вложен, то отправка письма производится стандартным путем, если файл вложен то отправка производится через фукцию send_mail письмом с вложением.
$headers .= "From: address@server.com"; //адрес отправителя