【问题标题】:Automated e-mail based on SQL results基于 SQL 结果的自动电子邮件
【发布时间】:2013-10-17 17:54:55
【问题描述】:

我们需要编写一个 BASH 脚本来执行 SQL 查询,然后使用一些结果发送一封自动电子邮件。我们的 SQL 版本是 Oracle8i Enterprise Edition Release 8.1.7.4.0,获得我们想要的结果的 SELECT 语句是:

SELECT kred_lim.kunr, kust_adr.ku_email, kred_lim.kred_limit, kred_lim.kred_zu_zahlen
FROM kred_lim, kust_adr
WHERE kred_lim.kred_zu_zahlen > kred_lim.kred_limit
AND kred_lim.kunr = kust_adr.ku_nr;

因此,这将显示客户编号、客户电子邮件地址、信用额度和当前未完成订单价值,仅限于未完成订单价值大于其信用额度的客户。我们只是停留在从哪里开始,或者如何将这些结果合并到电子邮件中。

我们只需要向每个人发送一封简单的电子邮件,说明他们已超出信用额度,并在该电子邮件中显示他们的信用额度和当前未完成的订单价值。

任何示例或指针将不胜感激。

【问题讨论】:

  • 你知道如何使用sqlplus吗?你知道如何在 bash 中捕获命令的输出吗?
  • @glennjackman 是的,我知道如何使用 SQL*Plus 来获取需要使用的结果,我已将SELECT 语句放在上面。我正在寻找如何在 BASH 脚本中执行查询的示例,使用返回的电子邮件地址向每一行发送电子邮件,并在电子邮件中的某处包含两个金额(kred_limitkred_zu_zahlen)。跨度>

标签: sql oracle bash sendmail


【解决方案1】:

我会写:

#!/bin/bash

sql="
    set pagesize 0
    set feedback 0

    SELECT kred_lim.kunr ||','|| kust_adr.ku_email ||','|| kred_lim.kred_limit ||','|| kred_lim.kred_zu_zahlen
    FROM kred_lim, kust_adr
    WHERE kred_lim.kred_zu_zahlen > kred_lim.kred_limit
    AND kred_lim.kunr = kust_adr.ku_nr;
"

email_template="Subject: Credit limit
To: %s

Customer number: %s
Credit limit: %s
Current orders: %s
"

sqlplus $user/$pass@$db <<< "$sql" |
while IFS=, read -r num email limit orders; do
    printf "$email_template" "$email" "$num" "$limit" "$orders" |
    /path/to/sendmail -f sender@example.com -oi -t
done

【讨论】:

  • 感谢您的示例,太好了。运行该程序时,我似乎收到了很多“标头中未找到收件人地址”错误消息。有些客户没有设置电子邮件地址,但大多数客户都有。有些客户本应发送电子邮件,但在检查maillog 时似乎没有发送任何内容。某些客户没有设置电子邮件地址会导致问题吗?
  • 另外,您知道是否可以使用 BASH 来记住哪些客户(或电子邮件地址)已收到此电子邮件并在固定的时间段内忽略它们,或者会此类检查必须在 BASH 之外进行吗?例如,如果客户在过去 24 小时内收到了一封电子邮件,则忽略他们,或者类似的东西。
  • 我会将上次发送电子邮件的时间存储在数据库中(使用 sqlplus 和插入或更新)。然后,您可以将其构建到您的查询中以供下次运行。在 while 循环中,您可以在尝试发送之前添加 if [[ -n $email ]]; 以查看电子邮件是否为非空。我无法帮助您诊断您的邮件系统。
  • “标头中未找到收件人地址”错误消息表明您的代码中存在问题,而不是 sendmail,因为它可以正常工作。
  • 刚刚发现代码中的问题:我是用单引号给sql字符串,里面的单引号会丢失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2020-10-01
相关资源
最近更新 更多