首页 文章

PHPMailer异常错误

提问于
浏览
6

我编写了自己的Code Igniter模型来发送电子邮件 . 一切都很好,直到最近我才开始出现这个错误:

致命错误:无法在第2319行的/home/mysite/public_html/subdir/application/libraries/phpmailer/class.phpmailer.php中重新声明类phpmailerException

我正在使用:

CodeIgniter 2 PHPMailer 5.1

我尝试过以下方法来解决它:

  • 添加"$mail->SMTPDebug = 0"以关闭错误 .

  • 已添加:"$mail->MailerDebug = false;"

  • 修改了PHPMailer,仅在打开SMTPDebug时显示错误 .

  • 查找并删除了任何echo语句

  • 添加了try / catch块尝试添加/删除:$ mail = new PHPMailer(true);

这是我的控制器方法(公司/联系人),它调用我的模型(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')."

"; $message.=convert_nl($this->input->post('desc_field')); $message.="

Reply to this person by clicking this link: <a href=\"mailto:".$this->input->post('email_field')."\">".$this->input->post('name_field')."</a>

"; $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); }

这是我的模型发送电子邮件的方法 . 它曾经工作但没有任何改变我现在可以想到我得到一个异常错误:

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.
\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; }

3 回答

  • 8

    基本上发生了两件事之一:

    • 您在某处“包含”了两次PHP代码,导致第二次生成重新声明错误

    • 除了模型之外,你在其他地方使用“phpmailerException” . 您是否尝试在IDE中为所有调用“phpmailerException”执行“查找全部” - 也许您在另一个区域中使用此名称作为另一个例外?

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

    本规范将100%清除此问题..

  • 9

    require_once(“class.phpmailer.php”)更好 .

    Mukesh是对的,require_once将解决Sift Exchanges的答案#1 . 但是,不需要检查类是否存在,因为require_once会这样做 .

相关问题