0

公に報告されたバグの処理にも Bugzilla を使用しています。しかし、私は、バグ レポートを送信する可能性のある人のアカウントを作成したくありません。これは、From SMTP ヘッダーを変更することで簡単に実行できます。しかしもちろん、送信者の電子メールがバグ内のどこかに表示されるようにしたいと思います。

電子メールのプレーン/テキスト部分の最初の行として行を配置するようにsedを作成する方法に苦労しています。問題は、特定の行を REGEXP に準拠した行ブロックの後の最初の空の行の後に配置する方法に要約されます。 /\(Content-Type: text\/plain.*\)/

Content-Type: text/plain 現在、常に存在する行の後に配置でき ます。問題は、SMTP ヘッダーの最後の行ではない場合があることです。 Content-Transfer-Encoding: quoted-printable または他のヘッダーが続く場合があります。(text/plain 部分は、単独であるか、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 つの場所に保持したいと考えています。

4

1 に答える 1

1

sed控えめに言っても、MIME メッセージの解析に使用するのは困難です。あなたはすでに他の目的で Perl を使用しているようなので、このロジックを単純な Perl スクリプトにも実装します。さまざまな MIME content-transfer-encodings のデコードを追加するのは簡単です。

Perl のEmail::MIME パッケージは良い出発点かもしれません。あなたはすでに問題領域について基本的な理解を持っているようです。多くの初心者は、すべてのメッセージがマルチパートである、またはすべてのメッセージが正確に 1 つtext/plainのパートであると仮定するという間違いを犯します。(何もないかもしれないことを強調するかもしれません! 一部のクライアントapplication/octet-streamは、テキスト コンテンツがない場合にバイナリを送信するだけです。クライアントは、構成のみを行い、それを好む私たちのためにレンダリングをtext/html生成しないように設定されている場合があります。)text/plain

于 2013-06-04T05:48:02.837 に答える