如何通过Procmail按接收日期重命名保存附件并过滤邮件?
用Procmail实现附件日期命名与邮件过滤
我来帮你搞定Procmail的这两个需求——给附件按接收日期重命名保存,还有按发件人/主题过滤邮件。结合你现有的配置,咱们一步步调整:
一、先搞定邮件过滤:按发件人或主题筛选
Procmail的核心就是规则匹配,咱们可以给不同的过滤条件单独写规则:
1. 按发件人过滤(比如只处理foo@example.tld的邮件)
直接匹配邮件的From头,把符合条件的邮件单独处理:
:0 * ^From:.*foo@example\.tld { # 这里放后续的附件提取操作 }
- 解释:
:0是每条规则的起始标记;*开头的是条件行,用正则匹配From头里包含foo@example.tld的邮件;花括号里就是对这类邮件执行的操作。
2. 按主题过滤(比如只处理含"Daily Report"的邮件)
匹配Subject头就行,如果想忽略大小写(比如主题是daily report或Daily Report都能匹配),可以给规则加D标记:
:0 D * ^Subject:.*Daily Report { # 这里放后续的附件提取操作 }
二、给附件按接收日期重命名保存
你原来用ripmime提取附件的思路没问题,但默认会保留原文件名,咱们可以结合Procmail内置的$DATE变量(格式正好是YYYYMMDD,比如20180131),通过临时目录中转来重命名:
完整的附件重命名配置逻辑
先定义好目标目录和临时目录,然后提取附件到临时目录,再重命名移动到目标目录,最后清理临时文件:
# 先定义两个目录:最终保存附件的目录,和临时中转目录 ATTACH_DIR="/dir/to/save/attachment" TEMP_DIR="/tmp/procmail_temp_attach" :0 D # 匹配带附件的邮件(D标记忽略大小写) * ^Content-Type:.*attachment { # 确保临时目录存在,不存在就创建 :0 c | mkdir -p $TEMP_DIR # 用ripmime把附件提取到临时目录(保留你原来的参数) :0 fw | ripmime --overwrite --no-nameless -i - -d $TEMP_DIR # 遍历临时目录里的附件,重命名为「日期_原文件名」后移动到目标目录 :0 c | for file in $TEMP_DIR/*; do if [ -f "$file" ]; then mv "$file" "$ATTACH_DIR/${DATE}_$(basename "$file")" fi done # 清理临时目录,避免占用空间 :0 c | rm -rf $TEMP_DIR }
- 重点:
$DATE是Procmail内置的变量,自动取邮件接收日期的YYYYMMDD格式,完美符合你要的命名规则。
三、把过滤和重命名结合起来
比如你只想处理来自foo@example.tld的带附件邮件,把过滤条件和附件处理逻辑合并就行:
ATTACH_DIR="/dir/to/save/attachment" TEMP_DIR="/tmp/procmail_temp_attach" # 只处理foo@example.tld发来的带附件邮件 :0 D * ^From:.*foo@example\.tld * ^Content-Type:.*attachment { :0 c | mkdir -p $TEMP_DIR :0 fw | ripmime --overwrite --no-nameless -i - -d $TEMP_DIR :0 c | for file in $TEMP_DIR/*; do if [ -f "$file" ]; then mv "$file" "$ATTACH_DIR/${DATE}_$(basename "$file")" fi done :0 c | rm -rf $TEMP_DIR }
一些小提醒
- 注意正则里的转义:比如
foo@example\.tld里的.要加反斜杠转义,不然会匹配任意字符; - 测试规则:可以用
procmail -v命令测试你的配置,排查语法错误; - 权限问题:确保Procmail有目标目录和临时目录的读写权限。
内容的提问来源于stack exchange,提问作者FaxMax
相关产品推荐
相关产品推荐

