HEARTBEATS

Pythonで日本語メールヘッダをデコードする

   

こんにちは。CTOの馬場です。

今回もインフラエンジニア向けにちょっとした情報を紹介します。

インフラエンジニアをしていると、なんだかんだとメールを解析して処理をしたいシーンって多いですよね。
でも日本語のメールって色々大変ですよね。

特に大変なのがヘッダ部分。
ヘッダ部分はエンコードされていたり、長いと複数行にまたがったり、複数行の場合はデコードして結合してから処理したり・・・

今回はそんなあなた(=私)向けに、日本語メールのメールヘッダをうまく取り扱う方法を紹介します。

そんなわけでサンプルは下記のとおりです。
Pythonの標準ライブラリだけで実現できます。

第一引数にメールファイルのパスを指定すると、 From, To, Subjectを取得して表示します。

例: python mail_header_decoder.py hoge.eml


#!/usr/bin/env python
#coding: utf-8

from email.Header import decode_header
from email.Parser import Parser
from sys          import argv,stdout
import re

NEWLINE=re.compile(r'(\r|\n|\r\n)$')
DEFAULT_ENCODING='iso-2022-jp'

def decode_header_multiline(message=None,name='',encoding=None):
    str_encoded=''
    for str_line in NEWLINE.split(message.get(name)):
        decoded_headers=decode_header(str_line)
        for parts in decoded_headers:
            str_encoded = str_encoded + parts[0]
            if encoding == None and  not parts[1] == None:
                encoding=parts[1]
    encoding=DEFAULT_ENCODING if encoding == None else encoding
    return str_encoded.decode(encoding)

def main():
    msg=Parser().parse(open(argv[1]))
    header_from   =decode_header_multiline(msg,'From')
    header_to     =decode_header_multiline(msg,'To')
    header_subject=decode_header_multiline(msg,'Subject')
    result="From: %s, To: %s, Subject: %s"%(
        header_from,
        header_to,
        header_subject,
        )
    stdout.write(result.encode('utf-8'))
    stdout.write('\n')

if __name__ == '__main__':
    main()

※Python 2.6.1で動作確認しています。
 デコード周りが若干怪しいような気がしないでもないですが、  動作確認する限りはこれでうまく動いています。

株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。



ハートビーツをフォロー

  • Twitter:HEARTBEATS
  • Facebook:HEARTBEATS
  • HATENA:HEARTBEATS
  • RSS:HEARTBEATS

殿堂入り記事