0

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

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

目前,我可以将它放在 Content-Type: text/plain 始终存在的行之后。问题是有时它不是 SMTP 标头的最后一行。 Content-Transfer-Encoding: quoted-printable 或其他标题可能会跟随。(处理单独或与 text/html 部分配对的 text/plain 部分就足够了,因为 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

因此,如果 Sender 不是来自 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 中的单行,以将其保留在一个地方。

4

1 回答 1

1

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

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

于 2013-06-04T05:48:02.837 回答