2012-05-24 16 views
6

Napisałem własny model Code Igniter do wysyłania e-maili. Wszystko było w porządku aż do niedawna, kiedy zaczął się ten błąd:Błąd wyjątku PHPMailer

Błąd krytyczny: Nie można redeclare klasy phpmailerException w /home/mysite/public_html/subdir/application/libraries/phpmailer/class.phpmailer.php on line 2319

Używam:

CodeIgniter 2 PHPMailer 5,1

próbowałem następujących czynności, aby go rozwiązać:

  • Dodano "$ mail-> SMTPDebug = 0", aby wyłączyć błędy.
  • Dodano: "$ mail-> MailerDebug = false;"
  • Zmodyfikowano narzędzie PHPMailer tak, aby wyświetlało tylko błędy, gdy włączone jest SMTPDebug.
  • Po wyszukaniu i usunięciu wszystkich instrukcji echa:
  • Dodano bloki try/catch Próbowano dodawać/usuwać: $ mail = new PHPMailer (true);

Oto moja metoda kontroler (firma/kontakt), który wywołuje mojego modelu (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); 
    } 

Oto sposób mojego modelu do wysyłania e-maili. Stosowany do pracy, ale bez żadnych zmian mogę myśleć teraz pojawia się błąd wyjątek:

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

użyj 'require_once' – zerkms

+0

OK, ale zadziałało, ale nie wiem dlaczego. Mogę znaleźć tylko jedno miejsce, w którym zawarłem kod. Dzięki! Nie dodałeś tego jako odpowiedzi, więc będę musiał uznać drugiego faceta, który przyszedł nieco później. – Adamantus

+0

to jedno miejsce, ale funkcję tę można wywołać kilka razy. Tak więc ta linia jest wykonywana kilka razy. – zerkms

Odpowiedz

8

zasadzie jedna z dwóch rzeczy się dzieje:

  1. jesteś „tym” kodu PHP dwukrotnie gdzieś, powodując po raz drugi wygenerowanie błędu redeclaration

  2. Używasz "phpmailerException" gdzie indziej, oprócz swojego modelu. Czy próbowałeś "znaleźć wszystko" w IDE dla wszystkich połączeń do "phpmailerException" - być może użyłeś tej nazwy w innym obszarze dla innego wyjątku?

+0

Uratowałeś mi człowieka ... :) –

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

Ten kod kasuje tej kwestii 100% ..

+1

Jest bardzo przydatny, i to jest poprawny użyj go – mukesh

+0

To powinna być odpowiedź, doskonale! – DarkteK

1

require_once ("class.phpmailer.php") jest lepsza.

Mukesh ma rację, że require_once rozwiąże odpowiedź Sift Exchanges # 1. Jednak nie ma potrzeby sprawdzania, czy klasa istnieje tak jak require_once.

+0

Już nie coś nad czym pracuję, ale dzięki, może to komuś pomóc. – Adamantus

+0

Witam virsunen, gdzie należy go dodać? Mam taki sam konflikt między dwiema wtyczkami. Użyłem if (! Class_exists) {}, ale kiedy zostanie zaktualizowany, zmiany znikną. Czy wiesz, gdzie powinienem dodać wymaganie, aby nie stracić zmian? Wielkie dzięki – FranP