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

これをコメントとして書くつもりでしたが、コメント欄には長すぎます。

スタックトレースを1行ずつ調べると、何が起こっているのかが理解できるようになります。

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:DR?

Magentoで/var/www/site.dk/logs/php-maillog.logファイルを開く際に問題が発生しています。このファイルのアクセス許可は正しく設定されていますか?/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: クイック & ダーティー 1

私が試していない他の迅速で汚い解決策ですが、最初にテストサーバーで試すことができます

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-varwwwhtmlshoplibzendmailtransportendmail- php182/

于 2015-10-28T08:06:36.637 に答える