【问题标题】:Get procmail to reply to larger messages获取 procmail 以回复较大的邮件
【发布时间】: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


    【解决方案1】:

    不清楚到底是什么问题,但如果你想在开头追加文本,你显然需要在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 个字节。

    【讨论】:

      【解决方案2】:

      使用 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 之前可以避免将整个消息推送到管道中。
      • @tripleee 我采纳了您对sed 脚本的建议,而是将响应消息分解为一个变量。虽然不确定在formail 之前运行脚本,但在生成回复之前如何在正确的位置插入文本?
      • 哦,我的错,你是对的,如果你把它们换掉,你会得到不同的最终结果。我想,您可以只将标头通过管道传递给formail,然后添加一个新的正文,以避免推动您无论如何都要丢弃的巨大blob。
      • sed 脚本放在一个变量中是一种解决方法,它可以解决脚本本身需要在引号之间包含文字换行符但您的没有,因此在脚本的当前形式中不必要的并发症。
      猜你喜欢
      • 2019-01-17
      • 1970-01-01
      • 2021-01-21
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多