我有一个本地 procmail 用户“bob”。
如果电子邮件到达并与 [email protected] 匹配,则不应采取任何措施。
但是,如果收到一封电子邮件并且是 [anything_else]@domain.com,那么我想重写主题行以在主题行的前面插入“[spam]”。
所以它是“bob@”的反向匹配(匹配除 bob@ 以外的任何内容),我们保留原始主题行,只是在其前面添加“[spam]”。
我怎么能用 Procmail 做到这一点?
我有一个本地 procmail 用户“bob”。
如果电子邮件到达并与 [email protected] 匹配,则不应采取任何措施。
但是,如果收到一封电子邮件并且是 [anything_else]@domain.com,那么我想重写主题行以在主题行的前面插入“[spam]”。
所以它是“bob@”的反向匹配(匹配除 bob@ 以外的任何内容),我们保留原始主题行,只是在其前面添加“[spam]”。
我怎么能用 Procmail 做到这一点?
我已安装并配置 Postfix 以将邮件传递到 Procmail。我已将 Procmail 配置为将电子邮件传递给 Python 脚本。我还注意到 Procmail 正在将同一电子邮件的副本放入/var/spool/mail/<username>
. 我不希望将消息的副本保留在那里或服务器上的任何地方。有没有办法配置 Procmail 在将消息发送到 Python 脚本后丢弃消息?
在我的 .procmailrc 中配置如下:
:0Wc:
| env python3 /home/user/python/script.py
:0
* ^From:.*@.*
/dev/null
然而,这不起作用。消息仍然结束/var/spool/mail/<username>
。
我正在尝试使用 Google 帐户fetchmail
进行配置。procmail
这是我的$HOME/.fetchmailrc
:
poll imap.gmail.com protocol IMAP
user "<email>" is jviotti here
password '<password>'
folder 'Inbox'
keep
ssl
mda 'procmail'
这是我的$HOME/.procmailrc
:
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/$LOGNAME/
LOGFILE=$MAILDIR/log/procmail
VERBOSE=on
在为每条下载的消息procmail
运行时,我会收到以下错误:fetchmail -a -v
fetchmail: IMAP> A0005 FETCH 1 RFC822.HEADER
fetchmail: IMAP< * 1 FETCH (RFC822.HEADER {2865}
reading message <email>@gmail-imap.l.google.com:1 of 22 (2865 header octets) #
fetchmail: IMAP< )
fetchmail: IMAP< A0005 OK Success
fetchmail: IMAP> A0006 FETCH 1 BODY.PEEK[TEXT]
fetchmail: IMAP< * 1 FETCH (BODY[TEXT] {3983}
(3983 body octets) *******************************.************************.***********.*****
fetchmail: IMAP< )
fetchmail: IMAP< A0006 OK Success
procmail: Couldn't create "/var/mail/jviotti"
not flushed
fetchmail: IMAP> A0007 STORE 1 +FLAGS (\Seen)
fetchmail: IMAP< A0007 OK Success
注意procmail: Couldn't create "/var/mail/jviotti" not flushed
。出于某种原因,procmail
坚持写信给/var/mail
即使MAILDIR=$HOME/Mail
和DEFAULT=$MAILDIR/$LOGNAME/
。
为什么会这样?
通过查看procmailrc
手册页,我发现ORGMAIL
默认为/var/mail/$LOGNAME
,并且DEFAULT
默认为ORGMAIL
:
ORGMAIL /var/mail/$LOGNAME
(Unless -m has been specified, in which case it is unset)
DEFAULT $ORGMAIL
但是,即使在设置ORGMAIL
为其他内容后$HOME/.procmailrc
,我也会收到相同的错误/警告。
请注意,即使我收到此错误,我的邮件也已正确下载到$HOME/Mail
.
编辑:查看procmail -v
. 出于某种原因,它仍然将我的系统邮箱设置为 /var/mail/jviotti。
$ procmail -v
procmail v3.22 2001/09/10
Copyright (c) 1990-2001, Stephen R. van den Berg <[email protected]>
Copyright (c) 1997-2001, Philip A. Guenther <[email protected]>
Submit questions/answers to the procmail-related mailinglist by sending to:
<[email protected]>
And of course, subscription and information requests for this list to:
<[email protected]>
Locking strategies: dotlocking, flock()
Default rcfile: $HOME/.procmailrc
Your system mailbox: /var/mail/jviotti
编辑 2:请参阅以下内容man procmail
:
如果在命令行上没有指定 rcfiles 和 -p,procmail 将在读取 $HOME/.procmailrc 之前解释来自 /etc/procmailrc(如果存在)的命令。创建 /etc/procmailrc 时必须小心,因为如果情况允许,它将以 root 权限执行(当然与 $HOME/.procmailrc 文件相反)。
这里说在读取我的主配置之前,它将从 读取/etc/procmailrc
,但是该文件在我的系统上不存在,即使通过显式传递-p
(指向我的主配置),系统邮箱仍然是/var/mail/jviotti
.
手册页还说:
如果没有找到 rcfile,或者 rcfile 的处理结束,procmail 会将邮件存储在默认的系统邮箱中。
“落到尽头”是什么意思?
这是 Procmail 日志文件中来自一条传入消息的输出:
procmail: [49293] Tue Dec 13 14:29:20 2016
procmail: Assigning "LASTFOLDER=/Users/jviotti/Mail/jviotti/new/1481653760.49293_2.jviotti-rmbp.local"
procmail: Notified comsat: "jviotti@0:/Users/jviotti/Mail/jviotti/new/1481653760.49293_2.jviotti-rmbp.local"
From jviotti Tue Dec 13 14:29:20 2016
Subject: Re: [resin-io/etcher] chore: add support for snapshot builds (#968)
Folder: /Users/jviotti/Mail/jviotti/new/1481653760.49293_2.jviotti-r 8015
我想通过添加 [BULK] 来更改所有订阅列表电子邮件的主题。看起来全局 /etc/procmailrc 文件是最好的地方。但是这个过滤器也会删除一些电子邮件的所有标题(我的更改用破折号分隔):
LOGFILE=/var/log/procmail.log
TRAP=/etc/webmin/virtual-server/procmail-logger.pl
:0wi
VIRTUALMIN=|/etc/webmin/virtual-server/lookup-domain.pl --exitcode 73 $LOGNAME
EXITCODE=$?
:0
* ?/bin/test "$EXITCODE" = "73"
/dev/null
EXITCODE=0
:0
* ?/bin/test "$VIRTUALMIN" != ""
{
INCLUDERC=/etc/webmin/virtual-server/procmail/$VIRTUALMIN
}
-----
:0
* ^List-Unsubscribe:.*
{
:0 hw
SUBJECT=| formail -xSubject:
:0 hfw
* ^List-Unsubscribe:.*
| /usr/bin/formail -i "Subject: [BULKMAIL] $SUBJECT"
}
-----
DEFAULT=$HOME/Maildir/
ORGMAIL=$HOME/Maildir/
DROPPRIVS=yes
使用此代码的用户主目录规则中的单个 .procmailrc 效果很好,但很难管理。
我有一个脚本生成的电子邮件,每小时发送一次。除非在某些情况下,我不需要看到它,所以我只想将它过滤到自己的邮箱中。该消息来自 cron,我要注意不要过滤掉其他 cron 消息,仅根据来源和内容过滤掉这一条。
我要匹配的正文行(消息的第一行以它开头)是:
/etc/cron.hourly/scriptrun:
这是我想出的不起作用的方法。我不确定我哪里出错了。
:0 HB
* ^From:.*[email protected]
* ^Subject: {Cron
* \/etc\/cron.hourly\/scriptrun
.Save/
任何想法将不胜感激。
我有以下问题:我最近有一台新的工作 PC(Debian 测试,代号:stretch),必须重新安装fetchmail
才能procmail
阅读我的电子邮件mutt
。现在,fetchmail
效果也很好mutt
,只有我的邮件的假脱机邮箱似乎保持不变,即/var/mail/user
.
在我的.fetchmailrc
我定义了mda
应该执行的:
mda '/usr/bin/procmail -f %F -d %T';
我创建的.procmailrc
看起来像这样:
# Please check if all the paths in PATH are reachable, remove the ones that
# are not.
SHELL=/bin/sh
PATH=$HOME/bin:/usr/bin:/usr/ucb:/bin:/usr/local/bin:.
MAILDIR=$HOME/Mail # Youd better make sure it exists
SPOOL=$HOME/Mail/mbox
DEFAULT=$MAILDIR/mbox
ORGMAIL=$MAILDIR/mbox
LOGFILE=$MAILDIR/log
LOCKFILE=$HOME/.lockmail
VERBOSE= yes
LOGABSTRACT= all
在我到处寻找之后,rc
一次又一次地更改和检查文件和邮件文件夹的权限,最后尝试全部卸载并重新安装它,没有任何改变:/var/mail/user
即使我在其中插入了一些递送条件,邮件仍然被递送到.procmailrc
. _
最后我注意到没有/etc/procmailrc
文件(我认为它应该是),并且所有log
应该存在和写入的文件都不存在。
fetchmail
正在调用 procmail,因为$ fetchmail -vvv
带有传入电子邮件的 a 在其较长的输出中具有以下字符串:
fetchmail: about to deliver with: /usr/bin/procmail -f 'email@addres' -d 'user'
我的结论是它procmail
无法正常工作或根本无法正常工作。电子邮件仍然到达,但都在那个默认邮箱/文件夹中,并且在它们传递时我无法移动它们(当我在里面时,mutt
我可以将它们保存到我拥有或可能定义的所有邮箱中)。
如果有人可以帮助我解决这个问题,我将不胜感激!
亲切的问候。
让我们假设一个典型的设置,其中从 sendmail 调用 procmail 以将传入的电子邮件过滤到正确的邮箱中。是在与 sendmail 的传入 SMTP 连接仍处于活动状态时完成,还是在电子邮件已被接受后完成?
如果是前者,那么我理解 procmail 可能会返回到 sendmail 一个错误,以便 sendmail 回复一个错误代码,例如554 Transaction failed
在接受SMTP DATA时,而不是通常的 200?
在我的例子中,sendmail 从别名数据库调用 procmail,条目如下:
theaddres: theaddres-somedomain-com.virtual
theaddres-somedomain-com.virtual: |"/usr/libexec/sm.bin/someuser.virtual somedomain@theaddress"
然后执行 procmail 脚本:
root@mda:/etc/mail # less /usr/libexec/sm.bin/someuser.virtual
/usr/local/bin/procmail -a $1 /usr/local/etc/procmailrc/someuser.virtual
编辑:
添加更详细的解释。首先,我想确定下面概述的基于维基百科示例的流程在 SMTP 协议中是否可行。如果是,那么是否可以使用 procmail。然后,如果没有(我猜是这种情况),是否存在可能的实现(例如 milter)。
S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:<[email protected]>
S: 250 Ok
C: RCPT TO:<[email protected]>
S: 250 Ok
C: RCPT TO:<[email protected]>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: "Bob Example" <[email protected]>
C: To: "Alice Example" <[email protected]>
C: Cc: [email protected]
C: Date: Tue, 15 January 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
Now this is what I would like to see:
S (after receiving the first 2 lines out of 4): 452 Requested action not taken: insufficient system storage
C: QUIT
S: 221 Bye
{The server closes the connection}
因此,服务器停止接收电子邮件(例如,因为它在电子邮件中检测到序列“这是一条测试消息”)并用错误回复客户端。在这种情况下,它是 452,但它可能是响应DATA 请求的任何有效错误。客户可能会也可能不会回应 QUIT,我不在乎。
这可能取决于 SMTP 协议是如何在 TCP 级别实现的。我可以将从客户端接收到的数据量限制为 50 个初始字节(例如通过限制 TCP 帧的大小)吗?SMTP 协议是否允许我在客户端发送 DATA 内容时回复错误?
此外,如果服务器在接收到 DATA 的初始部分后故意断开连接(而不是尝试向客户端发送错误),则与传输电子邮件时 TCP 连接意外断开没有什么不同。表现良好的 MTA 会尝试重新连接并重新发送电子邮件,垃圾邮件发送者可能不会费心重试。
尝试根据正则表达式匹配直接发送电子邮件。
我知道我可以这样做:
echo | mail -s test1 me-route2
用这个食谱:
* ^To:.*me-route2\@
:0:
/home/me/folder-route2/afile
我想做的是这样的:
* ^To:.*me-(route\d)\@
:0:
/home/me/folder-$MATCH/afile
但我得到:
procmail: Lock failure on "/home/me/folder-/afile.lock"
我想检查 procmail 是否存在文件,如果文件不存在,则取决于此设置 DROPPRIVS=yes 留在 DROPPRIVS=no
为什么这不起作用?
:0 w
* `test -f $HOME/mail/.procmailrc` ?? 1
{
DROPPRIVS=yes
}