2012-05-24 10 views
6

Ho scritto il mio modello Code Igniter per l'invio di e-mail. Tutto andava bene fino a poco tempo quando ho iniziato a ottenere questo errore:Errore eccezione PHPMailer

Fatal error: Impossibile ridichiarare classe phpmailerException in /home/mysite/public_html/subdir/application/libraries/phpmailer/class.phpmailer.php on line 2319

sto usando:

CodeIgniter 2 PHPMailer 5.1

ho provato quanto segue per risolverlo:

  • Aggiunto "$ mail-> SMTPDebug = 0" per disattivare gli errori.
  • Aggiunto: "$ mail-> MailerDebug = falso;"
  • Modificato PHPMailer per mostrare solo gli errori quando SMTPDebug è attivato.
  • Cerca e rimosso eventuali istruzioni di eco
  • Aggiunti i blocchi try/catch Provato l'aggiunta/rimozione: $ mail = new PHPMailer (true);

Ecco il mio metodo di controllo (società/contatto) che chiama il mio modello (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); 
    } 

Ecco il metodo di mio modello per inviare le email. Ha usato per lavorare, ma senza alcuna modifica che posso pensare ora ottengo un errore di eccezione:

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

use 'require_once' – zerkms

+0

Ok, ha funzionato, ma non so perché. Posso trovare solo un posto dove ho incluso il codice. Grazie! Non hai aggiunto questa risposta come risposta, quindi dovrò ringraziare l'altro che è arrivato poco dopo. – Adamantus

+0

è un posto, ma si chiama la funzione più volte. Quindi quella riga viene eseguita più volte – zerkms

risposta

8

Fondamentalmente una delle due cose sta accadendo:

  1. State "tra cui" codice PHP due volte da qualche parte, causando la seconda volta per generare l'errore di ridecisione

  2. Si sta utilizzando "phpmailerException" da qualche altra parte, oltre al proprio modello. Hai provato a fare un "find all" nel tuo IDE per TUTTE le chiamate a "phpmailerException"? Forse hai usato questo nome in un'altra area per un'altra eccezione?

+0

Mi hai salvato amico ... :) –

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

Questo codice sarà chiaro questo problema al 100% ..

+1

È molto utile, ed è corretto usarlo – mukesh

+0

Questa dovrebbe essere la risposta, eccellente! – DarkteK

1

require_once ("class.phpmailer.php") è meglio.

Mukesh ha ragione che require_once risolverà la risposta n. 1 di Sift Exchanges. Tuttavia, non è necessario verificare se la classe esiste come require_once fa quello.

+0

Non più qualcosa a cui sto lavorando, ma grazie comunque, forse aiuterà qualcuno. – Adamantus

+0

Ciao virsunen, dove dovrebbe essere aggiunto? Ho lo stesso conflitto tra due plugin. Ho usato if (! Class_exists) {} ma quando sarà aggiornato, le modifiche spariranno. Sai dove devo aggiungere la richiesta per non perdere le modifiche? molte grazie – FranP