【问题标题】:Delete mailbox based on postfix / dovecot / sql基于postfix/dovecot/sql删除邮箱
【发布时间】:2018-03-15 11:26:11
【问题描述】:

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

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

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

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

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

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

我认为 Dovecot 方面没有什么可做的,因为它使用上述数据。

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

【问题讨论】:

  • 如果您在数据库中管理邮箱,那么我认为您已经使用 db INSERT 或 DELETE + 文件夹 rm。一旦该域没有更多邮箱,您可能需要添加一些逻辑来删除/var/vmail/[domain]
  • 感谢您的评论。我认为我需要保留父域文件夹,因为有一个单独的 SQL 表“域”包含域名,以后添加新用户可能会由于缺少文件夹而导致错误。希望这个星球上有人曾经处理过这个问题......但最终我会做一些测试,看看在编写代码之前是否有任何问题。
  • 对此快速更新:在检查 postfixadmin PHP 代码如何删除邮箱后,它似乎只删除了相关的 SQL 表:存储邮件数据的实际文件夹仍然存在。问题是postfix创建文件夹和邮件作为它自己的用户/组(例如vmail/vmail)并且还将权限写入0600 rwx------...所以即使将用户apache添加到组中也不会让它“完全”删除邮箱。现在研究如何让 postfix 至少分别写入权限为 0770 和 0660 的文件夹和文件。
  • 我注意到与 postfixadmin 相同的事情。它自己没有或不能完全清理,这有点烦人。

标签: sql perl postfix dovecot


【解决方案1】:

这就是我解决这个挑战的方法。

首先,该架构是一个运行 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 脚本会更新本地 MySQL postfix 数据库 mailbox 表并发送以下 SQL 命令:

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

    这意味着该帐户实际上已经处于非活动状态。

我将创建日期设置为该唯一值的原因是因为它是一个不会被普通 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") }
    }
    

并以 SQL 命令结束:

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

实际上,它使用 postfix mailbox 表中已经存在的数据来测试要删除哪些邮箱,邮箱是否有要删除的现有文件夹/文件,以及是否找到后,使用 root 权限将其删除(这克服了文件系统权限紧张。

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

希望这将有助于为某人节省大量时间。

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2015-01-04
    • 2015-09-06
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多