我使用 procmail 接收电子邮件,然后将其转发给脚本进行处理。有时这甚至意味着生成电子邮件(例如,将消息转发给另一个用户,或回答查询)。
不用说,我对用自动回复或休假回复的电子邮件来加载我的服务器毫无兴趣,所以我想知道是否有一种简单的方法来过滤掉这些消息。无论如何,我都会将这些消息传输到脚本中,因此我始终可以在脚本中滚动我自己的过滤器,但我宁愿不重新发明轮子。
我已经知道我应该删除带有Precedence: junk
或 的消息Precedence: bulk
。我可以像过滤 procmail 中的其他标题一样过滤它们吗?
答案1
阅读文档是一个很好的开始。有一个迷你指南这里涵盖了基础知识。自动生成的消息应由 FROM_DAEMON 和 FROM_MAILER 规则拾取。还可以使用 X-Loop(在上面引用的文档中描述)来避免循环消息。
最后,你可以抑制对同一地址的重复回复正如这里所示(用于休假自动回复)。因此,即使远程系统不能很好地运行,不能正确填充发件人地址并删除 X-Loop 标头,您也可以中断循环。
Procmail 可用于创建非常复杂的系统 - 它本身就是一种编程语言。您可能还想看看:
更新
由于 www.clarconnect.com 已经断网,我从回程机器上获取了内容:
概述
我知道不是每个人都赞成通过电子邮件自动回复休假信息,但事实上我们的一些客户/用户坚持这样做。因此,您可以建立一个系统,让用户可以管理自己的休假自动回复信息。
此procmail休假自动回复配方的特点:
- 用户管理的自动回复 - 用户可以启用/禁用自动回复,并且每次可以设置不同的回复消息。
- 每次启用自动回复时,只会向电子邮件地址发送一次自动回复。因此,可以避免自动回复循环,并且如果一个人(或邮件列表)在启用自动回复的情况下向该地址发送多封电子邮件,发件人不会受到多次自动回复响应的困扰。
- Recipe 尝试避免回复邮件列表和垃圾邮件。安装和配置 Procmail
在继续操作之前,您需要在系统上启用 procmail。有关说明,请参阅以下操作指南:使用 Procmail 过滤电子邮件
请特别注意标题为“在 Postfix 中启用 Procmail”的部分。
配置休假自动回复
要为您的用户启用休假自动回复,您需要在 /home/“username”文件夹中为每个需要此服务的用户创建一个 .procmailrc 文件。该文件需要包含以下代码。
# Uncomment the lines below if you need log output for testing.
#
#LOGFILE=/tmp/procmailvacation.log
#VERBOSE=on
# vim: ft=procmail
# User-managed vacation recipe for procmail
# Written by Jason Thaxter
# (http://www.google.com/search?q=jason+thaxter)
# * Include this file in the procmail file.
# * Set $VACATION_PASSWORD. (for security, this is mandatory)
# * Define $VACATION_SENDER in your procmail recipe: it will be "from" this
# address.
# * E-mail a message with $VACATION_PASSWORD and $VACATION_ON in the subject
# line. The body of the message becomes the vacation message. $VACATION_ON
# can be set prior to the INCLUDERC, but it defaults to "vacation on".
# * To turn it off, e-mail a message with $VACATION_PASSWORD and $VACATION_OFF
# in the subject line. Likewise, $VACATION_OFF defaults to "vacation off".
# Note that you probably want this to execute *after* any mailing list or spam
# delivery recipes. You can set $VACATION_SKIP to disable vacation processing
# if it's inconvenient to skip this recipe.
# -----------------------------------------------------------------------------
# Configurable variables: These variables allow you to use this vacation recipe
# as an include and customize it from your main procmail file.
#
# lockfile:
VACATION_LOCK=$HOME/${VACATION_LOCK:-".vacation$LOCKEXT"}
# cache file:
VACATION_CACHE=$HOME/${VACATION_CACHE:-".vacation_cache"}
# cache size:
VACATION_CACHE_SZ=${VACATION_CACHE_SZ:-8192}
# message file
VACATION_MSG=$HOME/${VACATION_MSG:-".vacation_mesg"}
# what to use as the xloop header
HOSTNAME=${HOSTNAME:-`hostname`}
VACATION_XLOOP=${VACATION_XLOOP:-"$LOGNAME@$HOSTNAME"}
# base token for default $VACATION_ON and $VACATION_OFF
# so you could set this and not those individually
VACATION_COOKIE=${VACATION_COOKIE:-"vacation"}
VACATION_ON=${VACATION_ON:-"$VACATION_COOKIE on"}
VACATION_OFF=${VACATION_OFF:-"$VACATION_COOKIE off"}
#
#Change these variables
#
VACATION_PASSWORD=yourpassword
VACATION_DOMAIN_NAME=domainname.com
VACATION_SENDER=$LOGNAME@$VACATION_DOMAIN_NAME
VACATION_SENDMAILFROM=${VACATION_SENDMAILFROM:-"-f$VACATION_SENDER"}
VACATION_SENDMAILFLAGS="-oi -t $VACATION_SENDMAILFROM"
# -----------------------------------------------------------------------------
SENDMAIL_CMD="$SENDMAIL $VACATION_SENDMAILFLAGS"
SHELL=/bin/sh
# check if we should send vacation message, add user to cache
:0 Whc: $VACATION_LOCK
# if i haven't been instructed to skip processing
* ? test -z $VACATION_SKIP
# if i have a vacation message file
* ? test -f $VACATION_MSG
# and the message is not from a daemon or mailer
* !^FROM_DAEMON
* !^FROM_MAILER
# not declared spam by spamassassin
* !^X-Spam-Flag: YES
# not discernably in a mailing list
* !^List-
* !^(Mailing-List|Approved-By|BestServHost|Resent-(Message-ID|Sender)):
* !^X-[^:]*-List:
* !^X-(Sent-To|(Listprocessor|Mailman)-Version):
# and not x-loop
* !^X-Loop: $VACATION_XLOOP
# add it to the cache
| formail -rD $VACATION_CACHE_SZ $VACATION_CACHE
:0 ehc
# if the name was not in the cache
# if we can find who we're sending it to
# and who we are sending this "From"
* ? test -n ${VACATION_MSG_SEND_TO}
* ? test -n ${VACATION_SENDER}
*$ !^From:.*$VACATION_SENDER
| (formail -r \
-I"Precedence: junk" \
-A"From: $VACATION_SENDER" \
-A"X-Loop: $VACATION_XLOOP"; \
cat $VACATION_MSG ) | \
$SENDMAIL_CMD
# Add/remove vacation message
:0
# First make sure that the sender has
# the correct username
* ^TO_\/[-\.a-z_]+@
*$ ^From:.*$\MATCH
# the correct email domain
*$ ^From:.*$\VACATION_DOMAIN_NAME
# only do this if we have a password set
* ? test -n $VACATION_PASSWORD
# and it's in the subject line
* $^Subject:.*${VACATION_PASSWORD}
{
# VACATION ON
# if subject line matches magic cookie for ON:
:0
* $^Subject:.*${VACATION_ON}
{
# pipe the body into the vacation message file
:0c:$VACATION_LOCK
| formail -I "" > $VACATION_MSG
# add message to the body
:0f
| cat - ; \
echo; \
echo '---------- VACATION -----------------'; \
echo 'The above text was installed as your vacation message'
}
# VACATION OFF
# if subject line matches magic cookie for OFF:
# delete the vacation file and notify
:0f
* $^Subject:.*${VACATION_OFF}
| cat -; \
echo '---------- VACATION -----------------'; \
echo 'Removing message and cache: '; \
rm -vf $VACATION_MSG; \
rm -vf $VACATION_CACHE; \
echo ; \
echo "Removed vacation message."
}
创建文件后,请确保更改以下几行:
- $休假密码- 这是为了防止其他人启用/禁用您的休假自动回复。
- $VACATION_DOMAIN_NAME- 这是您电子邮件使用的域名(例如[电子邮件保护])。
现在您需要确保.procmailrc 文件具有以下安全权限:
用户和组应设置为您为其设置的电子邮件用户的用户名。
文件权限应设置为仅限用户的 rwx------(即 0700)。
** 警告! **
请注意,如果您将.procmailrc 的权限设置为错误的用户,或者设置权限以便用户、组和其他人可以读/写/执行.procmailrc,那么 procmail 将忽略您的 .procmailrc 文件。
配置完这些设置后,自动回复应该可以正常工作。如果您遇到自动回复问题,可以取消注释以下两行并检查 /tmp/procmailvacation.log 的内容。
#LOGFILE=/tmp/procmailvacation.log
#VERBOSE=on
使用休假自动回复
现在已经安装了该配方,用户可以通过向自己发送具有以下主题的电子邮件来启用休假自动回复:
- 密码假期- 其中密码是脚本中配置的密码。
这封电子邮件的正文将成为自动回复电子邮件消息。用户将收到用户刚刚发送给自己的电子邮件,并在末尾附加以下文本:
---------- VACATION -----------------
The above text was installed as your vacation message
要关闭休假自动回复,用户可以向自己发送一封主题为
- 密码休假- 其中密码是脚本中配置的密码。
用户将收到用户刚刚发送给自己的电子邮件,其中末尾附加了以下文本:
---------- VACATION -----------------
Removing message and cache:
removed `/home/[username]/.vacation_mesg'
removed `/home/[username]/.vacation_cache'
Removed vacation message.
答案2
好吧,如果主题包含标准回复,那么您可以使用“外出办公”(或类似内容)过滤所有内容/dev/null
。
:0
* 'Out Of Office'
/dev/null