Magento 设置装运跟踪编号时以编程方式发送电子邮件

Magento 设置装运跟踪编号时以编程方式发送电子邮件,magento,Magento,我正在寻找一种方法,当跟踪号码被分配给订单时,通过编程向用户发送电子邮件。我需要能够通过编程实现这一点,因为我正在使用外部源来填充跟踪信息 我想我在这里真正寻找的是一个特定的触发器或事件,我可以使用它来触发通常在管理员单击“发送跟踪信息”按钮时发送的电子邮件。我浏览了核心代码,但无法确定按下按钮时实际触发了什么动作 我们正在使用第三方(eBridge)连接我们的销售工具。一旦订单被标记为已发货,并将跟踪号输入eBridge工具,eBridge工具将与magento对话,并将跟踪号输入订单。问题是

我正在寻找一种方法,当跟踪号码被分配给订单时,通过编程向用户发送电子邮件。我需要能够通过编程实现这一点,因为我正在使用外部源来填充跟踪信息

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


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

当您通过控制面板向订单添加新装运时,您可以勾选一个框来发送电子邮件。如果您需要以编程方式发送此消息,管理区域的控制器只需调用
Mage\u Sales\u Model\u Order\u shipping
上的
sendmail
方法即可

更新:如果通过“标准”方法(即装运api的addTrack方法)将跟踪号添加到装运中,则您可以在事件发生后连接到销售\订单\装运\跟踪\保存\中。添加一个观察者,该观察者按照

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

如果您希望在某些程序(如eBridge)调用salesOrderShipmentAddTrack V2 API时发送包含跟踪信息的电子邮件,还可以扩展Mage_Sales_Model_Order_Shipping_API

e、 g

通过在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
即使它没有方法:)

(示例中有my 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>
请注意,使用此方法,并启用系统>配置>销售>销售电子邮件>订单和发货电子邮件,您的客户将获得 -一封确认新订单的电子邮件 -没有跟踪号码的装运的第二封电子邮件 -第三封带有跟踪号的装运电子邮件,来自您的API扩展

我已经尝试注释了Api.php create函数的

$shipment->sendEmail($email, ($includeComment ? $comment : ''));
但是第二封电子邮件一直在发送。

仅供参考,有一个未记录的API调用正是这样做的,sendInfo()。我不知道它添加了什么版本,据我所知它已经有一年多的历史了,我只是自己解决了同样的问题,这是谷歌的第一个结果之一

注意:如果您正在实施此操作,您可能不想向sales\u order\u Shipping.create()API调用发送电子邮件标志,因为这将导致针对同一订单发送两封电子邮件,一封没有跟踪号,另一封有跟踪号

addTrack()可能已经实现,您只需立即使用sendInfo()跟踪它

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

具体到sendInfo(),请查看magento/app/code/core/Mage/Sales/Model/Order/shipping/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;
}

是否有一个特定的监听器/观察者来记录跟踪代码何时添加到装运中?这在很大程度上取决于跟踪代码是如何添加的。说跟踪代码是作为注释添加到装运信息中的实际跟踪代码字段中是否有帮助?那么,我将在哪个类中进行扩展要这样做吗?Mage\u Sales\u Model\u Order\u shipping\u?您不需要扩展任何类,只需为事件创建一个观察者。您只需要将该方法添加到一个新模型中,并将该方法添加为事件观察者—这就是我所需要的。非常感谢你!
$shipment->sendEmail($email, ($includeComment ? $comment : ''));
sales_order_shipment.addTrack(sessionId, shipmentIncrementId, carrier, title, trackNumber)
sales_order_shipment.sendInfo(sessionId, comment)
/**
 * 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;
}