Navicat任务失败无法原生邮件告警,需通过命令行调用navicat.exe并捕获非零退出码,再用PowerShell(Windows)或mailx(Linux/macOS)触发邮件;关键在于计划任务中正确配置工作目录、用户上下文及SMTP凭据。
Navicat 任务失败后怎么触发邮件告警
navicat 本身不支持任务失败自动发邮件——它连 smtp 配置入口都没有。所谓“失败发邮件”,本质是绕过 navicat 的图形界面,用它的命令行工具 navicat.exe(windows)或 navicat(macos/linux)配合外部脚本实现。
用命令行执行任务 + 捕获退出码判断成败
Navicat 的自动化依赖其内置的命令行接口,执行后返回标准退出码:0 表示成功,非零值(如 1、255)基本都代表失败(比如连接超时、SQL 报错、权限不足)。关键不是“怎么发邮件”,而是“怎么可靠地知道它挂了”。
- 必须用完整路径调用
navicat.exe,例如:"C:\Program Files\PremiumSoft\Navicat Premium 16\navicat.exe",否则计划任务里常因环境变量缺失而找不到命令 - 执行语句末尾加
--no-splash --batch,避免弹窗阻塞;加上--log-level=3可输出详细日志到文件,方便排查为什么返回非零码 - 不要依赖 Navicat 界面里的“运行后关闭”,命令行模式下它本就不弹窗,关不关由你控制
失败时调用系统邮件工具(推荐 PowerShell 或 mailx)
Windows 下最稳的是 PowerShell 的 Send-MailMessage,Linux/macOS 用 mailx 或 curl 调 SMTP API 更轻量。重点不是选哪个工具,而是别把邮件逻辑写进 Navicat 里——它压根不提供钩子。
- PowerShell 示例片段(注意替换邮箱和 SMTP 设置):
if ($LASTEXITCODE -ne 0) { Send-MailMessage -From "alert@company.com" -To "dba@company.com" ` -Subject "Navicat Task FAILED: $taskName" ` -Body "Exit code: $LASTEXITCODE. Check log at C:\navicat\logs\fail.log" ` -SmtpServer "smtp.company.com" -Port 587 -UseSsl -Credential $cred } - Linux 下用
mailx前务必确认已配置好/etc/mail.rc,否则echo "body" | mailx -s "subject" user@x.com会静默失败 - 别在邮件正文中直接拼接 Navicat 日志全文——大日志可能触发邮件服务截断或拒收,只放关键错误行或日志路径
计划任务里漏掉的工作目录和用户上下文
这是 80% 失败告警没发出去的真正原因:Windows 计划任务默认以 SYSTEM 用户运行,看不到你的个人 SMTP 凭据;Linux cron 默认没有 $HOME,mailx 找不到配置。Navicat 命令行本身对工作目录敏感——比如它读取的连接配置、导出路径,都相对当前目录解析。
- Windows 计划任务中,“起始于(可选)”字段必须填
C:\navicat\tasks\这类明确路径,不能留空 - Linux cron 要显式设置环境:
SHELL=/bin/bash HOME=/home/user PATH=/usr/local/bin:/usr/bin:/bin * * * * * cd /home/user/navicat && ./run_task.sh
- 测试阶段务必用计划任务用户身份手动跑一遍脚本,别只在自己终端里验证成功就认为 OK
实际跑通的关键,从来不是邮件模板多漂亮,而是退出码有没有被真实捕获、SMTP 凭据在目标上下文里是否存在、日志路径是不是绝对且可写——这些地方一错,整个链路就静默失效。


















