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