添加新客户时的电子邮件通知 - Magento

时间:2012-07-03 12:26:46

标签: magento

每次新客户注册时,我都会向商店的联系电子邮件地址发送电子邮件通知。

我不想购买任何类型的扩展程序,所以请帮我这样做

提前致谢

7 个答案:

答案 0 :(得分:7)

最佳做法是使用Magento的事件系统。

应用的/ etc /模块/ Your_Module.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Your_Module>
            <active>true</active>
            <codePool>local</codePool>
        </Your_Module>
    </modules>
</config>

应用/核心/本地/你/模块的/ etc / config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <global>
        <models>
            <your_module>
                <class>Your_Module_Model</class>
            </your_module>
        </models>
    </global>
    <frontend>
        <events>
            <customer_save_after>
                <observers>
                    <your_module>
                        <type>model</type>
                        <class>your_module/observer</class>
                        <method>customerSaveAfter</method>
                    </your_module>
                </observers>
            </customer_save_after>
        </events>
    </frontend>
</config>

应用/代码/本地/你/模块/型号/ Observer.php

<?php

class Your_Module_Model_Observer
{
    public function customerSaveAfter(Varien_Event_Observer $o)
    {
        //Array of customer data
        $customerData = $o->getCustomer()->getData();

        //email address from System > Configuration > Contacts
        $contactEmail = Mage::getStoreConfig('contacts/email/recipient_email');

        //Mail sending logic here.
        /*
           EDIT: AlphaCentauri reminded me - Forgot to mention that
           you will want to test that the object is new. I **think**
           that you can do something like:
        */
        if (!$o->getCustomer()->getOrigData()) {
            //customer is new, otherwise it's an edit 
        }
    }
}

编辑:请注意代码中的编辑 - 正如AlphaCentauri指出的那样,插入和更新都会触发customer_save_after事件。 _origData条件逻辑应该允许您合并他的邮件逻辑。 _origData将为null

答案 1 :(得分:5)

可以使用Magento事件/观察者系统完美地完成。 首先,注册您的模块。

应用的/ etc /模块/ Namespace_Modulename.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Namespace_Modulename>
            <active>true</active>
            <codePool>local</codePool>
        </Namespace_Modulename>
    </modules>
</config>

为它写一个配置文件。

应用/代码/本地/命名空间/ MODULENAME的/ etc / config.xml中

<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_Modulename>
            <version>0.0.1</version>
        </Namespace_Modulename>
    </modules>
    <frontend>
        <events>
            <customer_register_success>
                <observers>
                    <unic_observer_name>
                        <type>model</type>
                        <class>unic_class_group_name/observer</class>
                        <method>customerRegisterSuccess</method>
                    </unic_observer_name>
                </observers>
            </customer_register_success>
        </events>
        <helpers>
            <unic_class_group_name>
                <class>Namespace_Modulename_Helper</class>
            </unic_class_group_name>
        </helpers>
    </frontend>
    <global>
        <models>
            <unic_class_group_name>
                <class>Namespace_Modulename_Model</class>
            </unic_class_group_name>
        </models>
        <template>
            <email>
                <notify_new_customer module="Namespace_Modulename">
                    <label>Template to notify administrator that new customer is registered</label>
                    <file>notify_new_customer.html</file>
                    <type>html</type>
                </notify_new_customer>
            </email>
        </template>
    </global>
</config>

以下是发生的一些事情:

  1. 注册了一个新的观察员,以便在customer_register_success节点中的事件Mage_Customer_AccountController(它在frontend/events的第335行发送)进行激活。它比使用customer_save_after更好,因为每次客户保存时,最后一个都会触发,而不仅仅是在他注册时;
  2. global/template/email节点中注册了新的电子邮件模板。允许我们发送自定义电子邮件。
  3. 接下来创建一个电子邮件模板(文件)。

    应用/区域/ EN_US /模板/ notify_new_customer.html

    Congratulations, a new customer has been registered:<br />
    Name: {{var name}}<br />
    Email: {{var email}}<br />
    ...<br />
    

    之后定义一个观察者方法。

    应用/代码/本地/命名空间/ MODULENAME /型号/ Observer.php

    class Namespace_Modulename_Model_Observer
    {
        public function customerRegisterSuccess(Varien_Event_Observer $observer)
        {
            $emailTemplate  = Mage::getModel('core/email_template')
                ->loadDefault('notify_new_customer');
            $emailTemplate
                ->setSenderName(Mage::getStoreConfig('trans_email/ident_support/name'))
                ->setSenderEmail(Mage::getStoreConfig('trans_email/ident_support/email'))
                ->setTemplateSubject('New customer registered');
            $result = $emailTemplate->send(Mage::getStoreConfig('trans_email/ident_general/email'),(Mage::getStoreConfig('trans_email/ident_general/name'), $observer->getCustomer()->getData());
        }
    }
    

    编辑:,因为@benmarks指出,如果客户在结账时注册,此解决方案将无效。描述了此行为的解决方案here。但是,我认为,最好使用_origData功能作为@benmarks建议。因此,使用他的answer作为指导来实现您的需求。

    有用的链接:

答案 2 :(得分:1)

作为基于事件的方法的替代方法,您可以运行单独的基于API的脚本来获取新的(或更新的)客户并通过电子邮件发送给您,可能会或可能不希望您获得一次性日期列表,而不是每个客户的电子邮件。

优点:

  • Magento商店中没有安装任何内容
  • 不会为新的/更新的客户操作添加任何额外的处理或网络延迟
  • 将一天的所有电子邮件批量处理成一封电子邮件的机会

这是我最近使用的一个例子,几乎就是你想要的,这就是为什么这引起了我的注意。代码为available here

$client =
   new SoapClient('http://www.yourstore.com/magento/api/soap?wsdl');
 $session = $client->login('TEST_USER', 'TEST_PASSWORD');

 $since = date("Y-m-d", strtotime('-1 day'));
 // use created_at for only new customers
 $filters = array('updated_at' => array('from' => $since)); 


 $result = $client->call($session, 'customer.list', array($filters));

 $email = "New customers since: $since\n";

 foreach ($result as $customer) {
         $email .= $customer["firstname"] ." ".
                     $customer["lastname"] . ", " .
                     $customer["email"] . "\n";
 }

mail("customer-manager@yourstore.com", "Customer report for: $since", $email);

答案 3 :(得分:0)

您可以扩展Mage/Customer/Resource/Customer.php - 受保护的函数_beforeSave(Varien_Object $customer)

if ($result) {
   throw Mage::exception('Mage_Customer', Mage::helper('customer')->__('This customer email already exists'), Mage_Customer_Model_Customer::EXCEPTION_EMAIL_EXISTS);
} else {
    // SEND EMAIL - Use a custom template 
}

答案 4 :(得分:0)

您可以尝试使用此扩展程序获取每个新客户注册的通知电子邮件,包括可自定义的电子邮件模板。 http://www.magentocommerce.com/magento-connect/customer-registration-notification.html

答案 5 :(得分:0)

您可以尝试使用此扩展程序获取每个新客户注册的通知电子邮件,包括可自定义的电子邮件模板。 http://www.magentocommerce.com/magento-connect/customer-registration-notification.html

答案 6 :(得分:0)

这是用于向管理员发送新客户电子邮件的代码 覆盖文件
\app\code\core\Mage\Customer\Model\Customer.php
到本地
\app\code\local\Mage\Customer\Model\Customer.php

替换以下功能

protected function _sendEmailTemplate($template, $sender, $templateParams = array(), $storeId = null)
    {
        /** @var $mailer Mage_Core_Model_Email_Template_Mailer */
        $mailer = Mage::getModel('core/email_template_mailer');
        $emailInfo = Mage::getModel('core/email_info');
        $emailInfo->addTo($this->getEmail(), $this->getName());
        $mailer->addEmailInfo($emailInfo);

        // Set all required params and send emails
        $mailer->setSender(Mage::getStoreConfig($sender, $storeId));
        $mailer->setStoreId($storeId);
        $mailer->setTemplateId(Mage::getStoreConfig($template, $storeId));
        $mailer->setTemplateParams($templateParams);
        $mailer->send();
        return $this;
    }

protected function _sendEmailTemplate($template, $sender, $templateParams = array(), $storeId = null)
    {
        /** @var $mailer Mage_Core_Model_Email_Template_Mailer */
        $mailer = Mage::getModel('core/email_template_mailer');
        $emailInfo = Mage::getModel('core/email_info');
        $emailInfo->addTo($this->getEmail(), $this->getName());

        if($template="customer/create_account/email_template"){

            $emailInfo->addBcc(Mage::getStoreConfig('trans_email/ident_general/email'), $this->getName());
              //Add email address in Bcc you want also to send
        }

        $mailer->addEmailInfo($emailInfo);


        // Set all required params and send emails
        $mailer->setSender(Mage::getStoreConfig($sender, $storeId));
        $mailer->setStoreId($storeId);
        $mailer->setTemplateId(Mage::getStoreConfig($template, $storeId));
        $mailer->setTemplateParams($templateParams);
        $mailer->send();
        return $this;
    }