我正在使用 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 调用中工作正常。
尝试像这样将 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
函数而不是 success 函数,并将 async 租赁为 true (这是默认值)。我认为完整的功能在没有浏览器锁定的情况下等待,但我不能 100% 确定这一点。
虽然上面的答案有效,但有些人可能会遇到抛出 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');
使用下面的ajax调用。
$.ajax({
url: '<?php echo site_url();?>/contact/send',
type: 'POST',
data: dataString,
dataType: "json",
async: false,
success: function(message){
if(message.sent){
$('#response_div').html("<?php echo lang('successfully_send'); ?>").delay(5000).hide('slow');
}
else{
$('#response_div').html("<?php echo lang('error'); ?>").delay(5000).hide('slow');
}
botao.attr('disabled', false);
}
});