SSMS数据库邮件无法发送给多个收件人问题求助
排查SQL Server DB Mail多收件人发送失败的问题
嘿,碰到这种之前正常突然失效的问题确实闹心,我来给你分享几个实用的排查方向,你可以一步步来验证:
1. 先检查收件人格式与有效性
- 末尾分号问题:你代码里
@recipients最后有个多余的分号,有些SMTP服务器对这种格式很敏感,会直接拒绝。先试着去掉末尾的分号,改成:@recipients = 'example@mail.com; example@mail.com; example@mail.com; example@mail.com' - 单个收件人排查:既然单个收件人能成功,那就逐个添加收件人测试,找到那个导致失败的邮箱——大概率是某个邮箱被注销、退信率过高,或者被邮件服务器列入了黑名单。
2. 查看DB Mail的详细错误日志
这是最能直接定位问题的步骤,SQL Server会把DB Mail的所有运行记录存在日志里:
- 在SSMS里导航到「管理」→「数据库邮件」→「查看数据库邮件日志」,按时间倒序找最近的失败记录;
- 或者直接运行查询提取日志:
日志里会明确告诉你是SMTP服务器拒绝、收件人地址无效,还是其他权限/配置问题。SELECT log_date, event_type, description FROM msdb.dbo.sysmail_event_log ORDER BY log_date DESC;
3. 确认SMTP服务器的限制
很多企业邮件服务器会有这些限制,可能最近配置有变更:
- 单次收件人数量上限:有些服务器不允许单次发送给太多收件人,之前你的收件人数量刚好没到阈值,最近可能加人或者服务器调整了限制;
- 垃圾邮件过滤:如果收件人里有外部邮箱,或者跨多个部门,服务器可能把批量发送判定为垃圾邮件,直接拦截。这种情况可以试试把收件人分成小批次发送。
4. 测试DB Mail配置文件
确认DBA_Notifications这个配置文件是否正常:
- 用这个配置文件手动发送一封多收件人的测试邮件,如果手动也失败,那问题大概率出在配置文件关联的SMTP服务器上——比如SMTP密码过期、服务器地址变更,或者权限被调整了。
临时解决方案:拆分收件人分批发送
如果暂时找不到根本原因,可以先把收件人拆分,逐个或小批量发送,保证业务能正常运行:
-- 把收件人存入临时表 DECLARE @RecipientList TABLE (Email NVARCHAR(255)) INSERT INTO @RecipientList VALUES ('example1@mail.com'), ('example2@mail.com'), ('example3@mail.com'), ('example4@mail.com') -- 循环发送邮件 DECLARE @CurrentEmail NVARCHAR(255) DECLARE EmailCursor CURSOR FOR SELECT Email FROM @RecipientList OPEN EmailCursor FETCH NEXT FROM EmailCursor INTO @CurrentEmail WHILE @@FETCH_STATUS = 0 BEGIN EXEC msdb.dbo.sp_send_dbmail @recipients = @CurrentEmail, @profile_name = 'DBA_Notifications', @subject = @SUB, @body = @BOD, @body_format = 'HTML' FETCH NEXT FROM EmailCursor INTO @CurrentEmail END CLOSE EmailCursor DEALLOCATE EmailCursor
内容的提问来源于stack exchange,提问作者Luke




