2012-05-24 15 views
6

Escribí mi propio modelo Code Igniter para enviar correos electrónicos. Todo estaba bien hasta hace poco cuando empecé a obtener este error:Error de excepción de PHPMailer

Fatal error: No se puede redeclare phpmailerException clase en /home/mysite/public_html/subdir/application/libraries/phpmailer/class.phpmailer.php en la línea 2319

que estoy usando:

CodeIgniter 2 PHPMailer 5,1

he intentado lo siguiente para resolverlo:

  • Agregó "$ mail-> SMTPDebug = 0" para desactivar los errores.
  • Agregado: "$ mail-> MailerDebug = false;"
  • Se modificó el PHPMailer para que solo muestre errores cuando SMTPDebug está activado.
  • Se buscó y eliminó cualquier declaración de eco
  • Se agregaron bloques try/catch Se intentó agregar/eliminar: $ mail = new PHPMailer (true);

Aquí es mi método controlador (empresa/contacto) que llama a mi modelo (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); 
    } 

Aquí es el método de mi modelo para enviar los correos electrónicos. Se utiliza para trabajar, pero sin ningún tipo de cambios que se me ocurre ahora me sale un error de excepción:

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, funcionó pero no sé por qué. Solo puedo encontrar un lugar donde incluí el código. ¡Gracias! No agregaron esto como una respuesta, así que tendré que dar crédito al otro tipo que llegó un poco más tarde. – Adamantus

+0

es un lugar, pero llama a la función varias veces. Por lo tanto, esa línea se ejecuta varias veces – zerkms

Respuesta

8

Básicamente una de dos cosas está sucediendo:

  1. Usted está "incluyendo" su código PHP dos veces en algún lugar, causando la segunda vez para generar el error de redeclaración

  2. Usted está utilizando "phpmailerException" en otro lugar, además de su modelo. ¿Has intentado hacer un "buscar todo" en tu IDE para TODAS las llamadas a "phpmailerException"? ¿Tal vez usaste este nombre en otra área para otra excepción?

+0

Me salvaste hombre ... :) –

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

Este Código se borrará este tema 100% ..

+1

Es muy útil, y es correcto usarlo – mukesh

+0

Esta debería ser la respuesta, ¡excelente! – DarkteK

1

require_once ("class.phpmailer.php") es mejor.

Mukesh tiene razón en que require_once resolverá la respuesta de Sift Exchanges # 1. Sin embargo, no es necesario verificar si la clase existe ya que require_once hace eso.

+0

Ya no es algo en lo que estoy trabajando, pero gracias de todos modos, tal vez ayudará a alguien. – Adamantus

+0

Hola virsunen, ¿dónde debería agregarse eso? Tengo el mismo conflicto entre dos complementos. He usado if (! Class_exists) {} pero cuando se actualizará, los cambios desaparecerán. ¿Sabes dónde debo agregar el requerimiento para no perder los cambios? Muchas gracias – FranP

Cuestiones relacionadas