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 时显示错误。
  • 查找并删除任何回声语句
  • 添加了 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')."<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);
    }

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

    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;
    }
4

3 回答 3

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

本准则将 100% 清除此问题。

于 2013-11-18T05:11:26.393 回答
8

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

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

  2. 除了模型之外,您还在其他地方使用“phpmailerException”。您是否尝试在您的 IDE 中为所有对“phpmailerException”的调用执行“查找全部” - 也许您在另一个区域使用此名称来处理另一个异常?

于 2012-05-24T09:14:11.543 回答
2

require_once("class.phpmailer.php") 更好。

Mukesh 是对的,require_once 将解决 Sift Exchanges 的答案 #1。但是,不需要像 require_once 那样检查类是否存在。

于 2014-05-06T17:46:10.473 回答