2012-05-24 44 views
6

Tôi đã viết mô hình Trình kích hoạt mã của riêng tôi để gửi email. Tất cả là tốt cho đến khi thời gian gần đây khi tôi bắt đầu nhận được lỗi này:Lỗi ngoại lệ PHPMailer

Fatal error: Không thể redeclare lớp phpmailerException trong /home/mysite/public_html/subdir/application/libraries/phpmailer/class.phpmailer.php on line 2319

tôi đang sử dụng:

CodeIgniter 2 PHPMailer 5.1

tôi đã thử những điều sau đây để giải quyết nó:

  • Đã thêm "$ mail-> SMTPDebug = 0" để tắt các lỗi.
  • Đã thêm: "$ mail-> MailerDebug = false;"
  • Đã sửa đổi PHPMailer để chỉ hiển thị lỗi khi SMTPDebug được bật.
  • Đã tìm và xóa bất kỳ câu lệnh echo nào
  • Đã thêm các khối try/catch Thử thêm/xóa: $ mail = new PHPMailer (true);

Đây là phương pháp điều khiển của tôi (công ty/liên lạc) trong đó kêu gọi mô hình của tôi (message_model):

function contact() 
    { 
     //Do settings. 
     $this->options->task='email'; 
     $this->options->change = 'sent'; 
     $this->options->form_validation=''; 
     $this->options->page_title='Contact Us'; 

     //Import library 
     include_once('application/libraries/recaptcha/recaptchalib.php');//Include recaptcha library. 

     //Keys for recaptcha, stored in mainconfig file. 
     $this->options->publickey = $this->config->item('recaptcha_public'); 
     $this->options->privatekey = $this->config->item('recaptcha_private');  

     //Form validation 
     $this->form_validation->set_error_delimiters('<div class="error">', '</div>'); 
     $this->form_validation->set_rules('name_field','Name of problem','trim|required|min_length[3]|max_length[100]'); 
     $this->form_validation->set_rules('desc_field','Description','trim|required|min_length[10]|max_length[2000]'); 
     $this->form_validation->set_rules('email_field','Your email address','trim|required|valid_email'); 
$this->form_validation->set_rules('recaptcha_response_field','captcha field','trim|required|callback__check_recaptcha'); 

//If valid. 
     if($this->form_validation->run()) 
     { 
    //Set email contents. 
      $message="This is a message from the contact form on ".$this->config->item('site_name')."<br /><br />"; 
      $message.=convert_nl($this->input->post('desc_field')); 
      $message.="<br /><br />Reply to this person by clicking this link: <a href=\"mailto:".$this->input->post('email_field')."\">".$this->input->post('name_field')."</a><br /><br />"; 

    $options = array('host'=>$this->config->item('email_host'),//mail.fixilink.com 
      'username'=>$this->config->item('email_username'), 
      'password'=>$this->config->item('email_password'), 
      'from_name'=>$this->input->post('name_field'), 
      'to'=>array($this->config->item('email_to')=>$this->config->item('email_to')), 
      'cc'=>$this->config->item('email_cc'), 
      'full_name'=>$this->input->post('name_field'), 
      'subject'=>'Email from '.$this->config->item('site_name').' visitor: '.$this->input->post('name_field'), 
      'message'=>$message, 
      'word_wrap'=>50, 
      'format'=>$this->config->item('email_format'), 
      'phpmailer_folder'=>$this->config->item('phpmailer_folder') 
      ); 

    //Send email using own email class and phpmailer. 
      $result = $this->message_model->send_email($options); 

      //Second email to sender 
    //Set email contents. 
      $message="Thank you for your enquiry, we aim to get a reply to you within 2 working days. In the meantime, please do follow us on www.facebook.com/autismworksuk"; 

      $options = array('host'=>$this->config->item('email_host'),//mail.fixilink.com 
      'username'=>$this->config->item('email_username'), 
      'password'=>$this->config->item('email_password'), 
      'from_name'=>$this->input->post('name_field'), 
      'to'=>$this->input->post('email_field'), 
      'full_name'=>$this->input->post('name_field'), 
      'subject'=>'Email from '.$this->config->item('site_name'), 
      'message'=>$message, 
      'word_wrap'=>50, 
      'format'=>$this->config->item('email_format'), 
      'phpmailer_folder'=>$this->config->item('phpmailer_folder') 
      ); 

    //Send email using own email class and phpmailer. 
      $result = $this->message_model->send_email($options);   

      //Set result.  
      if($result==-1) 
       $this->session->set_flashdata('result', ucfirst($this->options->task).' was not '.$this->options->change.' because of a database error.'); 
      elseif($result==0) 
       $this->session->set_flashdata('result', 'No changes were made.'); 
      else 
       $this->session->set_flashdata('result', ucfirst($this->options->task).' was '.$this->options->change.' successfully.'); 

      //Redirect to completed controller. 
      redirect('completed'); 
     } 

//Validation failed or first time through loop. 
     $this->load->view('company/contact_view.php',$this->options); 
    } 

Đây là phương pháp mô hình của tôi là có thể gửi email. Nó được sử dụng để làm việc nhưng không có bất kỳ thay đổi mà tôi có thể nghĩ đến bây giờ tôi nhận được một lỗi ngoại lệ:

function send_email($options=array()) 
    { 
     if(!$this->_required(array('host','username','password','from_name','to','full_name','subject','message'),$options))//check the required options of email and pass aggainst provided $options. 
      return false; 

     $options = $this->_default(array('word_wrap'=>50,'format'=>'html','charset'=>'utf-8'),$options); 

try 
{   
    if(isset($options['phpmailer_folder'])) 
    require($options['phpmailer_folder']."/class.phpmailer.php"); 
    else 
    require("application/libraries/phpmailer/class.phpmailer.php");//Typical CI 2.1 folder. 

    $mail = new PHPMailer(); 
    $mail->MailerDebug = false; 

    //Set main fields. 
    $mail->SetLanguage("en", 'phpmailer/language/'); 
    $mail->IsSMTP();// set mailer to use SMTP 
    $mail->SMTPDebug = 0; 

    $mail->Host =  $options['host']; 
    $mail->SMTPAuth = TRUE;  // turn on SMTP authentication 
    $mail->Username = $options['username']; 
    $mail->Password = $options['password']; 
    $mail->FromName = $options['from_name'];//WHo is the email from. 
    $mail->WordWrap = $options['word_wrap'];// Set word wrap to 50 characters default. 
    $mail->Subject = $options['subject']; 
    $mail->Body = $options['message'];   
    $mail->CharSet = $options['charset']; 

    //From is the username on the server, not sender email. 
    if(isset($options['from'])) 
    $mail->From = $options['from']; 
    else 
    $mail->From = $mail->Username; //Default From email same as smtp user 

    //Add reply to. 
    if(isset($options['reply_to'])) 
    $mail->AddReplyTo($options['reply_to'], $options['from']); 

    if(isset($options['sender'])) 
    $mail->Sender = $options['sender']; 

    //Add recipients/to field (required) 
    if(is_array($options['to'])) 
    { 
    foreach($options['to'] as $to =>$fn) 
     $mail->AddAddress($to, $fn); 
    } 
    else 
    { 
    $mail->AddAddress($options['to']); //Email address where you wish to receive/collect those emails. 
    } 

    //Add cc to list if exists. Must be an array 
    if(isset($options['cc'])) 
    { 
    if(is_array($options['cc'])) 
    { 
     foreach($options['cc'] as $to =>$fn) 
     $mail->AddCC($to, $fn); 
    } 
    else 
    { 
     log_message('debug', '---->CC field must be an array for use with Message_Model.'); 
    } 
    } 

    //Add bcc to list if exists. Must be an array 
    if(isset($options['bcc'])) 
    { 
    if(is_array($options['bcc'])) 
    { 
     foreach($options['bcc'] as $to =>$fn) 
     $mail->AddBCC($to, $fn); 
    } 
    else 
    { 
     log_message('debug', '---->BCC field must be an array for use with Message_Model.'); 
    } 
    } 

    //Alternative text-only body. 
    if(isset($options['alt_body'])) 
    $mail->AltBody=$options['alt_body']; 
    else 
    $mail->AltBody = htmlspecialchars_decode(strip_tags($options['message']),ENT_QUOTES);//Strip out all html and other chars and convert to plain text. 

    //Plain/html format. 
    if(isset($options['format'])) 
    { 
    if($options['format']=='html') 
     $mail->IsHTML(true);         // set email format to HTML 
    }  

    //Send email and set result. 
    $return['message']=''; 

    if(!$mail->Send()) 
    { 
    $return['message'].= "Message could not be sent.<br />\n"; 
    $return['message'].= "Mailer Error: " . $mail->ErrorInfo."\n"; 
    $return['result'] = 0; 
    } 
    else 
    { 
    $return['message'].= "Message has been sent successfully.\n"; 
    $return['result'] = 1; 
    } 
} 
catch (phpmailerException $e) 
{ 
    log_message('error', '---->PHPMailer error: '.$e->errorMessage()); 
} 
catch (Exception $e) 
{ 
    log_message('error', '---->PHPMailer error: '.$e->errorMessage()); 
} 
     return $return; 
    } 
+5

sử dụng 'require_once' – zerkms

+0

Ok đã hoạt động nhưng tôi không biết tại sao. Tôi chỉ có thể tìm thấy một nơi mà tôi đã bao gồm mã. Cảm ơn! Bạn đã không thêm điều này như là một câu trả lời mặc dù vì vậy tôi sẽ phải tín dụng người khác đã đến đó một chút sau đó. – Adamantus

+0

là một nơi, nhưng bạn gọi hàm này nhiều lần. Vì vậy, dòng được thực hiện nhiều lần – zerkms

Trả lời

8

Về cơ bản một trong hai điều đang xảy ra:

  1. Bạn đang "bao gồm" mã PHP của bạn hai lần ở đâu đó, gây ra lần thứ hai để tạo lỗi redeclaration

  2. Bạn đang sử dụng "phpmailerException" ở một nơi khác, bên cạnh mô hình của bạn. Bạn đã cố gắng để làm một "tìm tất cả" trong IDE của bạn cho tất cả các cuộc gọi đến "phpmailerException" - có lẽ bạn sử dụng tên này trong một khu vực khác cho một ngoại lệ?

+0

Bạn đã cứu tôi người đàn ông ... :) –

9
if (!class_exists("phpmailer")) { 
require_once('PHPMailer_5.2.2/class.phpmailer.php'); 
} 

Mã này sẽ xóa vấn đề này 100% ..

+1

Nó rất hữu ích, và nó là một trong những quyền sử dụng nó – mukesh

+0

Điều này sẽ là câu trả lời, tuyệt vời! – DarkteK

1

require_once ("class.phpmailer.php") là tốt hơn.

Mukesh đúng rằng require_once sẽ giải quyết câu trả lời Sift Exchanges # 1. Tuy nhiên, không cần phải kiểm tra xem lớp có tồn tại như require_once không.

+0

Không còn thứ gì đó tôi đang làm, nhưng dù sao cũng được, có lẽ nó sẽ giúp ai đó ra ngoài. – Adamantus

+0

Hi virsunen, nơi mà nên được thêm vào? Tôi có cùng một xung đột với hai plugin. Tôi đã sử dụng if (! Class_exists) {} nhưng khi nó sẽ được cập nhật, các thay đổi sẽ biến mất. Bạn có biết tôi nên thêm yêu cầu vào đâu để không bị mất các thay đổi không? Cảm ơn rất nhiều – FranP