Отправить письмо с codeigniter и ajax: прерванный запрос - PullRequest
1 голос
/ 13 октября 2011

Я использую ajax для отправки электронного письма через контактную форму в codeigniter. Часть AJAX (JQuery) является:

var dataString = 'nome=' +  nome + '&msg=' + msg + '&email=' + email + '&secure=' + secure + '&mailto=' + mailto + '&ci_token=' + $.cookie("ci_csrfprotection_cookie");

$.ajax({
        url: '<?php echo site_url();?>/contact/send',
        type: 'POST',
        data: dataString,
        timeout: 1000,
        dataType: "json",
        success: function(msg){
                if(msg.sent){
                    $('#feedback').html("<?php echo lang('email_sucesso'); ?>").delay(6000).hide('slow');
                        }
                        else{
                            $('#feedback').html("<?php echo lang('email_erro'); ?>").delay(6000).hide('slow');
                        }
                        botao.attr('disabled', false);
                    }
                });

А контроллер это:

public function send()
{
    if ($this->input->post('secure') != 'siteform') {
        echo lang('erro_no_js');
    }else{
        $this->load->library('email');

        $nome = $this->input->post('nome');
        $email = $this->input->post('email');
        $msg = $this->input->post('msg');
        $mailto = $this->input->post('mailto');
        $secure = $this->input->post('secure');

        $config['protocol'] = "smtp";
        $config['smtp_host'] = "ssl://smtp.googlemail.com";
        $config['smtp_port'] = "465";
        $config['smtp_user'] = $this->settings['smtp_email'];
        $config['smtp_pass'] = $this->settings['smtp_password'];
        $config['charset'] = "utf-8";
        $config['mailtype'] = "html";
        $config['newline'] = "\r\n";

        $this->email->initialize($config); 

        $this->email->from($email, $nome);
        $this->email->to($mailto);
        $this->email->subject('Contacto do site');
        $this->email->message($msg);
        if ($this->email->send()){
            echo json_encode(array("sent"=>TRUE));
        }else{
            echo json_encode(array("sent"=>FALSE));
        }
    }
}

Это на самом деле отправляет электронное письмо правильно, но вызов ajax прерывается, и я никогда не получаю сообщение обратно.

Но если я удаляю бит $this->email->send(), я получаю ответ правильно, но, конечно, электронное письмо не отправляется.

Что мне здесь не хватает?

Примечание: у меня включена функция CSRF, и она работает нормально в других вызовах ajax, которые запрашивают базу данных.

Ответы [ 2 ]

1 голос
/ 14 мая 2012

Хотя приведенные выше ответы работают, некоторые могут столкнуться с дополнительной проблемой, возникающей из-за предупреждения php:

Message: date() [function.date]: It is not safe to rely on the system's timezone
settings.

Чтобы обойти это, нужно либо установить часовой пояс в вашем php.ini, либодобавив его вручную в ваш codeigniter index.php.

ini_set('date.timezone', 'America/Chicago');

См. Дата ошибки отправки почты с использованием codeigniter

1 голос
/ 13 октября 2011

Попробуйте установить async в false, как это.

$.ajax({
        url: '<?php echo site_url();?>/contact/send',
        type: 'POST',
        data: dataString,
        timeout: 1000,
        dataType: "json",
        async: false,
        success: function(msg){
                if(msg.sent){
                    $('#feedback').html("<?php echo lang('email_sucesso'); ?>").delay(6000).hide('slow');
                        }
                        else{
                            $('#feedback').html("<?php echo lang('email_erro'); ?>").delay(6000).hide('slow');
                        }
                        botao.attr('disabled', false);
               }
         });

Еще один способ - использовать функцию complete, а не функцию успеха, и использовать асинхронное значение true (по умолчанию). Я думаю, что полная функция ожидает без блокировки браузера, но я не уверен на 100% в этом.

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