SQL Agent作业执行sp_send_dbmail存储过程成功但邮件未送达问题咨询
问题排查解决步骤
1. 优先查看数据库邮件日志定位具体错误
sp_send_dbmail执行时仅将邮件加入发送队列,不会因后续发送/执行失败抛出导致作业终止的错误,搭配你使用的@exclude_query_output = 1参数会直接吞掉执行过程中的错误信息,首先执行以下语句查询错误日志:
-- 查询发送失败的邮件记录 SELECT * FROM msdb.dbo.sysmail_faileditems ORDER BY send_request_date DESC; -- 查询数据库邮件的详细事件日志 SELECT * FROM msdb.dbo.sysmail_event_log ORDER BY log_date DESC;
常见报错会直接提示是权限不足、查询执行失败、邮件服务器拒绝投递等问题。
2. 排查遗漏的权限配置
你已经配置了目标库的读写权限,还有两个极易遗漏的权限点需要确认:
- 作业运行账号
SQLAgtAct需要在msdb库中被授予DatabaseMailUserRole角色,才能调用sp_send_dbmail存储过程。 - 确认你使用的邮件配置文件
Active_users是公共配置文件,或者SQLAgtAct被授权可使用该私有配置文件。 - 可手动模拟账号执行验证权限:
若执行时报错可直接定位问题。EXECUTE AS USER = 'SQLAgtAct'; -- 这里粘贴你的存储过程代码执行 REVERT;
3. 修正@query参数的配置遗漏
你当前代码未指定@execute_query_database参数,即使查询语句写了全限定名,仍可能出现执行上下文跳转的问题,在sp_send_dbmail参数中补充:
@execute_query_database = '你的目标数据库名'
同时确认查询中的[database].[db].[teste1]的架构名[db]拼写正确,SQLAgtAct对该架构下的表没有显式拒绝的访问权限。
4. 排查邮件投递相关问题
- 先测试无附件的邮件是否能正常发送:将
@attach_query_result_as_file改为0,若能收到邮件说明是附件相关问题,可检查数据库邮件配置的最大附件大小限制:SELECT * FROM msdb.dbo.sysmail_configuration WHERE param_name = 'MaxFileSize'; - 确认企业邮件网关没有拦截带csv附件的邮件,可先把收件人改成配置数据库邮件时用的发件人地址测试,排除收件人侧的拦截规则。
5. 确认作业运行身份
检查SQL Agent作业步骤的「运行身份」配置,确认确实是使用SQLAgtAct账号运行,而非其他权限不足的代理账户。
内容的提问来源于stack exchange,提问作者Luis Luis Maia Maia
相关产品推荐
相关产品推荐

