删除基于postfix / dovecot / sql的邮箱

时间:2017-10-04 06:45:13

标签: sql perl postfix dovecot

我正在编写一些PERL代码,用于在运行postfix / dovecot / mysql堆栈的远程服务器上添加/删除邮箱和别名。

我想知道是否有人有关于需要在远程邮件服务器上以编程方式完成什么的经验或确切信息?

对于添加邮箱,我认为这就像在后缀中插入新行一样简单 - >邮箱表。当邮件接收/发送时,postfix和dovecot将在 / var / vmail 下创建相关的文件/文件夹。

对于删除邮箱,我相信除了相关的后缀的删除 - >邮箱表行,我还需要运行一个bash命令:

rm -rf /var/vmail/[domain]/[username]

...以清除用户的实际消息和附件。

我认为Dovecot方面没有任何事情要做,因为它使用了上面提到的数据。

P.S。对于那些感兴趣的人,我正在使用LWP:UserAgent将Web API发送到邮件服务器上的本地PERL脚本,以便运行DBI和bash命令。

1 个答案:

答案 0 :(得分:0)

这就是我解决这一挑战的方式。

首先,该架构是运行Postfix / Dovecot / MySQL的远程邮件服务器。我的管理服务器是它自己的LAMP堆栈,在其中我有一个跟踪邮箱的自定义数据库和表:用户,域,状态(以及其他内容)。我之所以提到这一点,是因为它可以帮助人们制定自己的定制解决方案。

然而,理论上它可以在同一台服务器上运行(直接进入第2步)。

要删除邮箱,我就是这样做的:

  1. 从我的本地服务器,我使用LWP :: UserAgent和HTTP :: Reqeuest :: Common PERL模块向远程Postfix服务器发送GET请求。例如,https://remote.com/api.cgi?action=delete&mailbox=john@smith.com
  2. 在远程Postfix服务器上,我还安装了PERL和Apache。当GET请求命中服务器时,我的Apache运行PERL脚本会更新发送此SQL命令的本地MySQL postfix 数据库邮箱表:

    use postfix
    UPDATE mailbox SET status=1,created='1111-11-11 11:11:11'
    

    这意味着该帐户已经无效。

  3. 我将创建日期设置为该唯一值的原因是因为它是一个不会被正常的Postfix操作更改的列。

    1. 在这个远程服务器上,我有另一个PERL脚本,该脚本作为每日cron作业运行,具有 root 权限。该脚本首先执行:

      SELECT local_part,domain FROM mailbox WHERE created='1111-11-11 11:11:11'
      
    2. 我现在使用“1111-11-11 11:11:11”来确定要删除的邮箱。使用DBI生成的数组,Perl脚本(带有 root 特权)然后执行以下PERL代码:

      for $x (0 .. $#$delete_mailboxes) {
       $check = "/var/vmail/$delete_mailboxes->[$x][1]/$delete_mailboxes->[$x][0]";
       if (-e $check) { @a=system("rm -rf $check") }
      }
      
    3. 并完成SQL命令:

          DELETE FROM mailbox WHERE local_part='$delete_mailboxes->[$x][0]' AND domain='$delete_mailboxes->[$x][1]'
      

      实际上,它使用 postfix mailbox 表中已有的数据来测试要删除的邮箱,邮箱是否有要删除的现有文件夹/文件,以及是否发现,使用root权限删除它(它克服了严格的文件系统权限。

      现在这种技术可以在多种不同的编程语言中完成,使用不同版本的后缀,不同的数据库版本和不同的Web服务API ......重要的是它在cron作业中使用root权限来查询数据库确定是否/删除什么。

      希望这有助于节省很多时间。