我刚刚发现 procmail 网站 ( http://www.procmail.org/ ) 已关闭。我对它的状态做了一些研究,似乎 procmail 的开发自 2001 年以来就已经死了。即使是旧的 procmail 维护者也建议将它从 openbsd 端口中删除,因为代码不安全(https://marc.info/? l=openbsd-ports&m=141634350915839&w=2)。这有点吓人,因为未修复的错误可能会导致远程代码执行漏洞。最近的 Linux 发行版(例如 Ubuntu、Debian)仍然提供它,但是使用 procmail 仍然安全吗?
情况:邮件服务器只能通过 IMAP 访问。问题:我希望能够过滤邮件(将一些邮件放入各种文件夹,将它们标记为已读等)。
大多数新的电子邮件客户端都有这种能力,但我想要一个独立的过滤程序,因为我需要使用各种电子邮件客户端来连接到这个服务器。
通常 - 类似于 procmail,但通过 IMAP 工作。
该软件将在 Linux 或 Solaris 上运行。
我需要一个 procmail 配方来存储邮件并将其转发到另一个地址。
以下工作正常:
:0c
! addressto@forward.to
Run Code Online (Sandbox Code Playgroud)
但是..现在我需要更改From:正在转发的邮件中的标题,我知道这可能可以用 formail 来完成,但我没有找到任何关于如何做到这一点并仍然存储电子邮件的好例子
编辑:自己解决了,见下面的答案
我正在尝试配置fetchmail并procmail使用 Google 帐户。这是我的$HOME/.fetchmailrc:
poll imap.gmail.com protocol IMAP
user "<email>" is jviotti here
password '<password>'
folder 'Inbox'
keep
ssl
mda 'procmail'
Run Code Online (Sandbox Code Playgroud)
这是我的$HOME/.procmailrc:
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/$LOGNAME/
LOGFILE=$MAILDIR/log/procmail
VERBOSE=on
Run Code Online (Sandbox Code Playgroud)
为下载的每条消息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 …Run Code Online (Sandbox Code Playgroud) 我正在使用 procmail 接收电子邮件,然后将它们转发到脚本进行处理。有时这甚至意味着生成电子邮件(例如,将消息转发给另一个用户,或回答查询)。
不用说,我对将来自自动回复器或假期回复的电子邮件加载到我的服务器中的兴趣为零,所以我想知道是否有一种简单的方法可以过滤掉这些消息。无论如何,我正在将它们传递给脚本,所以我总是可以在脚本中滚动我自己的过滤器,但我不想重新发明轮子。
我已经知道我应该用Precedence: junk或垃圾邮件Precedence: bulk。我可以像过滤 procmail 中的任何其他标题一样过滤它们吗?
我正在使用 Postfix 和 Procmail 的组合来处理我的一台服务器上的入站电子邮件。每个用户都有一个本地帐户,多年来我一直在/usr/local/etc/procmailrc成功使用以下帐户:
DEFAULT=$HOME/mail/
LOGFILE=/var/log/procmail
Run Code Online (Sandbox Code Playgroud)
我最近添加了一个方法,将标记为垃圾邮件的邮件定向到一个单独的文件夹:
:0
* ^X-Spam-Flag: YES
$HOME/mail/.Junk/
Run Code Online (Sandbox Code Playgroud)
但是,在某些情况下,进入此文件夹的邮件似乎归 root 而不是正确的用户所有。我的收件箱从来没有遇到过这个问题,而且它似乎只影响某些用户。
我设法捕获了其中一个 Procmail 进程ps,它似乎确实以正确的用户身份运行。(此用户在 Junk 文件夹中也有 root 拥有的邮件)
# ps axu | grep procmail
{correct-local-username} 7402 0.0 0.2 12140 1780 ?? Ss 11:37AM 0:00.01 /usr/local/bin/procmail -a
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么由配方处理的消息最终归 root 所有,而进入默认文件夹的消息将获得正确的所有者?
有什么我可以做的(即使它很笨拙,例如从 Procmail 配方中调用 chown)来确保消息始终归正确的用户所有?
以防万一,Procmail 在 Postix 中的配置如下:
mailbox_command = /usr/local/bin/procmail -a "$EXTENSION"
Run Code Online (Sandbox Code Playgroud) 我验证了我的后缀安装/中继设置是否有效。现在我在 procmail 上遇到了麻烦。我使用以下命令将其连接到 postfix:
mailbox_command = /usr/bin/procmail -f -a "$USER"
Run Code Online (Sandbox Code Playgroud)
我的 procmail 配置中没有任何内容,但有以下内容:
LOGFILE=/var/procmailrc/log
Run Code Online (Sandbox Code Playgroud)
我向以前工作过的收件人发送一封电子邮件(在附加 procmail 之前)。现在它失败并出现错误:
Apr 6 14:07:05 localhost postfix/qmgr[15194]: D0C3DFF6E1: from=<double-bounce@spamkill0.XXXXX>, size=938, nrcpt=1 (queue active)
Apr 6 14:07:05 localhost postfix/local[1953]: D0C3DFF6E1: to=<root@spamkill0.XXXXX>, orig_to=<postmaster>, relay=local, delay=0.05, delays=0.02/0.01/0/0.02, dsn=5.2.0, status=bounced (can't create user output file. Command output: procmail: Couldn't create "/var/spool/mail/nobody" procmail: Couldn't read "//root" )
Apr 6 14:07:05 localhost postfix/bounce[1955]: warning: D0C3DFF6E1: undeliverable postmaster notification discarded
Apr 6 14:07:05 localhost postfix/qmgr[15194]: D0C3DFF6E1: removed
Run Code Online (Sandbox Code Playgroud)
似乎存在某种权限问题,但我不知道问题是什么,也不明白如何进一步诊断它。顺便说一下,我指定的日志文件是空的。
如何使 procmail+postfix 工作?
我有一对主要由 Postfix、Procmail 和 Cyrus-IMAP 组成的邮件服务器,它们都可以正常工作。IMAP 服务器配置为简单的主/副本对。所有“普通”邮件都被 master 的 Postfix 接受,后者通过 Procmail 处理它以传送到运行在同一服务器上的 Cyrus-IMAP。两台服务器都能够像这样运行,但只有主服务器实际接收外部电子邮件。
目前,任一盒子上的本地帐户通过其本地 Postfix 发送邮件(例如,由 cron 作业生成),该 Postfix 在本地传送到同一盒子上的 Cyrus-IMAP。
但是,Cyrus 的复制不喜欢直接在副本上发生更改,因此我更希望副本将其本地邮件传递给主服务器。
我看到了实现这一目标的两种方法:
或者
还有第三种方法是让副本服务器将所有内容中继到主服务器(即内部和外部电子邮件),但这似乎有些不必要。我不需要更改外部邮件的处理方式 - 任何一个盒子都可以通过其本地 Postfix 发送外部电子邮件,然后将其转发到外部。
我真正想做的只是更改副本上处理内部电子邮件的方式,以便将它们传递给主服务器,或者传递到 Postfix 或传递到那里的 IMAP 服务器。
我在 postfix 的 master.cf 中的本地传输的现有、工作和配置:
procmail-local unix - n n - - pipe
flags=OR user=cyrus argv=/usr/bin/procmail -t -m RECIPIENT=${mailbox}
SENDER=${sender} EXTENSION=${extension} /etc/procmailrc
Run Code Online (Sandbox Code Playgroud)
procmailrc 中向 Cyrus 交付的现有、工作和配置:
DELIVERMAIL="/usr/lib/cyrus/bin/deliver -r $SENDER -a $RECIPIENT $RECIPIENT
Run Code Online (Sandbox Code Playgroud)