设置发货追踪编号时以编程方式发送电子邮件

时间:2012-01-09 19:13:45

标签: magento

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

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

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

3 个答案:

答案 0 :(得分:10)

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

更新:如果跟踪号是通过'标准'方法添加到货件,也就是说货件api的addTrack方法,那么您将能够挂钩sales_order_shipment_track_save_after事件。添加一个沿着......的行做某事的观察者。

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

答案 1 :(得分:6)

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

注意:如果您正在实施此功能,您可能想要将电子邮件标志发送到sales_order_shipment.create()API调用,因为这将导致两封电子邮件发出同一个订单,一封没有跟踪号码,一封包含跟踪号码。

addTrack()可能已经实现,你只需要立即使用sendInfo()。

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

发出的电子邮件与您通过点击"发送跟踪信息" Magento后端手动按钮。有关addTrack和一般使用SOAP API的更多说明,请参考Magento API

至于sendInfo(),请查看来自magento / app / 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;
}

答案 2 :(得分:0)

如果您希望包含跟踪信息的电子邮件在某个程序时发送,例如eBridge调用salesOrderShipmentAddTrack V2 API,你也可以扩展Mage_Sales_Model_Order_Shipment_Api

e.g。

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>

请注意,使用此方法,并使用System&gt;配置&gt;销售&gt;销售电子邮件&gt;启用订单和发货电子邮件,您的客户将获得 - 一封确认新订单的电子邮件 - 没有跟踪号码的第二封电子邮件 - 来自您的API扩展程序的带有跟踪号的货件的第三封电子邮件。

我试过评论Api.php创建函数的

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

但第二封电子邮件不断发送。