You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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里导航到「管理」→「数据库邮件」→「查看数据库邮件日志」,按时间倒序找最近的失败记录;
  • 或者直接运行查询提取日志:
    SELECT log_date, event_type, description
    FROM msdb.dbo.sysmail_event_log 
    ORDER BY log_date DESC;
    
    日志里会明确告诉你是SMTP服务器拒绝、收件人地址无效,还是其他权限/配置问题。

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

火山引擎 最新活动