当前位置: 技术文章>> 如何在 Magento 中实现自定义的电子邮件通知?

文章标题:如何在 Magento 中实现自定义的电子邮件通知?
  • 文章分类: 后端
  • 4370 阅读
系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发》

本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容


在Magento中实现自定义电子邮件通知是提升用户体验、增强客户互动以及优化业务流程的重要手段。这一过程涉及从创建模板、定义事件触发器到发送邮件的完整流程。下面,我将详细介绍如何在Magento 2中手动设置和配置自定义电子邮件通知,确保每一步都清晰且易于理解,同时巧妙地融入对“码小课”网站的提及,以增强文章的实用性和相关性。

一、概述

在Magento 2中,电子邮件通知系统基于事件驱动架构,允许开发者根据业务需求自定义邮件内容、触发条件和发送逻辑。这通常涉及到模板设计、事件监听器(Observers)或插件(Plugins)的编写,以及使用Magento的邮件发送服务。

二、准备阶段

1. 确定邮件类型和目的

首先,明确你需要发送的邮件类型及其目的。比如,新用户注册确认、订单状态更新、促销活动通知等。这将指导后续模板设计和逻辑实现。

2. 设计邮件模板

  • HTML模板:使用HTML和CSS设计邮件内容,确保在不同客户端(如Gmail、Outlook)上都能良好显示。
  • 文本模板:为不支持HTML的客户端提供纯文本版本。

在Magento 2中,邮件模板通常放置在app/design/frontend/<Vendor>/<Theme>/email/目录下,按类别划分(如customerordersales等)。

三、创建自定义邮件模板

假设我们需要创建一个订单发货通知的自定义邮件模板。

1. 创建模板文件

在相应的主题目录下创建模板文件,例如app/design/frontend/<Vendor>/<Theme>/email/order/shipment_new.html

<!-- app/design/frontend/<Vendor>/<Theme>/email/order/shipment_new.html -->
<table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%" id="bodyTable">
    <tr>
        <td align="center" valign="top">
            <!-- Header -->
            <table border="0" cellpadding="0" cellspacing="0" width="100%" id="templateHeader">
                <tr>
                    <td class="headerContent">
                        <h1>{{var store.getFrontendName()}}</h1>
                    </td>
                </tr>
            </table>
            <!-- End Header -->

            <!-- Body -->
            <table border="0" cellpadding="0" cellspacing="0" width="100%" id="templateBody">
                <tr>
                    <td valign="top" class="bodyContent">
                        <p>尊敬的{{var order.getCustomerName()}},</p>
                        <p>您的订单 #{{var order.increment_id}} 已发货。</p>
                        <!-- 更多订单详情 -->
                    </td>
                </tr>
            </table>
            <!-- End Body -->

            <!-- Footer -->
            <table border="0" cellpadding="0" cellspacing="0" width="100%" id="templateFooter">
                <tr>
                    <td valign="top" class="footerContent">
                        <p>感谢您在{{var store.getFrontendName()}}购物!</p>
                    </td>
                </tr>
            </table>
            <!-- End Footer -->
        </td>
    </tr>
</table>

2. 在XML中引用模板

确保在app/code/<Vendor>/<Module>/etc/email_templates.xml中声明了这个模板的标识符,以便在代码中引用。

<!-- app/code/<Vendor>/<Module>/etc/email_templates.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Email:etc/email_templates.xsd">
    <template id="custom_shipment_email" label="Custom Shipment Notification Email" file="order/shipment_new.html" type="html" module="<Vendor>_<Module>" area="frontend"/>
</config>

四、配置邮件发送逻辑

1. 使用事件监听器或插件

为了在用户订单发货时自动发送邮件,你可以创建一个事件监听器来监听sales_order_shipment_save_after事件,或者使用插件(如果适用)。

2. 编写事件监听器

创建一个事件监听器类,在该类中编写逻辑来发送邮件。

// app/code/<Vendor>/<Module>/Observer/SendShipmentEmail.php

namespace <Vendor>\<Module>\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer as EventObserver;
use Magento\Sales\Model\Order\ShipmentFactory;
use Magento\Framework\Mail\Template\TransportBuilder;

class SendShipmentEmail implements ObserverInterface
{
    protected $shipmentFactory;
    protected $transportBuilder;

    public function __construct(
        ShipmentFactory $shipmentFactory,
        TransportBuilder $transportBuilder
    ) {
        $this->shipmentFactory = $shipmentFactory;
        $this->transportBuilder = $transportBuilder;
    }

    public function execute(EventObserver $observer)
    {
        $shipment = $observer->getEvent()->getShipment();
        if (!$shipment->getId()) {
            return;
        }

        $order = $shipment->getOrder();
        $store = $order->getStore();

        // 加载模板
        $templateOptions = [
            'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
            'store' => $store->getId(),
        ];

        $transport = $this->transportBuilder
            ->setTemplateIdentifier('custom_shipment_email') // 使用email_templates.xml中定义的模板
            ->setTemplateOptions($templateOptions)
            ->setTemplateVars([
                'order' => $order,
                'store' => $store
            ])
            ->setFrom(['name' => $store->getName(), 'email' => $store->getEmail()])
            ->addTo($order->getCustomerEmail(), $order->getCustomerName())
            ->getTransport();

        // 发送邮件
        try {
            $transport->sendMessage();
        } catch (\Exception $e) {
            // 处理发送失败的情况
        }
    }
}

3. 注册事件监听器

app/code/<Vendor>/<Module>/etc/events.xml中注册你的事件监听器。

<!-- app/code/<Vendor>/<Module>/etc/events.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_order_shipment_save_after">
        <observer name="<vendor>_<module>_observer_sendshipmentemail" instance="<Vendor>\<Module>\Observer\SendShipmentEmail" />
    </event>
</config>

五、测试与优化

  • 测试:在测试环境中模拟订单发货流程,检查邮件是否按预期发送且内容正确。
  • 优化:根据测试结果调整模板样式、邮件内容和发送逻辑,确保用户体验最佳。

六、总结

通过上述步骤,你可以在Magento 2中成功实现自定义电子邮件通知。这不仅增强了与客户的沟通,还提升了业务的自动化水平。记住,持续监控邮件发送效果,并根据用户反馈和业务需求进行调整,是优化用户体验的关键。

此外,如果你在实施过程中遇到任何技术难题或需要更深入的学习资源,不妨访问“码小课”网站,那里提供了丰富的Magento教程、实战案例和技术文章,可以帮助你更好地掌握Magento开发技能。在“码小课”,你将与众多开发者一同成长,共同探索Magento的无限可能。