1

我一直在寻找有关如何阅读和理解堆栈跟踪的指南。在这种情况下,人们在尝试填写和发送联系表时会遇到错误。而且我真的很难解决这个问题,当我无法破译堆栈时,这并不容易。(这是一个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);
    }
}
4

2 回答 2

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 获取错误的路径。也就是说,哪个函数调用了什么来达到您看到异常的地步。这是从要添加到堆栈中的最后一件事报告的,回到第一件事,因此您几乎可以通过函数调用向后跟踪您的代码。

在这种情况下,您可以看到第 348 行的代码/var/www/site.dk/public_html/lib/Zend/Mail/Transport/Abstract.php调用了异常的 _sendMail 函数……第 348 行的代码被第 1194 行的代码调用,/var/www/site.dk/public_html/lib/Zend/Mail.php依此类推。

TL:博士?

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

于 2012-09-23T21:09:53.853 回答
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:快速和肮脏的一个

我没有尝试过的其他快速而肮脏的解决方案,但您可以先在测试服务器上尝试是

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/

于 2015-10-28T08:06:36.637 回答