2013-06-03 5 views
0

Я также использую Bugzilla для обработки публично зарегистрированных ошибок. Но я не хочу создавать учетную запись для тех, кто может отправить отчет об ошибке. Это легко сделать, изменив заголовок From SMTP. Но, конечно, я хотел бы, чтобы электронное письмо отправителя было видимым где-то в пределах ошибки.Многострочная обработка по SED для изменения входящего отправителя электронной почты и сохранения их электронной почты в комментариях bugzilla

Я борюсь с тем, как сделать sed, чтобы положить линию в качестве первой строки части текста/текста электронной почты. вопрос сводится к тому, как поставить конкретную строку после первой пустой строки после блока строк, где находится линия совместимой с REGEXP /\(Content-Type: text\/plain.*\)/

В настоящее время я в состоянии поставить его после Content-Type: text/plain линии, которая всегда присутствует. Проблема в том, что иногда это не последняя строка заголовка SMTP. Content-Transfer-Encoding: quoted-printable или другой заголовок может следовать. (достаточно позаботиться о части текста/простой части, которая либо сама по себе, либо входит в пару с частью текста/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: [email protected]/; p' | sed '/^From:\(.*@.*\)/{h; s//FromNew: [email protected]/;b};/FromNew: [email protected]/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: [email protected]/; p' | sed '/^From:\(.*@.*\)/{h; s//FromNew: [email protected]/;b};/FromNew: [email protected]/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: [email protected]/' | sed '/^From:\(.*@.*\)/{h; s//FromNew: [email protected]/;b};/FromNew: [email protected]/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: [email protected]/' | sed '/^From:\(.*@.*\)/{h; s//FromNew: [email protected]/;b};/FromNew: [email protected]/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, от устанавливается как [email protected] (который существующий пользователь Bugzilla), а оригинал От электронной почты перемещается в первую строку тела электронной почты.

Проблема возникает, когда заголовок 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

Использование sed для анализа сообщений MIME будет сложным, мягко говоря. Поскольку вы, по-видимому, уже используете Perl для других вещей, я бы реализовал эту логику в простом скрипте Perl. Добавление декодирования для различных MIME-передач-кодировок контента является тривиальным дополнением.

Perl's Email::MIME package может быть хорошей отправной точкой. Вы уже, похоже, имеете базовое понимание проблемной области; многие новички допустили бы ошибку, считая, что все сообщения являются множественными, или что все сообщения имеют ровно одну часть text/plain. (Возможно, все еще подчеркивают, что их может не быть. Некоторые клиенты просто отправляют двоичный файл application/octet-stream, если текстового контента нет, или клиент может быть настроен только для составления text/html и не генерировать рендеринг text/plain для тех из нас, кто предпочитает это.)