2015-08-30 3 views
0

Я регулярно получаю сгенерированное сообщение электронной почты, содержащее текстовую часть и текстовое вложение. Я хочу, чтобы проверить, если вложение в кодировке base64, а затем декодировать его нравится:Извлечь текст из части тела «содержание-распоряжение: вложение»

:0B 
* ^(Content-Transfer-Encoding: *base64(($)[a-z0-9].*)*($)) 
{ 
msgID=`printf '%s' "$MATCH" | base64 -d` 
} 

Но всегда говорят, неверный ввод, кто знает, что это не так?

procmail: Match on "^()\/[a-z]+[0-9]+[^\+]" 
procmail: Assigning "msgID=PGh0b" 
procmail: matched "^(Content-Disposition: *attachment.*(($)[a-z0-9].*)* |Content-Transfer-Encoding: *base64(($)[a-z0-9].*)*($)" 

procmail: Executing "printf '%s' "$MATCH" | base64 -d" 
base64: invalid input 
procmail: Assigning "msgID=<ht" 
procmail: Unexpected EOL 


procmail: Assigning "msgID=PGh0b" 
procmail: Match on "^(Content-Transfer-Encoding: *base64(($)[a-z0-9].*)*($))" 
procmail: Executing "printf '%s' "$MATCH" | base64 -d" 
base64: invalid input 
procmail: Assigning "msgID=<ht" 
procmail: Unexpected EOL 
+0

Я отредактировал (или более как замененный) ваш вопрос с чем-то, что хотя бы четко определено и действенно. Надеюсь, мне удалось, по крайней мере, объяснить, какую проблему вы пытаетесь решить. – tripleee

ответ

0

Если ваши требования являются сложными, это может быть проще написать специальный скрипт, который извлекает информацию, которую вы хотите - это современный язык сценариев с надлежащей поддержкой MIME будет более гибко, когда дело доходит до все бесчисленное множество возможностей для кодирования содержимого и структуры части тела в современной электронной почте MIME.

Следующее находит первое появление заголовков MIME с Content-Disposition: attachment и извлекает первый токен следующего тела. Этот может делать то, что вы хотите, если вы соответствуете отправителю, который использует четко определенный статический шаблон. Здесь нет реального синтаксического анализа MIME, поэтому (скажем) пересылаемое сообщение, которое содержит встроенную часть, которая соответствует шаблону, также вызывает условия. (Это может быть ошибка или функция.)

Полезной, но не часто используемой функцией Procmail является возможность писать регулярное выражение, которое охватывает несколько строк. В пределах регулярного выражения ($) всегда соответствует буквенной новой строке. Таким образом, мы можем искать заголовок Content-Disposition: attachment, а затем другие заголовки (ноль или более), за которым следует пустая строка, за которой следует токен, который вы хотите извлечь.

:0B 
* ^Content-Disposition: *attachment.*(($)[A-Z].*)*($)($)\/[A-Z]+[0-9]+ 
{ msgid="$MATCH" } 

Для простоты я не пытался справиться с многострочными заголовками MIME. Если вы хотите поддержать это, исправление должно быть достаточно очевидным, хотя и не совсем изящным.

В более общем случае вы можете добавить условие, чтобы проверить, что группа заголовков MIME в состоянии также содержит Content-type: text/plain; вам нужно будет установить две альтернативы для того, чтобы иметь Content-type: до или после Content-disposition: (или как-то нормализовать заголовки MIME до получения этого рецепта, или полагать, что отправитель всегда генерирует их точно в порядке в примере сообщения).

+0

Вы не можете base64 декодировать все сообщение, вам нужно будет захватить часть, которую вы хотите декодировать, и передать ее * на 'base64'. Это выполнимо, но опять же, если ваши потребности MIME нетривиальны, используйте внешний инструмент или специализированный скрипт. – tripleee

+0

В любом случае, это, надеюсь, поможет вам понять, как задать подробный, четко определенный вопрос. Если вы не можете понять, как продолжить оставшуюся проблему, задайте новый вопрос. Между тем, если вы чувствуете, что это отвечает на вопрос, как это было в конечном итоге, вверх и, возможно, согласиться, возможно, будет в порядке. – tripleee

+0

Кодировка base64 добавляет поворот, который легко исправить, но это дополнительное требование, которое не было четко сообщено в исходном вопросе. И обсуждение того, как здесь отличается в комментариях, не очень удобно. Может ли ваш новый вопрос выглядеть примерно так? http://pastebin.com/Qbqfx0Wk – tripleee

 Смежные вопросы

  • Нет связанных вопросов^_^