答案1
Mailman 有许多命令可以转储信息和操作列表。如果您要问如何将用户的订阅地址从一个域更改为另一个域,这些命令应该适用。
- list_lists-显示所有列表
- list_members—显示列表的成员,可以重定向到文本文件。
- add_members - 将成员添加到列表,可以将文件作为输入
- remove_members-从列表中删除成员
有了这些命令,您可能能够运行此伪 shell 代码描述的简单过程。您显然希望先清理它以使其真正发挥作用并对其进行测试。我目前没有可用的系统可以进行测试。
for each list in `list_lists`
# add members with new addresses
add_members --welcome-msg=n --admin-notify=n \
--file <(list_members {listname} | grep '@old-domain.com' | sed -e 's/old-domain.com/new-domain.com/') {listname}
# remove old addresses
remove_members --file=<(list_members {listname} | grep '@old-domain.com') {listname}
答案2
根据 Zoredache 的出色建议,我最终分 3 个阶段处理每个列表,一个阶段用于常规成员,一个阶段用于摘要成员,最后一步是删除旧地址。因此,对于每个列表,我都执行了以下操作:
PATH=$PATH:/usr/lib/mailman/bin; export PATH
list_members --regular list_name | grep '@old_domain.com' | sed -e 's/old_domain/new_domain/' | add_members --welcome-msg=n --admin-notify=n --regular-members-file=- list_name
list_members --digest list_name | grep '@old_domain.com' | sed -e 's/old_domain/new_domain/' | add_members --welcome-msg=n --admin-notify=n --digest-members-file=- list_name
list_members list_name | grep '@old_domain.com' | remove_members --file=- --nouserack --noadminack list_name
需要 PATH 语句是因为 mailman 二进制文件位于不常见的目录中(在我的 Fedora 系统上是 /usr/lib/mailman/bin)。