【问题标题】:phpmailer error Could not instantiate mail function on WINDOWS serverphpmailer错误无法在WINDOWS服务器上实例化邮件功能
【发布时间】:2013-10-08 08:30:28
【问题描述】:

我从 phpmailer(版本:5.1)收到了这个奇怪的错误:

exception 'phpmailerException' with message 'Could not instantiate mail function.' in C:\Inetpub\vhosts\mydomain\httpdocs\myscript\protected\components\phpmailer\class.phpmailer.php:687 Stack trace: #0 C:\Inetpub\vhosts\mydomain\httpdocs\myscript\protected\components\phpmailer\class.phpmailer.php(578): PHPMailer->MailSend('Date: Wed, 2 Oc...', '--b1_3c2b33630c...')

仅供参考:我正在尝试发送一个大小约为 4.5MB 的 zip 文件。但在此之前,脚本会生成大约 50 个 PDF 并添加它们/创建 zip 文件,然后将其附加到 phpmailer 对象并发送。 (我没有使用 SMTP)。

我知道之前有人问过这个问题。但是我找到的解决方案都是基于 linux 服务器的,涉及增加对 postfix 的限制。

但是如果网站托管在 Windows 机器上,我该如何解决这个问题?我有 plesk 控制面板。

提前感谢您的帮助。

[编辑]

这是代码 sn-p 以防万一:

    foreach($vars as $PDFKEY)
            {

                if($PDFKEY != null)
                {
                    if((int)$PDFKEY > 0 )
                    {

                            $filename = $this->CreatePDF($PDFKEY);

                            $emailarr[$PDFKEY['email']][] = $filename;
                            $emailIdarr[$company->email][] = $PDFKEY['email'];
                    }   
                }
            }
            sleep(20);
            //print_r($emailarr);die;

            $emailTemplate = Yii::app()->params['EmailTemplate'];

            $body                = file_get_contents($emailTemplate);

            $body                = eregi_replace("[\]",'',$body);   
            try
            {
                $mail                = new PHPMailer(true);
                if(strtolower(Yii::app()->params['SMTPStatus']) == "enabled")
                {
                    $mail->IsSMTP(); // telling the class to use SMTP
                    $mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent
                    $mail->Host          = Yii::app()->params['SMTPHost']; // sets the SMTP server
                    $mail->Port          = Yii::app()->params['SMTPPort']; // set the SMTP port for the GMAIL server
                    if(strtolower(Yii::app()->params['SMTPAuthStatus']) == "enabled")
                    {   
                        $mail->SMTPAuth      = true;                  // enable SMTP authentication
                        $mail->Username      = Yii::app()->params['SMTPUsername']; // SMTP account username
                        $mail->Password      = Yii::app()->params['SMTPPassword']; // SMTP account password
                    }
                }
                $mail->SetFrom(Yii::app()->params['EmailSendFrom']);
                $mail->AddReplyTo(Yii::app()->params['EmailSendFrom']);

                $mail->Subject       = Yii::app()->params['EmailSubject'];;
                $savePath = Yii::app()->params['PdfSavePath'];
                $mail->AddBCC(trim(Yii::app()->params['EmailBCC']));
                $b = true;
                $toEmailAdded = array();
                $ccEmailAdded = array();
                $companyCCEmailAdded = array();
                foreach($emailarr as $email=>$attachmentArr )
                {
                    try
                    {
                        if(!in_array($email, $toEmailAdded)) 
                        {
                            $toEmailAdded[] = $email;
                            $mail->AddAddress($email);
                        }
                        if(isset($_POST['emailcc']) && strlen($_POST['emailcc']) > 0)
                        {
                            if(!in_array($_POST['emailcc'], $ccEmailAdded)) 
                            {
                                $ccEmailAdded[] = trim($_POST['emailcc']);
                                $mail->AddCC(trim($_POST['emailcc']));
                            }
                        }

                        $companycc = trim($emailNamearr[$email]['companyccemail']);
                        if(isset($companycc) && strlen($companycc) > 0)
                        {
                            foreach(explode(',',trim($companycc)) as $cc)
                            {
                                if(!in_array($cc, $companyCCEmailAdded)) 
                                {
                                    $companyCCEmailAdded[] = trim($cc);
                                    $mail->AddCC(trim($cc));
                                }
                            }
                        }
                        if(count($attachmentArr) > 1) 
                        {
                            $zipFileName = "Archieve-".uniqid().".zip";
                            if($this->create_zip($attachmentArr, $zipFileName, true)) {
                                $mail->AddAttachment($SavePath.$zipFileName); // attachment 
                                sleep(20);
                            }

                        } else 
                        {
                            foreach($attachmentArr as $attachment)
                            {
                                $mail->AddAttachment($SavePath.$attachment); // attachment
                            }
                        }
                        $msgbody = str_replace("<%EMAILSENTDATE%>", date('d/m/Y', strtotime($emailNamearr[$email]['serviced'])) , $body );
                        if(isset($emailNamearr[$email]))
                        {
                            $msgbody = str_replace("<%CLIENTNAME%>", "for ".$emailNamearr[$email]['company'] , $msgbody );
                        }
                        else $msgbody = str_replace("<%CLIENTNAME%>", "" , $msgbody );
                        $mail->MsgHTML($msgbody);
                        try
                        {
                            $mail->Send(); 
                        }catch(Exception $e)
                        {
                            echo "<br/><br/>$e<br/><br/>".$e;die;
                        }
                        //echo "$email <br/>";
                        $mail->ClearAddresses();
                        $mail->ClearAttachments();
                        $mail->ClearCCs();


                    } catch (Exception $e) {
                        echo $e->getMessage(); //Boring error messages from anything else!
                        $b = false;
                    }
                }
            }

【问题讨论】:

  • 顺便说一句:在 PLESK 中:服务器范围的邮件设置->最大邮件大小为 9000 KB。当我尝试发送 4.5MB 附件时,我认为这已经足够了。
  • 可以分享一下相关代码吗?
  • 嗨@sanki,感谢您的评论。出于明显的原因,我没有发布确切的代码。但这是它的要点.. [查看我的回复帖子]

标签: php zip pdf-generation phpmailer html2pdf


【解决方案1】:

在我的头上扯掉了很多头发后,我想我有点解决这个问题。这是我所做的(以防其他人面临同样的问题)

在 IIS->我的网站->错误页面->编辑功能设置下 默认情况下,出于安全目的选择本地请求的详细错误。 这引发了 500 错误,但隐藏了实际原因。通过将其更改为“详细错误”,揭示了实际错误: “FastCGI 进程超出”我相信默认为 30 秒。

因此,即使我设置了 max_execution_limit = 300,进程也会因为 php-cgi.exe 的执行时间限制而停止/失败。 要解决这个问题: 编辑 %windir%\system32\inetsrv\config\applicationHost.config 文件以延长 php-cgi.exe 执行时间限制。设置 activityTimeout:3600 和 requestTimeout:3600 .. 我设置 3600 是安全的,因为我可以。

然后应用程序运行得很好。

希望这有助于为某人节省头发。

【讨论】:

    【解决方案2】:

    我认为:

     Yii::app()->params['SMTPStatus'] is not 'enabled'
    

    所以phpmailer使用php本机邮件功能女巫,我认为,在你的php.ini中没有配置

    希望对你有帮助

    【讨论】:

    • 嗨@Claude Janz,感谢您的回复。但是 "Yii::app()->params['SMTPStatus']" ... 与 PhpMailer 无关,并且已启用。在将其发布到堆栈溢出之前,我已经对其进行了三次检查,以避免任何形式的愚蠢。
    猜你喜欢
    • 2015-08-19
    • 2019-07-24
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多