如何使用DBMail每日向对应客户定向发送当日发货明细数据
发货明细自动邮件任务实现方案
1. 核心逻辑梳理
整个任务的核心逻辑是「先提取当日有发货记录的唯一客户列表→逐客户筛选对应发货数据→拼装HTML后调用DBMail发送」,不需要额外引入第三方工具,纯SQL脚本就能实现。
2. 具体实现步骤
2.1 提取当日唯一客户列表
首先从你的发货明细表中去重筛选出当日有发货记录的客户信息,避免同一个客户重复收到多封邮件,参考SQL:
-- 生成当日有发货记录的唯一客户临时表 SELECT DISTINCT [Sell-to Customer No_] AS CustNo, [Sell-to Customer Name] AS CustName, [Cust E-Mail] AS CustEmail INTO #TodayShipCust FROM 你的发货表名 -- 替换为你实际的表名 WHERE 发货日期字段 = CAST(GETDATE() AS DATE) -- 替换为你实际的发货日期字段和筛选条件
2.2 遍历客户逐一生成并发送邮件
用循环遍历上面生成的临时表,每次处理单个客户的明细数据,你已掌握的HTML拼装和DBMail发送逻辑可以直接复用,完整脚本参考:
-- 声明客户信息临时变量 DECLARE @CurrCustNo VARCHAR(50), @CurrCustName VARCHAR(100), @CurrCustEmail VARCHAR(100) DECLARE @EmailSubject VARCHAR(200), @EmailBody NVARCHAR(MAX) -- 循环处理所有客户 WHILE EXISTS(SELECT 1 FROM #TodayShipCust) BEGIN -- 取出当前待处理客户 SELECT TOP 1 @CurrCustNo = CustNo, @CurrCustName = CustName, @CurrCustEmail = CustEmail FROM #TodayShipCust -- 拼装邮件主题 SET @EmailSubject = @CurrCustName + ' ' + CONVERT(VARCHAR(10), GETDATE(), 23) + ' 发货明细清单' -- 筛选当前客户的当日发货明细,拼装为HTML格式 -- 这里直接替换为你自己的HTML拼装逻辑即可 SET @EmailBody = N' <h3>尊敬的' + @CurrCustName + ':</h3> <p>以下是您今日的发货明细:</p> <table border="1" cellpadding="5" cellspacing="0"> <tr><th>发货单号</th><th>商品编号</th><th>发货数量</th><th>物流单号</th></tr>' + CAST(( SELECT [Ship No] AS 'td', '', [Item Number] AS 'td', '', [Qty] AS 'td', '', [Package Tracking No_] AS 'td' FROM 你的发货表名 WHERE [Sell-to Customer No_] = @CurrCustNo AND 发货日期字段 = CAST(GETDATE() AS DATE) FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX)) + N'</table>' -- 调用DBMail发送邮件 EXEC msdb.dbo.sp_send_dbmail @profile_name = '你的DBMail配置文件名', -- 替换为你实际的DBMail配置名 @recipients = @CurrCustEmail, @subject = @EmailSubject, @body = @EmailBody, @body_format = 'HTML' -- 删除已处理客户,进入下一轮循环 DELETE FROM #TodayShipCust WHERE CustNo = @CurrCustNo END -- 清理临时表 DROP TABLE #TodayShipCust
2.3 配置每日定时调度
直接用SQL Server代理作业实现每日自动运行:
- 打开SSMS,找到「SQL Server 代理」,右键新建作业
- 新增步骤,类型选「Transact-SQL(T-SQL)」,数据库选你对应的业务库,把上面的完整脚本粘贴到命令框
- 切换到「调度」页,新建调度,设置每天你需要运行的时间(建议选在当日所有发货数据都录入完成的时间点,比如每日18:00)
3. 上线前注意事项
- 测试阶段可以先注释掉
sp_send_dbmail的执行语句,改为把@CurrCustEmail和@EmailBody插入到自定义的日志表,确认每个客户的明细、收件邮箱都正确后再开启发送 - 可以额外增加TRY/CATCH异常捕获逻辑,记录发送失败的客户信息,方便后续手动补送
- 可以加一层判断,如果客户当日没有发货明细(异常场景)直接跳过发送,避免发空内容邮件
内容的提问来源于stack exchange,提问作者user17135808
相关产品推荐
相关产品推荐

