所有传入邮件执行bash命令(后缀) [英] Execute bash command for all incoming mails (Postfix)
问题描述
我要对每个进入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屋!