SED进行多行处理以更改传入的电子邮件发件人并将其电子邮件保留在bugzilla注释中

时间:2013-06-03 14:48:50

标签: email sed smtp bugzilla procmail

我正在使用Bugzilla来处理公开报告的错误。但我不想为任何可能发送错误报告的人创建帐户。 通过更改From SMTP标头可以轻松完成。但当然我想让发件人的电子邮件在bug中的某个地方可见。

我正在努力使sed将该行作为电子邮件的普通/文本部分的第一行。 问题归结为如何在一行符合REGEXP的行之后的第一个空行之后放置一个特定行     /\(Content-Type: text\/plain.*\)/

目前,我可以把它放在后面     Content-Type: text/plain 线,总是存在。 问题是有时它不是SMTP标头的最后一行。     Content-Transfer-Encoding: quoted-printable 或者其他标题可以跟随。 (足以处理单独的文本/普通部分或者与text / html部分配对,这不需要处理,因为bugzilla只接受它作为附件。)

到目前为止,我正在使用.procmailrc来预处理传入的电子邮件:

LOGFILE=/home/bugmail/procmail.log


## Mails from myserver.com goes to bugzilla as-is
:0
* ^To:.*@otherservice.com.*
* ^From:.*@myserver.com.*
|/var/www/www.alfa.myserver.com/bugzilla/email_in.pl -vvv --default op_sys=All --override product="app-support" --default rep_platform=All --override component="Startovac" --default version=unspecified


## Mails from myserver.com goes to bugzilla as-is
:0
* ^From:.*@myserver.com.*
|/var/www/www.alfa.myserver.com/bugzilla/email_in.pl -vvv --default op_sys=All --override product="app-support" --default rep_platform=All --override component="Default" --default version=unspecified


## Mails from external address that is multipart/*
:0
* ^To:.*@otherservice.com.*
* Content-Type: multipart/*
| sed -n 's/\(Content-Type: text\/plain.*\)/\1\n\nFromNew: app-support@myserver.com/; p' | sed '/^From:\(.*@.*\)/{h; s//FromNew: app-support@myserver.com/;b};/FromNew: app-support@myserver.com/x' | sed -e '1,/^From:/s/^From:/FromOriginal:/' | sed -e '1,/^FromNew:/s/^FromNew:/From:/' |/var/www/www.alfa.myserver.com/bugzilla/email_in.pl -vvv --default op_sys=All --override product="app-support" --default rep_platform=All --override component="Specificcomponent" --default version=unspecified


## Mails from external address that is multipart/*
:0
* Content-Type: multipart/*
| sed -n 's/\(Content-Type: text\/plain.*\)/\1\n\nFromNew: app-support@myserver.com/; p' | sed '/^From:\(.*@.*\)/{h; s//FromNew: app-support@myserver.com/;b};/FromNew: app-support@myserver.com/x' | sed -e '1,/^From:/s/^From:/FromOriginal:/' | sed -e '1,/^FromNew:/s/^FromNew:/From:/' |/var/www/www.alfa.myserver.com/bugzilla/email_in.pl -vvv --default op_sys=All --override product="app-support" --default rep_platform=All --override component="Default" --default version=unspecified

## Mails from external address that is only text/plain
:0
* ^To:.*@myserver.com.*
|sed -e '1,/^$/s/^$/\nFromNew: app-support@myserver.com/' | sed '/^From:\(.*@.*\)/{h; s//FromNew: app-support@myserver.com/;b};/FromNew: app-support@myserver.com/x' | sed -e '1,/^From:/s/^From:/FromOriginal:/' | sed -e '1,/^FromNew:/s/^FromNew:/From:/' |/var/www/www.alfa.myserver.com/bugzilla/email_in.pl -vvv --default op_sys=All --override product="app-support" --default rep_platform=All --override component="Default" --default version=unspecified

## Mails from external address that is only text/plain
:0
* ^To:.*@otherservice.com.*
|sed -e '1,/^$/s/^$/\nFromNew: app-support@myserver.com/' | sed '/^From:\(.*@.*\)/{h; s//FromNew: app-support@myserver.com/;b};/FromNew: app-support@myserver.com/x' | sed -e '1,/^From:/s/^From:/FromOriginal:/' | sed -e '1,/^FromNew:/s/^FromNew:/From:/' |/var/www/www.alfa.myserver.com/bugzilla/email_in.pl -vvv --default op_sys=All --override product="app-support" --default rep_platform=All --override component="Specificcomponent" --default version=unspecified

因此,如果发件人不是来自myserver.com,则将From设置为app-support@myserver.com(这是现有的Bugzilla用户),并将原始的From电子邮件移至第一行。电子邮件正文。

当问题出现时     Content-Type: text/plain 标题后跟其他标题。然后将该文本作为

放入Bugzilla注释中
>> Pokou=C5=A1el jsem se vlo=C5=BEit obr=C3=A1zek pomoc=C3=AD tla=C4=8D=C3=

不太可读。

也许SED不是正确的工具,但我希望将预处理保留为.procmailrc中的一行代码,以便将其保存在一个位置。

1 个答案:

答案 0 :(得分:1)

至少可以说,使用sed解析MIME消息将具有挑战性。因为你已经显然已经将Perl用于其他事情了,所以我也会在一个简单的Perl脚本中实现这个逻辑。为各种MIME内容传输编码添加解码是一个微不足道的补充。

Perl的Email::MIME package可能是一个很好的起点。您似乎已经对问题域有了基本的了解;许多初学者会错误地假设所有消息都是多部分,或者所有消息只有一个text/plain部分。 (也许仍然强调可能没有!如果没有文本内容,某些客户端只发送二进制application/octet-stream,或者客户端可能设置为仅编写text/html而不生成{{1为我们这些喜欢它的人提供渲染。)