Все разделы | 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"; //адрес отправителя