You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:45:19