функция php mail с вложениями

Я пытаюсь сделать форму, которая отправляет мне письмо.

Это содержимое файла HTML.

<form method="post" action="email.php" enctype="multipart/form-data">
<input type="text" id="contact_name" class="form-control" placeholder="Name" name="user_name"/>
<input type="text" id="contact_email" class="form-control" placeholder="Email Address"name="user_mail" <textarea id="contact_message" class="form-control" rows="7" placeholder="Write a
message" name="user_message"></textarea>
<input name="attachment" type="file">
<input type="submit" value="Send mail" class="btn btn-primary pull-right"/>
</form>

и это файл php.

<?php

if(isset($_POST) && !empty($_POST)) {
if(!empty($_FILES['attachment']['name'])) {
$file_name = $FILES['attachment']['name'];
$temp_name = $FILES['attachment']['tmp_name'];
$file_type = $FILES['attachment']['type'];

$base = basename($file_name);
$extension = substr($base, strlen($base)-4, strlen($base));

//only these file types will be allowed
$allowed_extensions = array(".doc", "docx", ".pdf", ".zip", ".png");

//check that this file type is allowed
if(in_array($extension,$allowed_extensions)) {
//mail essentials
$from = $_POST['user_mail'];
$to = "[email protected]";
$subject = $_POST['user_name'];
$message = $_POST['user_message'];

//things u need
$file = $temp_name;
$content = chunk_split(base64_encode(file_get_contents($file)));
$uid = md5(uniqid(time()));  //unique identifier

//standard mail headers
$header = "From: ".$from."\r\n";
$header .= "Reply-To: ".$replyto. "\r\n";
$header .= "MIME-Version: 1.0\r\n";//declare multiple kinds of email (plain text + attch)
$header .="Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$header .="This is a multi-part message in MIME format.\r\n";

//plain txt part

$header .= "--".$uid."\r\n";
$header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
$header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$header .= $message. "\r\n\r\n";//attch part
$header .= "--".$uid."\r\n";
$header .= "Content-Type: ".$file_type."; name=\"".$file_name."\"\r\n";
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$file_name."\"\r\n\r\n";
$header .= $content."\r\n\r\n";  //chucked up 64 encoded attch//sending the mail - message is not here, but in the header in a multi part

if(mail($to, $subject, "", $header)) {
echo "success";
}else {
echo "fail";
}}else {
echo "file type not allowed"; }    //echo an html file
}else {
echo "no file posted"; }
}
?>

Дело в том, что file type not allowed сообщение продолжает приходить. Но я загрузил файл .png, поэтому не знаю, в чем проблема.

Не могли бы вы помочь мне с этим? Я держусь за это часами 🙁

1

Решение

на самом деле у вас есть

$file_name = $FILES['attachment']['name'];
$temp_name = $FILES['attachment']['tmp_name'];
$file_type = $FILES['attachment']['type'];

так должно быть

$file_name = $_FILES['attachment']['name'];
$temp_name = $_FILES['attachment']['tmp_name'];
$file_type = $_FILES['attachment']['type'];

и работает отлично :))

5

Другие решения

Также убедитесь, что ваш заголовок Content-Type для вашего изображения прикреплен правильный тип MIME, т.е. image/png за .png файл. Относится к этому вики для списка типов изображений MIME.

3

Вы превышаете размер строки в substr(), Так что ваши $extension не правильно

За a.pdf; strlen($base) 5; поэтому конечный индекс равен 4. Следовательно, ваш третий параметр должен быть strlen($base) - 1 вместо strlen($base),

Измените строку следующим образом:

$extension = substr($base, strlen($base) - 4, strlen($base) - 1);

Я думаю, что этот подход еще лучше:

$extension = substr($base, strrpos($base, ".")-1);

Что даст вам последнее . символ и остальная часть строки, a.k.a. расширение файла.

демонстрация.

1
По вопросам рекламы [email protected]