【发布时间】:2017-06-29 16:17:03
【问题描述】:
我正在尝试回复大于特定大小的消息,然后转发给另一个用户。得到了这个,但没有任何反应。看来我只能在邮件末尾添加文本。
:0
* > 1000
{
:0 fhw
| cat - ; echo "Insert this text at the top of the body"
:0
| formail -rk
| $SENDMAIL -t
}
【问题讨论】:
标签: procmail
我正在尝试回复大于特定大小的消息,然后转发给另一个用户。得到了这个,但没有任何反应。看来我只能在邮件末尾添加文本。
:0
* > 1000
{
:0 fhw
| cat - ; echo "Insert this text at the top of the body"
:0
| formail -rk
| $SENDMAIL -t
}
【问题讨论】:
标签: procmail
不清楚到底是什么问题,但如果你想在开头追加文本,你显然需要在cat之前添加echo,并且在正文(b)上工作,而不是标题(@ 987654324@).
:0 fbw
| echo "Insert this"; cat -
我想从技术上讲,您可以通过在末尾附加一些内容来破坏标题,但是如果您希望它出现在正文中,则它需要在其前面有一个颈部(换行符)。
:0 fhw
| cat -; echo; echo "Insert this"
还有一个sed 语法允许更灵活的操作(sed 寻址可以让你说诸如“在以> 开头的第一行之前)但在sed 命令中添加换行符Procmail 中的行是毛茸茸的。作为一种解决方法,我经常使用一个字符串,然后只插入它。(到底有多毛茸茸取决于sed 语法的细节,这些不是标准的。一些实现似乎需要a 中的换行符和i 命令。)
sedscript='1i\
insert this\
'
:0 fbw
| sed "$sedscript"
(如果你幸运的话,你的sed 会接受像sed '1i insert this' 这样更简单的东西。上面的变体似乎是我唯一可以在 macOS 上工作的变体,因此通常可能是 *BSD。)
顺便说一句,1000 字节长的消息无论如何都不算大。我记得在我自己的收件箱中计算了大约 4k 的平均邮件长度,但这是在人们开始使用 HTML 电子邮件客户端之前。根据您的入站拓扑,仅标头很容易超过 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
【讨论】:
sed 脚本不包含文字换行符,则无需将其放入变量中。
sed 放在formail 之前可以避免将整个消息推送到管道中。
sed 脚本的建议,而是将响应消息分解为一个变量。虽然不确定在formail 之前运行脚本,但在生成回复之前如何在正确的位置插入文本?
formail,然后添加一个新的正文,以避免推动您无论如何都要丢弃的巨大blob。
sed 脚本放在一个变量中是一种解决方法,它可以解决脚本本身需要在引号之间包含文字换行符但您的没有,因此在脚本的当前形式中不必要的并发症。