thinkphp邮件营销核心是用户分组管理、可复用edm模板和自动化推送流程:数据库需支持多维标签分组,模板须内联样式兼容邮件客户端,发送须异步队列分批处理,并严格遵守退订机制与合规要求。

ThinkPHP 做邮件营销,关键不在“发得出去”,而在“发得准、看得进、有反馈”。核心是三件事:用户分组管理 + 可复用EDM模板 + 自动化推送流程。下面直接说落地做法。
一、数据库设计:订阅用户必须带分组字段
别只建一个 subscribers 表存邮箱。要支持按行业、采购阶段、地域、产品兴趣等维度推送,表结构至少包含:
- email:唯一索引,必填
-
group_id 或 tags(JSON 字段):用于灵活分组,比如
["wholesale", "usa", "led-lighting"] - status:区分 active / unsubscribed / pending(邮箱验证中)
- created_at 和 last_opened:后续做行为分群依据
示例 SQL:
CREATE TABLE `subscribers` (
`id` int(11) PRIMARY KEY AUTO_INCREMENT,
`email` varchar(255) NOT NULL UNIQUE,
`group_id` tinyint(2) DEFAULT 1,
`tags` json DEFAULT NULL,
`status` enum('active','pending','unsubscribed') DEFAULT 'pending',
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
`last_opened` timestamp NULL
);
二、EDM模板:用 ThinkPHP 视图 + 内联样式实现兼容性
ThinkPHP 的 view() 方法可直接渲染 HTML 邮件模板,但注意:邮件客户端不支持外链 CSS 或复杂 Flex 布局。必须用内联样式 + 表格布局(兼容 Outlook)。
- 模板路径建议放在
view/email/下,如promo_2026_q2.html - 在控制器中传入动态数据:
view('email.promo_2026_q2', ['name' => $user['name'], 'discount' => '25%']) - 所有关键样式写在
style=""里,例如:<td style="font-family: Arial, sans-serif; font-size: 16px; color: #333;"> <li>CTA 按钮用带 padding 的 <code><table> 模拟,避免纯 CSS Button 在 Gmail 失效 <h3>三、发送逻辑:异步队列 + 分组批量推送</h3> <p>一次性给 5000 人发邮件,同步执行会超时、卡住 Web 进程。正确做法是结合 <code>think-queue+ Redis:- 用户订阅成功后,不立刻发欢迎信,而是推入队列:
Queue::push(WelcomeEmailJob::class, ['email' => $email]) - 分组推送任务:查出某组全部邮箱,拆成每 200 条一批,每批作为独立队列任务,防止单次连接断开
- 使用
think-mailer发送,配置中开启 SMTP 加密(TLS/SSL),密码用邮箱授权码而非登录密码 - 每次发送后记录日志(是否成功、错误码、响应时间),便于排查退信或限频问题
四、合规与体验细节不能漏
一封外贸 EDM 不只是内容好看,更是法律文书:
- 每封邮件底部必须有清晰退订链接,形如:
@#@#@#@#@#@#@#@#@#@0,点击即更新status = 'unsubscribed' - 主题行控制在 12 字以内,加入变量如
[First Name],Your 25% OFF on LED Panels is ready - 首屏必须出现价值点(折扣/新品/限时),避免大图无文字——很多邮箱默认关闭图片
- 签名档固定含公司名、官网、WhatsApp、物理地址(GDPR/Canada CASL 强制要求)
- 用户订阅成功后,不立刻发欢迎信,而是推入队列:
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











