![使用 qmail 动态转发邮件给多个收件人](https://linux22.com/image/730750/%E4%BD%BF%E7%94%A8%20qmail%20%E5%8A%A8%E6%80%81%E8%BD%AC%E5%8F%91%E9%82%AE%E4%BB%B6%E7%BB%99%E5%A4%9A%E4%B8%AA%E6%94%B6%E4%BB%B6%E4%BA%BA.png)
我正在尝试将收到的邮件转发给多个收件人。收件人的地址存储在 mysql 数据库中,因此我需要在转发邮件之前调用脚本来获取地址。
我已经尝试将邮件传送到 PHP 脚本,然后解析电子邮件并通过 PHP Mail 转发,但这有其缺点,因为您需要依赖电子邮件解析器并自行处理标题、编码和附件。
有没有更简单的解决方案,例如使用 bash 脚本来获取收件人并转发邮件?
答案1
首先,确定此邮件列表的更改频率。如果您打算每隔一段时间添加一个用户,最简单的办法可能是从命令行运行 MySQL 查询并将其输出到 .qmail 文件中。您可以在 cron 作业中每分钟/每小时/每天/每月/等等使用它来满足保持分发列表最新的目标:
mysql -sN -e ‘SELECT CONCAT(“&”,emailaddress) FROM table WHERE criteria’ > .qmailtmp
if [ $? -eq 0 ]; then
mv .qmailtmp .qmail
fi
此设置的优点是您可以在临时位置创建它,然后在验证其成功后将其复制到 .qmail 文件上。因此,当您的 MySQL 服务器出现故障时,您的邮件不会停止投递。这可能是您实现此目的的最快、最简单和最好的方法。它还确保发送到该电子邮件地址的许多请求不会产生巨大的 MySQL 流量并减慢您的投递速度或使您的 MySQL 服务器连接数过载。
如果您需要更频繁地更改某些内容,请考虑原始电子邮件的收件人将始终是转发电子邮件的收件人,而不是您要转发给的人。您可能会发现,由于垃圾邮件过滤器的存在,这降低了邮件的传递率。为了解决这个问题,您可能会发现邮件列表管理器(例如 ezmlm)是一种可行的解决方案,它可以将其订阅者列表存储在 MySQL 数据库中。
第三种选择是使用邮件过滤器(如带有前置线路的 Courier 的 maildrop)。http://www.courier-mta.org/maildrop/话虽如此,MySQL 补丁似乎已被放弃,我只能在旧的 Linux 发行版源代码档案中找到源代码。您仍然可以使用 Maildrop 运行外部程序(如 MySQL)来获取您的列表,但如果您要这样做,它基本上与第一个选项相同,但实时。由于我在 maildrop-MySQL 上 10 年内找不到任何东西,这里有一个使用外部程序的示例。
# set default Maildir
MAILDIR="$HOME/Maildir"
logfile "$HOME/mailfilter.log"
#user settings
DATABASE=<YOUR_DATABASE_USERNAME_HERE>
#mysql select
RESULT=`echo -ne "select toemail from addresses;" | mysql $DATABASE --skip-column-names`
### deliver to each RESULT here using your local methods