こんにちは。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で動作確認しています。
デコード周りが若干怪しいような気がしないでもないですが、
動作確認する限りはこれでうまく動いています。