我需要一些帮助来改进想法/实现。场景是本地小型 ISP。用户帐户存储在 freeradius/mysql 中。任务是发送已消耗 80% 分配配额的用户电子邮件。
我已经配置了 bash 脚本,计划每 1 小时运行一次,检查 mysql 表中已下载的用户75%分配给他们的配额,然后将用户名和电子邮件添加到文件中/tmp/overquotauser.txt像这样
user1 [email protected]
user2 [email protected]
user3 [email protected]
当用户帐户更新时,他的名字将从帐户中删除/tmp/overquotauser.txt
现在我想要的是向这些用户发送电子邮件,这很简单,但我想要的是防止每小时向用户重复发送电子邮件。例如,如果用户已消耗 80%,则只应向用户发送一封电子邮件,而不是每小时。知道如何做到这一点吗?
答案1
您可以使用以下两种方法中的任何一种。
I)每隔一小时创建一个文件/tmp/overquotausernew.txt并将此文件与旧文件进行比较/tmp/overquotausernew.txt。如果在新创建的文件中发现任何新用户,则仅向这些用户发送电子邮件并将新创建的文件与/tmp/overquotauser.txt
这样,您将仅维护一个文件,其中包含电子邮件发送到的所有用户名。脚本将检查未向其发送邮件的任何新用户。
II) 您可以创建一个脚本来发送邮件,以便它检查邮件是否来自/tmp/overquotauser.txt过去 24 小时内是否发送。如果邮件是在过去 24 小时内发送的,则脚本不会执行任何其他操作,它将向该用户发送邮件。
答案2
您可以为此使用 mysql 表,因为您已经在 mysql 中工作了!像这样的表就足够了 -
create table (
userid varchar(100),
useremail varchar(100),
int mailsent default 0
);
您的创建者作业将从此表中创建(或删除)行。您的邮件程序将提取所有mailsent
设置为 0 的行,发送邮件并设置mailsent
为 1。
但是,如果您真的,真的,真的想要使用文本文件 - 这是一种方法 -
假设您的创建者 cron 作业的第一次调用创建了一个如下文件 -
user1,[email protected] user2,[email protected] user3,[email protected]
现在,在您的邮件程序任务运行的某个时间,它将从此文件中选择具有 emailid 的行,向收件人发送邮件并删除这些行中的电子邮件 ID。 (您可以为此使用 perl 或 sed - 请注意创建者同步写入该文件)在此操作之后您的文件将变成
user1 user2 user3
过了一会儿,您的创建者又添加了两个用户 user4 和 user5。你的文件现在变成
user1 user2 user3 user4,[email protected] user5,[email protected]
当邮件程序任务再次运行时,它只会向步骤 2 中电子邮件 ID 指定为 0 的人员发送电子邮件。
此模式有多种工作方式。
答案3
一种方法是使用 *nix 系统的内置quota
工具......从这里。
如果Soft Limit
是800MB
并且Hard Limit
是1000MB
,那么当达到时用户将收到电子邮件Soft Limit
,允许用户仍然创建文件直到Hard Limit
达到。
:)