如何在kdb q中无API发送表和字典至指定邮箱(定时执行)
KDB+ 定时发送表与字典至邮箱的解决方案
问题核心
直接使用system"mail -s \"d\" mail.com"仅能发送空主题邮件,未将表和字典的内容传入邮件正文,需通过文本转换+管道/文件导入的方式将内容注入邮件。
实现步骤
1. 将表与字典转为可读文本
kdb+中可通过string、0:(CSV格式)等函数将结构化数据转为纯文本:
// 示例表与字典 t:([] Count:0 8; Tablename:`A`B) d:`a`b!(10;20) // 生成邮件正文(两种格式可选) // 格式1:原生字符串格式 content: "Table Content:\n", string[t], "\n\nDictionary Content:\n", string[d] // 格式2:CSV格式化表(更易读) content: "Table (CSV):\n", 0: "," 0: t, "\n\nDictionary:\n", string[d]
2. 通过mail命令发送带内容的邮件
方式1:管道直接传入内容
利用echo将文本通过管道传给mail命令,注意转义引号处理特殊字符:
recipient: "abc@mail.com" subject: "KDB+ Daily Report" // 拼接命令并执行 system $"echo \"", content, "\" | mail -s \"", subject, "\" ", recipient
方式2:临时文件导入(推荐处理复杂内容)
若内容含特殊字符(如引号、换行),写入临时文件再发送更稳定:
// 将内容写入临时文件 `:tmp/kdb_report.txt 0: content // 发送文件内容作为邮件正文 system $"mail -s \"", subject, "\" ", recipient, " < :tmp/kdb_report.txt" // 清理临时文件(可选) system "rm :tmp/kdb_report.txt"
3. 定时触发配置
根据不同数据库的定时需求,设置触发逻辑:
RDB每日8:00 AM:通过
.z.ts定时检查时间,每秒轮询一次:sendEmail:{ t:([] Count:0 8; Tablename:`A`B); d:`a`b!(10;20); content: "Table (CSV):\n", 0: "," 0: t, "\n\nDictionary:\n", string[d]; system $"echo \"", content, "\" | mail -s \"RDB Daily Report (8:00 AM)\" abc@mail.com"; }; // 每天8点触发 .z.ts:{if[hour .z.P = 8; sendEmail[]]}; \t 1000 // 启动1秒间隔的定时轮询IDB每日4:00 PM:将上述
hour .z.P = 8改为hour .z.P = 16即可。HDB每日收盘时:绑定到收盘事件(或根据收盘时间判断),例如收盘时间为15:30:
.z.ts:{if[hour .z.P = 15; if[minute .z.P = 30; sendEmail[]]]};
注意事项
- 确保服务器已安装
mailutils或sendmail工具,且邮件发送配置正常(可通过终端手动执行mail命令测试)。 - 若需发送附件,可使用
mutt替代mail,命令格式为system $"echo \"", content, "\" | mutt -s \"", subject, "\" -a attachment.csv -- ", recipient。
内容的提问来源于stack exchange,提问作者Dhanuushri
相关产品推荐
相关产品推荐

