メールの固定ファイル名の添付ファイルを自動的に決まった場所に保存する方法。
材料
- getmail
- procmail
- python
getmail
http://pyropus.ca/software/getmail/
定番は fetchmail なのかな。
インストール
$ cd /opt/src
$ wget http://pyropus.ca/software/getmail/old-versions/getmail-5.6.tar.gz
$ tar xzf getmail-5.6.tar.gz
$ cd getmail-5.6
$ python setup.py build
$ su
# python setup.py install
設定
$ mkdir -m 700 ~/.getmail
$ vi ~/.getmail/getmailrc
[options]
message_log = ~/.getmail/log
# デバッグが終わったらコメント
message_log_verbose = true
read_all = False
# 指定した日数経過後サーバーから削除
#delete_after = 30
# デバッグが終わったらコメントを外す
#verbose = 0
[retriever]
#type = SimplePOP3SSLRetriever
type = SimplePOP3Retriever
server = pop.hoge.co.jp
username = username
#port = 110
password = password
[destination]
#type = Maildir
#path = ~/Maildir/
type = MDA_external
path = /bin/procmail
unixfrom = True
$ chmod 600 ~/.getmail/getmailrc
$ mkdir -p ~/Maildir/{cur,new,tmp}
$ chmod -R 700 ~/Maildir/
procmail
インストール
# yum -y install procmail
# which procmail
/bin/procmail
設定
$ vi ~/.procmailrc
#----- ヘッダ
#PATH=
MAILDIR=$HOME/Maildir
DEFAULT=$HOME/Maildir/
#LOGFILE=/dev/null
LOGFILE=$HOME/procmail.`date +%Y%m%d`.log
#SHELL=/bin/sh
# デバッグが終わったら"OFF"る
VERBOSE=ON
#-- 追加変数
FROMADDRESS=from@hoge\.co\.jp
TOADDRESS=to@hoge\.co\.jp
TARGETSUBJECT=mailtitle
ATTACHFILE=filename
#----- レシピ
:0 HBcw :
* $ ^From:.*$FROMADDRESS
* $ ^To:.*$TOADDRESS
* $ ^Subject:.*$TARGETSUBJECT
* ^Content-Type:.*multipart
* $ filename=\"$ATTACHFILE\"
| $HOME/save_attachment.py $ATTACHFILE
:0
$DEFAULT
$ chmod 600 ~/.procmailrc
python
$ which python
/usr/bin/python
$ python --version
Python 2.7.5
$ vi ~/save_attachment.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import email
# 添付ファイル保存先
filedir = '/tmp/'
def attachmentSave(message, attachfile):
for part in message.walk():
# 添付ファイルありで区切りを書いている部分なので飛ばす
if part.get_content_maintype() == 'multipart':
continue
# ファイル名取得
fname = part.get_filename()
if fname and fname.find(attachfile) != -1:
savefile = open(os.path.join(filedir, fname), 'wb')
savefile.write(part.get_payload(decode=True))
savefile.close()
if __name__ == '__main__':
args = sys.argv
message = email.message_from_string(sys.stdin.read())
attachmentSave(message, args[1])
$ chmod 700 ~/save_attachment.py
実食
$ getmail
うまくいかない場合は procmail.*.log を参照。
ファイルは常に上書きなので用途によりカスタマイズ。
~/Maildir/new/ にメールが残り続けるので別途定期的に削除するシェル等で対応する。