从错误日志中了解堆栈跟踪? (Magento的)

时间:2012-09-23 19:10:55

标签: magento

我一直在寻找有关如何阅读和理解堆栈跟踪的指南。 在这种情况下,人们在尝试填写并发送联系表单时会收到错误。而且我真的无法解决这个问题,而且当我无法破译堆栈时,这并不容易。 (这是一个magento 1.6.2安装)

电子邮件正在发送,但联系表单告诉用户存在问题,因此我们会再次尝试再次尝试使用重复项。

exception 'Zend_Mail_Transport_Exception' with message 'Unable to send mail. mail(/var/www/site.dk/logs/php-maillog.log): failed to open stream: Permission denied' in /var/www/site.dk/public_html/lib/Zend/Mail/Transport/Sendmail.php:137
Stack trace: 
#0 /var/www/site.dk/public_html/lib/Zend/Mail/Transport/Abstract.php(348):      Zend_Mail_Transport_Sendmail->_sendMail()
#1 /var/www/site.dk/public_html/lib/Zend/Mail.php(1194): Zend_Mail_Transport_Abstract->send(Object(Zend_Mail))
#2 /var/www/site.dk/public_html/app/code/core/Mage/Core/Model/Email/Template.php(409): Zend_Mail->send()
#3 /var/www/site.dk/public_html/app/code/core/Mage/Core/Model/Email/Template.php(462): Mage_Core_Model_Email_Template->send('email@email.com', NULL, Array)
#4 /var/www/site.dk/public_html/app/code/core/Mage/Contacts/controllers/IndexController.php(104): Mage_Core_Model_Email_Template->sendTransactional('1', 'general', 'email@email.com', NULL, Array)
#5 /var/www/site.dk/public_html/app/code/local/Mage/Core/Controller/Varien/Action.php(420): Mage_Contacts_IndexController->postAction()
#6 /var/www/site.dk/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('post')
#7 /var/www/site.dk/public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#8 /var/www/site.dk/public_html/app/code/local/Mage/Core/Model/App.php(348): Mage_Core_Controller_Varien_Front->dispatch()
#9 /var/www/site.dk/public_html/app/Mage.php(640): Mage_Core_Model_App->run(Array)
#10 /var/www/site.dk/public_html/shop/index.php(80): Mage::run('store...', 'store')
#11 {main}

sendmail.php的片段

public function _sendMail()
{
    if ($this->parameters === null) {
        set_error_handler(array($this, '_handleMailErrors'));
        $result = mail(
            $this->recipients,
            $this->_mail->getSubject(),
            $this->body,
            $this->header);
        restore_error_handler();
    } else {
        if(!is_string($this->parameters)) {
            /**
             * @see Zend_Mail_Transport_Exception
             * 
             * Exception is thrown here because
             * $parameters is a public property
             */
            #require_once 'Zend/Mail/Transport/Exception.php';
            throw new Zend_Mail_Transport_Exception(
                'Parameters were set but are not a string'
            );
        }

        set_error_handler(array($this, '_handleMailErrors'));
        $result = mail(
            $this->recipients,
            $this->_mail->getSubject(),
            $this->body,
            $this->header,
            $this->parameters);
        restore_error_handler();
    }

    if ($this->_errstr !== null || !$result) {
        /**
         * @see Zend_Mail_Transport_Exception
         */
        #require_once 'Zend/Mail/Transport/Exception.php';
       (137) throw new Zend_Mail_Transport_Exception('Unable to send mail. ' . $this->_errstr);
    }
}

2 个答案:

答案 0 :(得分:4)

我打算把它写成评论,但评论框的时间太长了。

如果我们逐行浏览堆栈跟踪,您将开始了解正在发生的事情:

exception 'Zend_Mail_Transport_Exception' with message 'Unable to send mail. mail(/var/www/site.dk/logs/php-maillog.log): failed to open stream: Permission denied' in /var/www/site.dk/public_html/lib/Zend/Mail/Transport/Sendmail.php:137

首先,异常类型是Zend_Mail_Transport_Exception,它会让我们知道从哪里开始寻找。在这种情况下,它是在Zend_Mail代码中的某处发生的错误。

其次,消息'Unable to send mail. mail(/var/www/site.dk/logs/php-maillog.log): failed to open stream: Permission denied'。对我来说,这似乎很清楚,当php-maillog.log试图打开时,我们收到一个权限被拒绝错误。是什么导致了这个?这就是你必须要确定的。

第三,我们会看到异常实际发生的地方/var/www/site.dk/public_html/lib/Zend/Mail/Transport/Sendmail.php:137。因此,正如您所指出的那样,它发生在Sendmail.php的第137行。

堆栈跟踪的其余部分是PHP用于获取错误的路径。也就是说,哪个函数调用了什么来达到你看到异常的程度。这是从最后添加到堆栈中的东西报告的,回到第一个,所以你几乎通过函数调用向后追踪你的代码。

在这种情况下,您可以看到/var/www/site.dk/public_html/lib/Zend/Mail/Transport/Abstract.php第348行上的代码调用了_sendMail函数,该函数异常......第348行代码由/var/www/site.dk/public_html/lib/Zend/Mail.php中第1194行的代码调用,等等。

<强> TL:DR

Magento在打开/var/www/site.dk/logs/php-maillog.log文件时遇到问题。是否为此文件正确设置了权限? /var/www/site.dk/logs/目录是否存在?

答案 1 :(得分:0)

解决方案1 ​​

首先使用以下命令找到没有电子邮件的订单

 SELECT *
 FROM `sales_flat_order`
 WHERE `customer_email` IS NULL

现在我建议更新该订单

UPDATE `sales_flat_order` SET `customer_email` = '*******@yahoo.com' WHERE `sales_flat_order`.`entity_id` =YOUR_ORDER_ID ;

现在在core_email_queue

中找到此订单
select * from `core_email_queue` WHERE entity_id='YOUR_ORDER_ID'; ///Note this is not order number. 
////you can get order id from the url of admin of order

如果您发送自己的订单副本

,则应该有2个条目

现在找到core_email_queue_recipients中的相应内容

select * from `core_email_queue_recipients` WHERE message_id='MESSAGE_ID_FROM_core_email_queue'
select * from `core_email_queue_recipients` WHERE message_id='MESSAGE_ID_FROM_core_email_queue'

如果你在core_email_queue_recipients中没有message_id,那么你应该从core_email_queue中删除它

解决方案2:快速&amp;脏了

我还没有尝试过的其他快速而肮脏的解决方案,但你可以先试用测试服务器

TRUNCATE core_email_queue_recipients;
TRUNCATE core_email_queue;

http://webdevelopmentsupport.net/2015/10/28/magento-order-email-not-sent-but-cron-job-running-exception-zend_mail_transport_exception-with-message-missing-to-header-in-varwwwhtmlshoplibzendmailtransportsendmail-php182/