【问题标题】:Programmatically send email when shipping tracking number is set设置运输跟踪号时以编程方式发送电子邮件
【发布时间】:2012-01-09 19:13:45
【问题描述】:

我正在寻找一种在将跟踪号分配给订单时以编程方式向用户发送电子邮件的方法。我需要能够以编程方式执行此操作,因为我使用外部资源来填充跟踪信息。

我想我在这里真正寻找的是一个特定的触发器或事件,我可以使用它来触发通常在管理员单击“发送跟踪信息”按钮时发送的电子邮件。我浏览了核心代码,但无法确定按下该按钮时实际触发了什么操作。

我们正在使用第三方 (eBridge) 来连接我们的销售工具。一旦订单被标记为已发货并将跟踪号输入到 eBridge 工具中,它将与 magento 对话并将跟踪号输入到订单中。问题是它没有告诉 magento 发送一封电子邮件来向客户提供这个新输入的跟踪号。我想做的是,一旦将信息放入 magento,就会从 magentos 端发送一封电子邮件。这可能吗?简而言之,我们想要的是能够让 magento 发送一封包含跟踪信息的电子邮件,而无需手动进入每个订单并单击“发送跟踪信息”按钮。

【问题讨论】:

    标签: magento


    【解决方案1】:

    当您通过控制面板向订单添加新货件时,您可以勾选一个框以发送电子邮件。如果您需要以编程方式发送此信息,管理区域的控制器只需调用 Mage_Sales_Model_Order_Shipment 上的 sendEmail 方法即可。

    更新:如果通过“标准”方法(即货件 api 的 addTrack 方法)将跟踪号添加到货件中,那么您将能够连接到sales_order_shipment_track_save_after 事件。添加一个观察者,做一些事情......

    public function sendTrackEmail($observer)
    {
        $track = $observer->getEvent()->getTrack();
        $shipment = $track->getShipment(true);
        $shipment->sendEmail();
    }
    

    【讨论】:

    • 在将跟踪代码添加到货件时是否有特定的侦听器/观察器?
    • 这在很大程度上取决于如何添加跟踪代码。
    • 将跟踪代码放在运输信息中的实际跟踪代码字段而不是仅作为评论添加是否有帮助?
    • 那么我要扩展什么类来做到这一点? Mage_Sales_Model_Order_Shipment_?
    • 你不需要扩展任何类,你只需要为事件创建一个观察者。您只需将该方法添加到新模型中,并将该方法添加为事件观察者magentocommerce.com/knowledge-base/entry/…
    【解决方案2】:

    仅供参考,有一个 undocumented API 调用正是这样做的,即 sendInfo()。我不知道这是在哪个版本中添加的,据我所知它已经有一年多了,我只需要自己解决同样的问题,这是 Google 上的第一个结果。

    注意:如果您正在实施此操作,您可能希望将电子邮件标志发送到 sales_order_shipment.create() API 调用,因为这会导致在针对同一订单的两封电子邮件中,一封没有追踪号码,另一封有追踪号码。

    addTrack() 可能已经实现了,你只需要立即用 sendInfo() 跟随它。

    sales_order_shipment.addTrack(sessionId, shipmentIncrementId, carrier, title, trackNumber)
    sales_order_shipment.sendInfo(sessionId, comment)
    

    发送的电子邮件与手动单击 Magento 后端中的“发送跟踪信息”按钮所获得的电子邮件相同。参考Magento API 了解有关 addTrack 和一般使用 SOAP API 的更多说明。

    至于sendInfo(),具体请看magento/app/code/core/Mage/Sales/Model/Order/Shipment/Api.php的源码寻求帮助:

    /**
     * Send email with shipment data to customer
     *
     * @param string $shipmentIncrementId
     * @param string $comment
     * @return bool
     */
    public function sendInfo($shipmentIncrementId, $comment = '')
    {
        /* @var $shipment Mage_Sales_Model_Order_Shipment */
        $shipment = Mage::getModel('sales/order_shipment')->loadByIncrementId($shipmentIncrementId);
    
        if (!$shipment->getId()) {
            $this->_fault('not_exists');
        }
    
        try {
            $shipment->sendEmail(true, $comment)
                ->setEmailSent(true)
                ->save();
            $historyItem = Mage::getResourceModel('sales/order_status_history_collection')
                ->getUnnotifiedForInstance($shipment, Mage_Sales_Model_Order_Shipment::HISTORY_ENTITY_NAME);
            if ($historyItem) {
                $historyItem->setIsCustomerNotified(1);
                $historyItem->save();
            }
        } catch (Mage_Core_Exception $e) {
            $this->_fault('data_invalid', $e->getMessage());
        }
    
        return true;
    }
    

    【讨论】:

    • 这就是我需要的。非常感谢!
    【解决方案3】:

    如果您希望在某些程序(例如eBridge 调用 salesOrderShipmentAddTrack V2 API,您也可以扩展 Mage_Sales_Model_Order_Shipment_Api

    例如

    class PKS_Sales_Model_Order_Shipment_Api extends Mage_Sales_Model_Order_Shipment_Api
    public function addTrack
    

    通过在 try 块中添加发送电子邮件的调用,例如

    try {
            $shipment->save();
            $track->save();
            $shipment->sendEmail(true, '')
                ->setEmailSent(true)
                ->save();  /* added email with null comment */
     }
    

    您还必须提供 SOAP V2 的扩展,例如

    class PKS_Sales_Model_Order_Shipment_Api_V2 extends PKS_Sales_Model_Order_Shipment_Api
    

    即使它没有方法:)

    (示例有我的 app/code/local/PKS/Sales 模块,用您的公司名称替换​​ PKS,抱歉重新格式化)

    app/code/local/PKS/Sales/etc/config.xml

    <?xml version="1.0" encoding="UTF-8"?>   
    <config>
    <modules>
    <PKS_Sales>
        <version>4.0.0.0</version>
        <depends>
            <Mage_Sales />
        </depends>
    </PKS_Sales>
    </modules>
    <global>
    <models>
    <sales>
        <rewrite>
                 <order_shipment_api>PKS_Sales_Model_Order_Shipment_Api</order_shipment_api>       
         <order_shipment_api_v2>PKS_Sales_Model_Order_Shipment_Api_V2</order_shipment_api_v2>
              </rewrite>
    </sales>
    </models>
    </global>
    </config>
    

    花了更多时间弄清楚如何编写所需的 PKS/Sales/etc/api.xml (示例有我的 app/code/local/PKS 模块,用您的公司名称替换​​ PKS)

    <config>
    <api>
        <resources>
            <sales_order_shipment translate="title" module="PKS_Sales">
                <title>Modified Shipment API</title>
                <model>sales/order_shipment_api</model>
                <acl>sales/order/shipment</acl>
                <methods>
                    <addTrack translate="title" module="PKS_Sales">
                        <title>Add new tracking number</title>
                        <acl>sales/order/shipment/track</acl>
                    </addTrack>
                </methods>
                <faults module="PKS_Sales">
                    <not_exists>
                        <code>100</code>
                        <message>Requested shipment does not exist.</message>
                    </not_exists>
                    <filters_invalid>
                        <code>101</code>
                        <message>Invalid filters given. Details in error message.</message>
                    </filters_invalid>
                    <data_invalid>
                        <code>102</code>
                        <message>Invalid data given. Details in error message.</message>
                    </data_invalid>
                    <order_not_exists>
                        <code>103</code>
                        <message>Requested order does not exist.</message>
                    </order_not_exists>
                    <track_not_exists>
                        <code>104</code>
                        <message>Requested tracking does not exist.</message>
                    </track_not_exists>
                    <track_not_deleted>
                        <code>105</code>
                        <message>Tracking not deleted. Details in error message.</message>
                    </track_not_deleted>
                </faults>
            </sales_order_shipment>
        </resources>
        <resources_alias>
            <order>sales_order</order>
      <order_shipment>sales_order_shipment</order_shipment>
        </resources_alias>
        <v2>
            <resources_function_prefix>
                <order>salesOrder</order>
          <order_shipment>salesOrderShipment</order_shipment>
            </resources_function_prefix>
        </v2>
        </acl>
    </api>
    </config>
    

    请注意,使用这种方法,并启用系统 > 配置 > 销售 > 销售电子邮件 > 订单和发货电子邮件,您的客户将获得 - 一封确认新订单的电子邮件 - 第二封没有运单号的邮件 - 来自您的 API 扩展的第三封带有跟踪号的货件电子邮件。

    我试过注释掉 Api.php 创建函数的

    $shipment->sendEmail($email, ($includeComment ? $comment : ''));
    

    但第二封电子邮件一直在发送。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多