获取 procmail 以回复较大的消息

Get procmail to reply to larger messages

我正在尝试回复大于特定大小的消息,然后转发给其他用户。明白了,但没有任何反应。看来我只能在消息末尾添加文本。

:0
* > 1000
{
  :0 fhw
  | cat - ; echo "Insert this text at the top of the body"
  :0
  | formail -rk
  | $SENDMAIL -t
}

目前还不清楚到底哪里出了问题,但是如果你想在开头追加文本,你显然需要在 cat 之前 echo,并在 body ( b),而不是 headers (h)。

  :0 fbw
  | echo "Insert this"; cat -

我想你可以通过在末尾添加一些东西来技术上打破 headers,但是如果你想让它出现在 body 中,它需要在之前有一个颈部(换行符)它。

:0 fhw
| cat -; echo; echo "Insert this"

还有一个 sed 语法允许更灵活的操作(例如 sed 寻址可以让你说“在以 > 开头的第一行之前”之类的话)但是在 Procmail 中将换行符放入 sed 命令行是很麻烦的。作为一种解决方法,我经常使用一个字符串,然后将其插入。(到底有多麻烦取决于 sed 语法的细节,这不是标准的. 某些实现似乎需要在 ai 命令中换行。)

sedscript='1i\
insert this\
'
:0 fbw
| sed "$sedscript"

(如果你幸运的话,你的 sed 会接受更简单的东西,比如 sed '1i insert this'。上面的变体似乎是我唯一可以在 macOS 上工作的变体,因此一般来说 * BSD.)

顺便说一句,1000 字节长的消息无论如何都不算​​大。我记得在我自己的收件箱中计算过大约 4k 的平均邮件长度,但这是在人们开始使用 HTML 电子邮件客户端之前。根据您的入站拓扑,headers 很容易超过 1000 字节。

使用 sed 帮了大忙。

SEDSCRIPT='0,/^$/ s//\nLarge message rejected [Max=4MB]\n/'
MAILADDR=me@nowhere

:0
* > 4000000
* !^FROM_DAEMON
* !^X-Loop: $MAILADDR
| formail -rk -A "X-Loop: $MAILADDR" \
| sed "$SEDSCRIPT" \
| $SENDMAIL -t