我正在使用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
标题后跟其他标题。然后将该文本作为
>> Pokou=C5=A1el jsem se vlo=C5=BEit obr=C3=A1zek pomoc=C3=AD tla=C4=8D=C3=
不太可读。
也许SED
不是正确的工具,但我希望将预处理保留为.procmailrc中的一行代码,以便将其保存在一个位置。
答案 0 :(得分:1)
至少可以说,使用sed
解析MIME消息将具有挑战性。因为你已经显然已经将Perl用于其他事情了,所以我也会在一个简单的Perl脚本中实现这个逻辑。为各种MIME内容传输编码添加解码是一个微不足道的补充。
Perl的Email::MIME package可能是一个很好的起点。您似乎已经对问题域有了基本的了解;许多初学者会错误地假设所有消息都是多部分,或者所有消息只有一个text/plain
部分。 (也许仍然强调可能没有!如果没有文本内容,某些客户端只发送二进制application/octet-stream
,或者客户端可能设置为仅编写text/html
而不生成{{1为我们这些喜欢它的人提供渲染。)