2016-09-12 1 views
1

У меня есть сценарий оболочки, который загружает файлы из почтовой папки серверов на устройства NAS, поэтому клиент имеет копии, сделанные локально с резервной копией.Извлечь тему электронной почты из файла через bash

Файлы сохраняются как 11469448248.H15587P19346.smtp.x14.eu_2, S Файлы. Я изменил расширение на стандартный формат .eml, чтобы почтовые клиенты могли читать их с диска.

for f in *.smtp.x14.eu_2,S; do 
#sed "9q;d" $f 
#tail -n+9 $f | head -n1 
mv -- "$f" "${f%.smtp.x14.eu_2,S}.eml"; 
done 

Как вы можете видеть, я пытался использовать СЕПГ и хвост команду, чтобы получить 9-ю строку из файла; проблема заключается в том, что субъект не всегда находится на 9-й строке, а имена файлов не говорят о его содержании.

Я пытаюсь получить имена файлов в понятном формате, поэтому я решил, что этот вопрос может оказаться полезным.

На п-й строки файла электронной почты является строкой, которая начинается с Темой: PD: субъект

Im пытаясь найти эту строку Фет избавиться от Темы: PD:, а остальное, как имя файла ne

+1

Пожалуйста, быть более точным. Что именно вы хотите сделать? Если вещь, которую вы ищете, не всегда находится в 9-й строчке, вам нужно найти какой-то узор. –

+1

Возможно, вы можете включить ссылку на определение формата или дать нам хороший пример. – Beta

+0

Я редактировал вопрос, чтобы включить имя файла результата, которого я хочу достичь – adam

ответ

2

следующее: неправильный, но реализует то, что вы, кажется, спрашиваете.

subj=$(sed -n '/^Subject: PD *//!d;p;q;/^$/q' "$f") 

Проблема с этим состоит в том, что она преуспевает в тривиальном случае, но терпит неудачу, если у вас есть MIME RFC2047 кодировка Subject: заголовка, и (более тривиальный), когда заголовок Subject: охватывает более одной строки.

Я бы приблизился к этому с немного более современным языком программирования. Это не совсем один лайнер, но с Python это достаточно просто.

subj=$(./emailsubj.py "$f") 

где emailsubj.py содержит что-то более или менее как

#!/usr/bin/env python 
from email.parser import Parser 
from email.header import Header, decode_header 
from sys import argv 

for filename in argv[1:]: 
    with open(filename, 'rb') as handle: # handle file not found etc? 
     message = Parser().parse(handle) 
    try: 
     subj = ''.join([frag.decode(enc) if enc else frag 
      for frag, enc in decode_header(message['subject'])]) 
    except HeaderParseError, UnicodeDecodeError: 
     subj = message['subject'] # maybe warn about error? 
    print(subj) 

(Не забудьте chmod +x emailsubj.py, очевидно.)

+0

'formail' из пакета Procmail обрабатывает завернутые заголовки, но ничего не делает о кодировании RFC2047. – tripleee

+0

OK. Спасибо за это. Я сделаю это с помощью python (это будет мой первый скрипт py;) – adam

+0

Я должен обновить его до Python 3, но еще не совсем там. Чтение электронной почты в виде байтов, а затем декодирование в текст, где определена кодировка, является довольно странным в Python. Возможно, самым простым решением было бы подделать его с помощью 'encoding = 'latin-1'', а затем перейти к US-ASCII, где это уместно.Но в то же время этот фрагмент Python 2 должен отлично работать для вас. – tripleee