Magento:仅发送带有cronjobs的新订单电子邮件


11

如何使用以下方式发送新订单电子邮件:

$order->sendNewOrderEmail();

仅来自“我的自定义模块”中使用的cronjob。

感谢帮助。

Answers:


8

我会禁用 System > Configuration > Sales Email > Order > Enabled

这样可以确保在正常执行期间不会发送

public function sendNewOrderEmail()
{
    $storeId = $this->getStore()->getId();

    if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
        return $this;
    }

然后在您的自定义模块中包含类似

    Mage::getConfig()->setNode(
        'default/'.Mage_Sales_Model_Order::XML_PATH_EMAIL_ENABLED, true
    );
    foreach(Mage::app()->getStores() as $storeCode=>$store){
        Mage::getConfig()->setNode(
            "stores/{$storeCode}/".Mage_Sales_Model_Order::XML_PATH_EMAIL_ENABLED, true
        );
    }
    $collection = Mage::getModel('sales/order')->getCollection()->addAttributeToFilter('email_sent', 0);
    foreach ($collection as $order){
        $order->sendNewOrderEmail();
    }

主要思想是在运行时覆盖禁用的配置值。该代码未经测试,但应该为您提供一个起点。进一步建议阅读Alan的博客:http : //alanstorm.com/magento_loading_config_variables http://alanstorm.com/magento_config_a_critique_and_caching

您可能会遇到的一个问题是上述内容的缓存值。

第二种选择是从sendNewOrderEmail()复制代码。


天才。纯洁,天真无邪的天才。
philwinkle

1
奉承会让你无处不在;-)
克里斯托夫在Fooman,2013年

3

进行这种(根本)更改的本质如下:

  • 重写sendNewOrderEmail以充当队列,并根据队列模式有条件地发送/不发送消息(请参见下面的一些伪代码)
  • 基于销售订单模型的队列模式,我们通过从cron作业加载订单并手动发送电子邮件来从队列发送电子邮件。

销售订单模型的一些示例代码重写:

以下代码将取决于是否存在称为的表,yourmodule_sales_email_queue而我将使用魔术吸气剂来引用某些列。我将不提供模式,因为它不是功能齐全的代码,只是一种概念证明。不是工作模块。

将此添加到模块的etc / config.xml中

<global>
    <model>
        <emailqueue>
            <class>YourCompany_YourModule_Model</class>
            <resourceModel>emailqueue_resource</resourceModel>
        </emailqueue>
        <emailqueue_resource>
            <class>YourCompany_YourModule_Model_Resource</class>
            <entities>
                <queue>
                    <table>yourmodule_sales_email_queue</table>
                </queue>
            </entities>
        </emailqueue_resource>
        <sales>
            <rewrite>
                <order>YourCompany_YourModule_Model_Order</order>
            </rewrite>
        </sales>
    </model>
</global>

应用程序/代码/本地/YourCompany/YourModule/Model/Order.php

<?php

class YourCompany_YourModule_Model_Order extends Mage_Sales_Model_Order
{
    protected $_isQueueMode = false;

    public function sendNewOrderEmail()
    {       
        //send order email if our custom queue mode is set
        if($this->_isQueueMode){
            parent::sendNewOrderEmail();
            return;
        }

        //not running from queue, let's shove stuff into the queue
        $this->getEmailQueue()->load($this)->save();
    }


    public function getEmailQueue()
    {
        if(!isset($this->queue)){
            $this->queue = $this->_getEmailQueue();
        }
        return $this->queue;
    }

    protected function _getEmailQueue()
    {
        return Mage::getResourceModel('emailqueue/queue');
    }


}

在这里,您需要定义一个资源模型,一个集合和一个cron worker。

etc / config.xml中的cron定义如下所示:

<crontab>
    <jobs>
        <emailqueue_send_order_emails>
            <schedule>
                <cron_expr>0 0 * * *</cron_expr>
            </schedule>
            <run>
                <model>emailqueue/observer::sendEmailsFromQueue</model>
            </run>
        </emailqueue_send_order_emails>
    </jobs>
</crontab>

从类中调用一个方法YourCompany_YourModule_Model_Observer。我们将从队列中加载最近24小时的电子邮件,加载相关的订单,并设置标记以允许其发送电子邮件。然后,我们将调用电子邮件发送方法:

<?php

class YourCompany_YourModule_Model_Observer
{
    public function sendEmailsFromQueue($observer)
    {
        //load queue and define the run window
        $queue = Mage::getModel('emailqueue/queue')->getCollection()->getSelect()
                ->where('created_at',array('lt'=>Zend_Db_Expr('NOW()')))
                ->where('created_at',array('gt'=>Zend_Db_Expr('NOW() - INTERVAL 24 HOUR')));

        foreach($queue as $worker){
            //logic to send the email e.g.:
            $order = Mage::getModel('sales/order')->loadByIncrementId($worker->getOrderIncrementId());
            $order->_isQueueMode = true;
            $order->sendNewOrderEmail();
        }

    }
}

免责声明:

请注意,以上代码未经测试,因此无法单独运行。它期望存在许多功能(如集合)。我也很想写它,可能会有不一致之处,因为自从开始回答以来,我已经改变了主意如何处理一两次。

这是为了让您起步并思考如何实现此目的。我愿意回答您可能遇到的任何问题。我也愿意在Github上为这种模块的开源版本做出贡献。

祝你好运!


与@fooman的解决方案相比,这是工程过度的工作,我喜欢他的解决方案比我的要好:)
philwinkle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.