所有传入邮件执行bash命令(后缀) [英] Execute bash command for all incoming mails (Postfix)

查看:225
本文介绍了所有传入邮件执行bash命令(后缀)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要对每个进入postfix邮件的正文执行命令。

  sed的':一个; N; $ BA; S / = \\ n // G'/路径为/信息文件| SED的/< / \\ n \\< / G'| SED -r'/'$(SED -r 's/\\\\/\\\\\\\\/g;s/\\//\\\\\\//g;s/\\^/\\\\^/g;s/\\[/\\\\[/g;s/'\\''/'\\'\"\\\\\\\\\"\\'\\''/g;s/\\]/\\\\]/g;s/\\*/\\\\*/g;s/\\$/\\\\$/g;s/\\./\\\\./g'白名单|贴-s -d'|')'/! S / HTTP / httx / G'

我认为这可能是可能的 Postfix的内容过滤器队列之后,但我不知道该怎么做...

编辑:

afterqueue.sh

 #!/ bin / sh的
#简单的基于壳过滤器。它是指被调用如下:
#/路径/到/脚本-f发件人收件人...#本地化这些。 -g选项并没有Postfix的2.3之前。
INSPECT_DIR =的/ var /线轴/过滤器
SENDMAIL =/ usr / sbin目录/ sendmail的-G -i#永远永远永远使用-t在这里。#退出codeS来自以下; sysexits.h>
EX_TEMPFAIL = 75
EX_UNAVAILABLE = 69#完成或中止时,当清理。
陷阱RM -f英寸$$0 1 2 3 15#开始处理。
CD $ INSPECT_DIR || {
    回声$ INSPECT_DIR不存在;退出$ EX_TEMPFAIL; }猫>在$$ ||。 {
   回声无法保存邮件到文件;退出$ EX_TEMPFAIL; }#这里指定您的内容过滤器。
SH /path/to/remove_links.sh<在$$。$ SENDMAIL$ @<在$$。退出$?

remove_links.sh

 #!/斌/庆典SED':一个; N; $ BA; S / = \\ n // G'$ 1 | SED的/< / \\ n \\< / G'| SED -r'/'$(SED -r 's/\\\\/\\\\\\\\/g;s/\\//\\\\\\//g;s/\\^/\\\\^/g;s/\\[/\\\\[/g;s/'\\''/'\\'\"\\\\\\\\\"\\'\\''/g;s/\\]/\\\\]/g;s/\\*/\\\\*/g;s/\\$/\\\\$/g;s/\\./\\\\./g' /路径/要/白名单|粘贴-s -d'|')'/! S / HTTP / httx / G'

这是工作,如果我用手工调用它,但如果我把它添加到/etc/postfix/master.cf是这样的:

 #===================================== ========================
  #服务类型私人unpriv的chroot唤醒MAXPROC命令
  #(是)(是)(是)(永远)(100)
  #================================================= ============
  过滤UNIX - N N - 10管
    标志= RQ用户=过滤null_sender =
    argv的= /路径/要/ afterqueue.sh -f $ {发件人} - $ {}收件人

有在邮件中没有改变。
我得到以下日志:

  4月13日15时14分08秒rs211184后缀/ QMGR [7492]:3FFDF23CB5F:从= LT; test@gmail.com> ;,大小= 4358,nrcpt = 1(主动队列)
4月13日15时14分08秒rs211184后缀/管[7504]:116E523CA8C:以= LT; example@example.de> ;,继电器=过滤器,延迟= 0.2,延误= 0.16 / 0/0 / 0.04,DSN = 2.0。 0,状态=发送(通过过滤器的服务交付)
4月13日15时14分08秒rs211184后缀/ QMGR [7492]:116E523CA8C:删除
4月13日15时14分08秒rs211184后缀本地[7522]后缀本地:from=test@gmail.com,to=example@example.de,目录名=的/ var / qmail的/邮件名
4月13日15时14分08秒rs211184后缀/管[7521]:3FFDF23CB5F:以= LT; dsehlhoff@lcdev1.de> ;,继电器= plesk_virtual,延迟= 0.02,延误= 0.01 / 0/0 / 0.01,DSN = 2.0。 0,状态=发送(通过plesk_virtual服务交付)
4月13日15时14分08秒rs211184后缀/ QMGR [7492]:3FFDF23CB5F:删除


解决方案

您似乎期望一个文件的消息,奇怪的是一个静态的文件名,但是这不是它的工作原理。在标准输入的邮件到达。微创,只是删除 /路径/要/消息文件 - 不过说真的,管道 SED SED 很常有的错误;你应该重构这个单个 SED 脚本(或awk的,或Python,或者你有什么)。

  SED -e':一个; N; $ BA; S / = \\ n // G'-e'S /< / \\ n \\< / G' |
#这也太令人费解的,真的!
SED -r'/'$(SED -r 's/\\\\/\\\\\\\\/g;s/\\//\\\\\\//g;s/\\^/\\\\^/g;s/\\[/\\\\[/g;s/'\\''/'\\'\"\\\\\\\\\"\\'\\''/g;s/\\]/\\\\]/g;s/\\*/\\\\*/g;s/\\$/\\\\$/g;s/\\./\\\\./g'白名单|
贴-s -d'|')'!/ S / HTTP / httx / G'

I want to execute a command on the body of every incoming postfix mail.

sed ':a;N;$!ba;s/=\n//g' /path-to/message-file | sed 's/</\n\</g'  | sed -r '/'"$(sed -r 's/\\/\\\\/g;s/\//\\\//g;s/\^/\\^/g;s/\[/\\[/g;s/'\''/'\'"\\\\"\'\''/g;s/\]/\\]/g;s/\*/\\*/g;s/\$/\\$/g;s/\./\\./g' whitelist | paste -s -d '|')"'/! s/http/httx/g'

I think it could be possible with Postfix After-Queue Content Filter, but I don't know how to do it...

EDIT:

afterqueue.sh

#!/bin/sh
# Simple shell-based filter. It is meant to be invoked as follows:
#       /path/to/script -f sender recipients...

# Localize these. The -G option does nothing before Postfix 2.3.
INSPECT_DIR=/var/spool/filter
SENDMAIL="/usr/sbin/sendmail -G -i" # NEVER NEVER NEVER use "-t" here.

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || {
    echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }

cat >in.$$ || { 
   echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Specify your content filter here.
sh /path/to/remove_links.sh <in.$$

$SENDMAIL "$@" <in.$$

exit $?

remove_links.sh

#!/bin/bash

sed ':a;N;$!ba;s/=\n//g' $1 | sed 's/</\n\</g'  | sed -r '/'"$(sed -r 's/\\/\\\\/g;s/\//\\\//g;s/\^/\\^/g;s/\[/\\[/g;s/'\''/'\'"\\\\"\'\''/g;s/\]/\\]/g;s/\*/\\*/g;s/\$/\\$/g;s/\./\\./g' /path/to/whitelist | paste -s -d '|')"'/! s/http/httx/g'

It is working, if I call it by hand, but if I add it to the /etc/postfix/master.cf like this:

  # =============================================================
  # service type  private unpriv  chroot  wakeup  maxproc command
  #               (yes)   (yes)   (yes)   (never) (100)
  # =============================================================
  filter    unix  -       n       n       -       10      pipe
    flags=Rq user=filter null_sender=
    argv=/path/to/afterqueue.sh -f ${sender} -- ${recipient}

there are no changes in the mail. I get the following syslog:

Apr 13 15:14:08 rs211184 postfix/qmgr[7492]: 3FFDF23CB5F: from=<test@gmail.com>, size=4358, nrcpt=1 (queue active)
Apr 13 15:14:08 rs211184 postfix/pipe[7504]: 116E523CA8C: to=<example@example.de>, relay=filter, delay=0.2, delays=0.16/0/0/0.04, dsn=2.0.0, status=sent (delivered via filter service)
Apr 13 15:14:08 rs211184 postfix/qmgr[7492]: 116E523CA8C: removed
Apr 13 15:14:08 rs211184 postfix-local[7522]: postfix-local: from=test@gmail.com, to=example@example.de, dirname=/var/qmail/mailnames
Apr 13 15:14:08 rs211184 postfix/pipe[7521]: 3FFDF23CB5F: to=<dsehlhoff@lcdev1.de>, relay=plesk_virtual, delay=0.02, delays=0.01/0/0/0.01, dsn=2.0.0, status=sent (delivered via plesk_virtual service)
Apr 13 15:14:08 rs211184 postfix/qmgr[7492]: 3FFDF23CB5F: removed

解决方案

You seem to expect the message in a file, and oddly a static file name, but that's not how it works. The message arrives on standard input. Minimally, just remove /path/to/message-file -- but really, piping sed to sed is very often a mistake; you should refactor this to a single sed script (or Awk, or Python, or what have you).

sed -e ':a;N;$!ba;s/=\n//g' -e 's/</\n\</g' |
# This is too convoluted, really!
sed -r '/'"$(sed -r 's/\\/\\\\/g;s/\//\\\//g;s/\^/\\^/g;s/\[/\\[/g;s/'\''/'\'"\\\\"\'\''/g;s/\]/\\]/g;s/\*/\\*/g;s/\$/\\$/g;s/\./\\./g' whitelist |
paste -s -d '|')"'/! s/http/httx/g'

这篇关于所有传入邮件执行bash命令(后缀)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆