Отправка письма с вложением из формы не работает - PullRequest
0 голосов
/ 13 января 2019

Я работал на веб-сайте, где я хочу получить тип ввода "file" от пользователя и email для администратора с помощью php.

Мой код выглядит следующим образом:

HTML:

<form class="pure-form"  enctype="multipart/form-data" action="resumeUpload.php" method="POST">
                                            <label for="resume_attachment">Upload your resume</label>
                                            <input type="file" class="pure-input-rounded" name="resume_attachment">
                                            <button type="submit" name="resume_send" class="mt-20 mb-20" value="1">Submit</button>
                                        </form>

PHP:

if($_POST['resume_send'] && isset($_FILES['resume_attachment'])) 
{ 

    //$from_email      = 'sender@abc.com'; //from mail, sender email addrress 
    $recipient_email = 'xyz@gmail.com'; //recipient email addrress 

    //Load POST data from HTML form 
    //$sender_name = $_POST["sender_name"] //sender name 
    //$reply_to_email = $_POST["sender_email"] //sender email, it will be used in "reply-to" header 
    //$subject     = 'New Resume' //subject for the email 
    //$message     = $_POST["message"] //body of the email 


    /*Always remember to validate the form fields like this 
    if(strlen($sender_name)<1) 
    { 
        die('Name is too short or empty!'); 
    } 
    */

    //Get uploaded file data using $_FILES array 
    $tmp_name = $_FILES['resume_file']['tmp_name']; // get the temporary file name of the file on the server 
    $name    = $_FILES['resume_file']['name']; // get the name of the file 
    $size    = $_FILES['resume_file']['size']; // get size of the file for size validation 
    $type    = $_FILES['resume_file']['type']; // get type of the file 
    $error   = $_FILES['resume_file']['error']; // get the error (if any) 

    //validate form field for attaching the file 
    if($file_error > 0) 
    { 
        die('Upload error or No files uploaded'); 
    } 

    //read from the uploaded file & base64_encode content 
    $handle = fopen($tmp_name, "r"); // set the file handle only for reading the file 
    $content = fread($handle, $size); // reading the file 
    fclose($handle);                 // close upon completion 

    $encoded_content = chunk_split(base64_encode($content)); 

    $boundary = md5("random"); // define boundary with a md5 hashed value 

    //header 
    $headers = "MIME-Version: 1.0\r\n"; // Defining the MIME version 
    //$headers .= "From:".$from_email."\r\n"; // Sender Email 
    //$headers .= "Reply-To: ".$reply_to_email."\r\n"; // Email addrress to reach back 
    $headers .= "Content-Type: multipart/mixed;\r\n"; // Defining Content-Type 
    $headers .= "boundary = $boundary\r\n"; //Defining the Boundary 

    //plain text 
    $body = "--$boundary\r\n"; 
    $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n"; 
    $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
    $body .= chunk_split(base64_encode($message)); 

    //attachment 
    $body .= "--$boundary\r\n"; 
    $body .="Content-Type: $file_type; name=".$file_name."\r\n"; 
    $body .="Content-Disposition: attachment; filename=".$file_name."\r\n"; 
    $body .="Content-Transfer-Encoding: base64\r\n"; 
    $body .="X-Attachment-Id: ".rand(1000, 99999)."\r\n\r\n"; 
    $body .= $encoded_content; // Attaching the encoded file with email 

    $sentMailResult = mail($recipient_email, $subject, $body, $headers); 

    if($sentMailResult ) 
    { 
    echo "File Sent Successfully."; 
    unlink($name); // delete the file after attachment sent. 
    } 
    else
    { 
    die("Sorry but the email could not be sent. 
                    Please go back and try again!"); 
    } 
} 
?>

Я использовал этот код, но не смог выполнить задачу.

Может ли кто-нибудь здесь найти ошибку в моем коде и дать правильный способ сделать это.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Ваша проблема, кажется, в этой строке:

if($_POST['button'] && isset($_FILES['attachment']))

У него две проблемы:

Во-первых, $_POST['button'] всегда будет давать ложное значение, поскольку оно не установлено. Чтобы это работало, вам нужно изменить html: <button type="submit" class="mt-20 mb-20" name="button" value="1">Submit</button>. То есть: добавьте атрибут name и value, и значение не должно быть чем-то, что приводит к falsey.

Что вы намерены сделать с этой проверкой? Если вы просто хотите проверить, что запрос поступил как POST, просто пропустите это, потому что наличия $_FILES должно быть достаточно. Нет $_GET загрузки файла.

Во-вторых, isset($_FILES['attachment']) всегда ложно, потому что в HTML это имя загрузки файла resume_file, а не attachment.

Только после решения этих проблем вы можете продолжить с проблемами почты, если они существуют.

Для ясности: ваш почтовый код никогда не будет достигнут.

0 голосов
/ 13 января 2019

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

Вот совет:

  • Попросить пользователя загрузить файл с типом файла ввода

  • Загрузить этот файл на свой сервер

  • Отправьте вложение с помощью PHPMailer

    $mail->addAttachment('/var/tmp/file.tar.gz');

https://github.com/PHPMailer/PHPMailer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...