一个订单拆成两次发货,每次客户都收到两封内容相同的Tracking邮件。查代码时别只搜send,先把两封邮件的Message-ID、发送时间和shipment increment ID放一起。时间完全相同,多半是同一事务调用两次;相隔几分钟则像队列重试。
grep -R "send.*shipment\|ShipmentSender\|sales_order_shipment_save_after" app/code vendor -n grep -i "shipment" var/log/*.log | tail -n 100
常见组合是:Magento保存Shipment后核心Sender发送一次,ERP同步Observer又手工调用ShipmentSender。Observer只负责写tracking却顺手发邮件,就重复了。统一由一个边界负责发送。
部分发货要用shipment ID幂等
只按order_id去重会挡掉第二次合法发货邮件;应以shipment实体或业务事件ID为键。异步队列处理成功后写发送记录,重试先查记录。
回归时做一个含两件商品的订单,分两次发货,每个Shipment只收到一封,邮件内tracking与商品行正确。再故意让SMTP第一次超时,确认重试不会复制成功发送。

