2016-09-12 14 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行目を取得するために sedコマンドを使用しようとした見ることができるように。問題は、被験者が常に9行目にあるとは限らず、ファイル名がその内容の多くを示さないということです。

ファイル名をわかりやすい形式で取得しようとしていますので、その件名が役立つと思いました。メールファイルのn番目の行で

件名で始まる行です:PD:PD:として残りの部分を残し対象

Imが件名を取り除くこのラインFETを見つけようneファイル名

+1

をより正確にしてください。正確に何をしたいですか?あなたが探しているものが常に9行目ではない場合は、パターンを見つける必要があります。 –

+1

おそらく、フォーマットの定義へのリンクを含めるか、その良い例を与えることができます。 – Beta

+0

私は達成したい結果ファイル名を含めるように質問を編集しました – adam

答えて

2

は、と間違っていますが、あなたが求めているようなものを実装しています。

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

これに伴う問題はSubject:ヘッダ1行以上にまたがる場合、それは些細な場合に成功していますが、MIME RFC2047エンコードSubject:ヘッダを有する場合失敗し、(より自明に)ことです。

少し近代的なプログラミング言語でこれにアプローチします。 1つのライナーではありませんが、Pythonでは簡単です。 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) 

のようなものが含まれてい

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

は(当然、chmod +x emailsubj.pyに覚えておいてください。)

+0

Procmailスイートの 'formail'はラップされたヘッダを処理しますが、RFC2047エンコーディングについては何もしません。 – tripleee

+0

OK。ありがとう。私はこれをPythonでやっています(これは私の最初のpyスクリプトです;) – adam

+0

私はPython 3にアップグレードする必要がありますが、それはまだありません。電子メールをバイトとして読んだり、エンコードが定義されているテキストにデコードしたりするのは、Pythonではうんざりです。おそらく、最も簡単な解決策は、 'encoding = 'latin-1' 'でそれを偽造し、それから関連するUS-ASCIIに落とすことでしょう。しかし、その間、このPython 2スニペットはうまくいくはずです。 – tripleee

関連する問題