php PHPMailer 异常错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10734397/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 22:54:26  来源:igfitidea点击:

PHPMailer exception error

phpcodeigniterphpmailer

提问by Adamantus

I've written my own Code Igniter model for sending emails. All was fine until recently when I started to get this error:

我已经编写了自己的 Code Igniter 模型来发送电子邮件。一切都很好,直到最近我开始收到此错误:

Fatal error: Cannot redeclare class phpmailerException in /home/mysite/public_html/subdir/application/libraries/phpmailer/class.phpmailer.php on line 2319

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

I'm using:

我正在使用:

CodeIgniter 2 PHPMailer 5.1

CodeIgniter 2 PHPMailer 5.1

I've tried the following to resolve it:

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

  • Added "$mail->SMTPDebug = 0" to turn off errors.
  • Added: "$mail->MailerDebug = false;"
  • Modified the PHPMailer to only show errors when SMTPDebug is turned on.
  • Looked for and removed any echo statements
  • Added try / catch blocks Tried adding / removing: $mail = new PHPMailer(true);
  • 添加了“$mail->SMTPDebug = 0”以关闭错误。
  • 添加:“$mail->MailerDebug = false;”
  • 修改 PHPMailer 以仅在打开 SMTPDebug 时显示错误。
  • 查找并删除了所有 echo 语句
  • 添加了 try/catch 块尝试添加/删除:$mail = new PHPMailer(true);

Here is my controller method (company/contact) which calls my model (message_model):

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

Here is my model's method to send the emails. It used to work but without any changes I can think of now I get an exception error:

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

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

回答by mukesh

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

This Code will clear this issue 100%..

本守则将 100% 清除此问题..

回答by Laurence

Basically one of two things is happening:

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

  1. You are "including" your PHP code twice somewhere, causing the 2nd time to generate the redeclaration error

  2. You are using "phpmailerException" somewhere else, besides your model. Have you tried to do a "find all" in your IDE for ALL calls to "phpmailerException" - perhaps you used this name in another area for another exception?

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

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

回答by virsunen

require_once("class.phpmailer.php") is better.

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

Mukesh is right that require_once will solve Sift Exchanges answer #1. However, there is not need to check if the class exists as require_once does that.

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