Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.10.2017, 10:37
Новичок на форуме
Отправить личное сообщение для KateU Посмотреть профиль Найти все сообщения от KateU
 
Регистрация: 09.10.2017
Сообщений: 8

Отправка письма с вложением через formData
Здравствуйте.
Помогите, пожалуйста, с отправкой письма с вложением. Пытаюсь сделать через formData. Сама отправка срабатывает нормально, все отправляется, письмо доходит. Но вместо того, чтобы после нажатия на кнопку "отправить" появлялось сообщение об успешной отправке, страница перезагружается.
Вот код:
Форма отправки:
<form action method="post" name="calcprojectform1" id="calcprojectform1" enctype='multipart/form-data'>
                            <input class="pole validate[required]" data-prompt-position="Left:-65,35" name="name" type="text" placeholder="Имя" /><br><br>
                            <input class="pole validate[required]" data-prompt-position="Left:-65,35" name="phone" type="text" placeholder="Телефон" /><br><br>
                            <input class="pole validate[required,custom[email]]" data-prompt-position="Left:-65,35" name="mail" type="text" placeholder="Ваш e-mail" /><br><br>
                            <input class="pole" type='file' name='mail_file' data-prompt-position="Left:-65,35"/><br><br>
                            <input class="mainButton_form" name="calc-project-submit1" id="calc-project-submit1" type="submit" value="получить">
                        </form>


Скрипт обработки
$(document).on('click', 'input[name="calc-project-submit1"]', function () {
    if ($('form[name="calcprojectform1"]').validationEngine('validate'))
    {
var form = document.forms.namedItem("calcprojectform1");
        var formData = new FormData(form);
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "mail.php");

        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (xhr.status == 200) {
                    data = xhr.responseText;
                    if (data == '1') {
                        $("#calcprojectform1").reset();
                        $("#calcprojectform1").replaceWith('<div style="padding:15px;background:#fff; font-size:14px;font-family:MuseoSansCyrl_700; color:green;">Спасибо, ваша заявка успешно отправлена.</div>');
style="padding:15px;background:#fff; font-size:14px;font-family:MuseoSansCyrl_700; color:green;">Спасибо, ваша заявка успешно отправлена.</div>')
                    } else {
                        $('#calc-project-submit1').validationEngine('showPrompt', 'Ошибка отправки данных. Попробуйте позже.');
                    }
                }
            }
        };
        xhr.send(formData);
    }
});


Файл отправки php
<?php

$mailto = "test@yandex.ru";
$charset = "utf-8";
$subject = "Заполнили форму Рассчитать проект";
$content = "text/html";
$status = "<br>";
if (!empty($_POST)) {
    $name = htmlspecialchars(stripslashes($_POST['name']));
    $email = htmlspecialchars(stripslashes($_POST['mail']));
    $phone = htmlspecialchars(stripslashes($_POST['phone']));
    $picture = "";
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: \"" . $name . "\" <test@yandex.ru>\r\n";
    $headers .= "Bcc: test@yandex.ru\r\n";
    $headers .= "X-Mailer: E-mail from my site \r\n";
    $sendmessage = "<html><body>
<p><b>Имя:</b> " . $name . "</p>
<p><b>Телефон:</b> " . $phone . "</p>
<p><b>E-mail:</b> " . $email . "</p>
</body></html>";

    if (!empty($_FILES['mail_file']['tmp_name'])) {
        $path = $_FILES['mail_file']['tmp_name'];
        $picture = $_FILES['mail_file']['name'];
    }
    $boundary = "--" . md5(uniqid(time()));
    $headers .="Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"\n";
    $multipart .= "--" . $boundary . "\n";
    $multipart .= "Content-Type: text/html; charset=$charset\n";
    $multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
    $multipart .= "$sendmessage\n\n";

    $message_part = '';
    $fp = fopen($path, "r");
    if (!$fp) {
        print "Файл " . $path . " не может быть прочитан";
        exit();
    }
    $file = fread($fp, filesize($path));
    fclose($fp);
    $message_part .= "--" . $boundary . "\n";
    $message_part .= "Content-Type: application/octet-stream\n";
    $message_part .= "Content-Transfer-Encoding: base64\n";
    $message_part .= "Content-Disposition: attachment; filename = \"" . $picture . "\"\n\n";
    $message_part .= chunk_split(base64_encode($file)) . "\n";

    $multipart .= $message_part . "--" . $boundary . "--\n";
    
    if (mail($mailto, $subject, $multipart, $headers)) {
       echo '1'; 
    } else {
        echo '2';
    }
}
?>
Ответить с цитированием
  #2 (permalink)  
Старый 09.10.2017, 11:49
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Всё правильно, при нажатии на submit происходит стандартная отправка формы. Можно конечно click тормознуть, но в таком случаи с enter тоже отправиться
$(document).on('submit', '#calcprojectform1', function (e) {
    if ($('form[name="calcprojectform1"]').validationEngine('validate'))
    {
var form = document.forms.namedItem("calcprojectform1");
        var formData = new FormData(form);
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "mail.php");

        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (xhr.status == 200) {
                    data = xhr.responseText;
                    if (data == '1') {
                        $("#calcprojectform1").reset();
                        $("#calcprojectform1").replaceWith('<div style="padding:15px;background:#fff; font-size:14px;font-family:MuseoSansCyrl_700; color:green;">Спасибо, ваша заявка успешно отправлена.</div>');
style="padding:15px;background:#fff; font-size:14px;font-family:MuseoSansCyrl_700; color:green;">Спасибо, ваша заявка успешно отправлена.</div>')
                    } else {
                        $('#calc-project-submit1').validationEngine('showPrompt', 'Ошибка отправки данных. Попробуйте позже.');
                    }
                }
            }
        };
        xhr.send(formData);
    }
	e.preventDefault();
	return false;
});
__________________
.
Ответить с цитированием
  #3 (permalink)  
Старый 09.10.2017, 12:17
Новичок на форуме
Отправить личное сообщение для KateU Посмотреть профиль Найти все сообщения от KateU
 
Регистрация: 09.10.2017
Сообщений: 8

Skipp, спасибо. Да, так сообщение отправляется и страница не перезагружается. Но сообщение о том, что форма отправлена не выскакивает. То есть, видимо, не срабатывает вот этот код:
if (data == '1') {
                        $("#calcprojectform1").reset();
                        $("#calcprojectform1").replaceWith('<div style="padding:15px;background:#fff; font-size:14px;font-family:MuseoSansCyrl_700; color:green;">Спасибо, ваша заявка успешно отправлена.</div>');
                    } else {
                        $('#calc-project-submit1').validationEngine('showPrompt', 'Ошибка отправки данных. Попробуйте позже.');
                    }


Или может его перенести в конец функции?
Ответить с цитированием
  #4 (permalink)  
Старый 09.10.2017, 12:25
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от KateU
То есть, видимо, не срабатывает вот этот код
Это потому, что вы не то событие обрабатываете и не блокируете действие по умолчанию.

А вот данные извне, а уж тем более при их хранении и использовании как параметров, а также отправляемые почтой обязательно подлежать проверке. Тему почтового отправления и имя в From нужно кодировать.
Ответить с цитированием
  #5 (permalink)  
Старый 09.10.2017, 12:28
Новичок на форуме
Отправить личное сообщение для KateU Посмотреть профиль Найти все сообщения от KateU
 
Регистрация: 09.10.2017
Сообщений: 8

Да, и отправка срабатывает только когда
$(document).on('click', '#calcprojectform1', function (e) {

Если писать
$(document).on('submit', '#calcprojectform1', function (e) {

то отправка не происходит, и страница перезагружается.
Ответить с цитированием
  #6 (permalink)  
Старый 09.10.2017, 12:36
Новичок на форуме
Отправить личное сообщение для KateU Посмотреть профиль Найти все сообщения от KateU
 
Регистрация: 09.10.2017
Сообщений: 8

laimas,
эм... можно подробнее? Какое тогда событие нужно обрабатывать?
Делала по аналогии, как здесь: https://javascript.ru/forum/jquery/4...v-s-formy.html
Ответить с цитированием
  #7 (permalink)  
Старый 09.10.2017, 12:39
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от KateU
.on('submit', '#calcprojectform1'
Это делегирование обработчика, у вас что форма динамически на страницу добавляется?

Сообщение от KateU
Да, и отправка срабатывает только когда
Не правильно вы бутерброд кушаете, дядя Федор, именно onsubmit и надо обрабатывать, и все будет работать.
Ответить с цитированием
  #8 (permalink)  
Старый 09.10.2017, 12:52
Новичок на форуме
Отправить личное сообщение для KateU Посмотреть профиль Найти все сообщения от KateU
 
Регистрация: 09.10.2017
Сообщений: 8

Нет, форма динамически не добавляется, просто показывается только по клику на кнопку.

Да, действительно срабатывает на submit. Это я вызывала событие клика на кнопку, а нужно submit формы. Теперь все отправляется, страница не перезагружается, но сообщение об отправке все равно не появляется.
Ответить с цитированием
  #9 (permalink)  
Старый 09.10.2017, 13:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от KateU
Нет, форма динамически не добавляется
Тогда зачем делегирование? Так и устанавливайте обработчик

$(function() {
    $('#calcprojectform1').on('submit', function(e){
        e.preventDefault(); //отменяем действие по умолчанию - отправление формы
        //и отправляем ее посредством Ajax, используя при этом jQuery  
        $.ajax({
            url: this.action, //url запроса можно брать из формы, таким образом можно использовать этот обработчик для многих форм
            type: this.method, //метод запроса также берем из формы
            contentType: false, //обязательно
            processData: false, //обязательно
            data: new FormData(this), //получаем данные формы
            dataType: 'здесь указать тип ожидаемых данных ответа сервера или убрать параметр передавая тип сервером',
            success: function(data){
                    //ответ сервера
                    alert(data);
            }
        });
    });
});
Ответить с цитированием
  #10 (permalink)  
Старый 09.10.2017, 21:19
Новичок на форуме
Отправить личное сообщение для KateU Посмотреть профиль Найти все сообщения от KateU
 
Регистрация: 09.10.2017
Сообщений: 8

laimas,
Спасибо.
Сделала, как вы пишете, но обработка все равно до конца не срабатывает. Сообщение отправляется, страница не перезагружается, но сообщение об отправке не выводится.
Чего-то даже alert работать перестал...

Делаю сейчас так (на отправке через ajax без файлов работает):
В файле отправки php в конце:
if (mail($mailto, $subject, $multipart, $headers)) {
        $message_ok = array("ok" => 1, "success_text" => "y");
        print json_encode($message_ok);
    } else {
        $err = array("ok" => 2, "error_text" => "n");
        print json_encode($err);
}

В js:
$('#calcprojectform1').on('submit', function (e) {
            e.preventDefault(); //отменяем действие по умолчанию - отправление формы
            //и отправляем ее посредством Ajax, используя при этом jQuery  
            $.ajax({
                url: this.action, //url запроса можно брать из формы, таким образом можно использовать этот обработчик для многих форм
                type: this.method, //метод запроса также берем из формы
                contentType: false, //обязательно
                processData: false, //обязательно
                data: new FormData(this), //получаем данные формы
                dataType: 'json',
                success: function (data) {
                    if (data.ok == '1') {
                        $("#calcprojectform1").reset();
                        $("#calcprojectform1").replaceWith('<div style="padding:15px;background:#fff; font-size:14px;font-family:MuseoSansCyrl_700; color:green;">Спасибо, ваша заявка успешно отправлена.</div>');
                    }
                    if (data.ok == '2') {
                        $('#calc-project-submit1').validationEngine('showPrompt', 'Ошибка отправки данных. Попробуйте позже.');
                    }
                    alert(data);
                    alert(data.ok);
                }
            });
        });


В чем еще может быть дело? Пробовала передавать и число, и boolean. Результат тот же. Где я туплю?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка сообщений через net send artpluss Общие вопросы Javascript 1 19.04.2010 15:44
Отправка POST через JS без перехода на другую страницу m-mikle Общие вопросы Javascript 17 14.04.2010 15:24
Автоматическая отправка формы через JavaScript без использования body onload pavluxa09 Общие вопросы Javascript 0 17.11.2009 15:55
Отправка через $.post - уже 2-й день мучаюсь! Alexander666 jQuery 4 20.02.2009 16:18
отправка файла через обработчик события submit starrich AJAX и COMET 2 13.08.2008 22:29