2008年03月23日

pythonプログラミング(メール編)

 何か新しいプログラミング言語を覚えようと思い立ちまして、pythonに手を出してみました。ひとまず柴田淳さんの「みんなのPython」を購入しました。
 まずは、挫折しないように小さなプログラムから作ることにして、普段迷惑メールを手作業で削除しているので、それを少し自動化してみることにしました。

 使用しているアカウントのうち1つは、特定のメーリングリストを読むためにしか使用していないので、メールの件名がメーリングリストのものでなければ迷惑メールだと判断できます。実際は他のダイレクトメールも来ていますが、手作業の時もそういうメールもまとめて削除しているので今回もそうします。

 メールの処理にはPOP3を使用するので、まずpoplibモジュールをimportしておかないといけません。


import poplib


 popサーバのメールを処理するために、まずサーバへの接続と認証処理を行ないます。

popserver = poplib.POP3( "サーバ名" )

popserver.user( "ID" )
popserver.pass_( "パスワード" )

 今回はメールの内容は見ずに件名で削除すべきかどうかを判断できるので以下の手順で処理を行ないます。
(1)メールのリストを取得する。
(2)リストの長さの分だけメールの件名を確認しながら削除するかどうか判断する。
(3)件名が削除して良いもの(メーリングリストのメールではない)なら削除する。

list = popserver.list()
messages = len( list[ 1 ] )
for i in range( messages ):
  retr = popserver.retr( i+1 )[ 1 ]
  message = email.message_from_string( "\n".join( retr ) )
  try:
    subject = unicode( email.Header.make_header( email.Header.decode_header( message[ "Subject" ] ) ) ).encode( 'shift_jis' )
    if subject.find( "削除しないメールの件名に含まれる文字列" ) == -1:
      deletemail( i+1 )
  except:
    deletemail( i+1 )

 途中にあるtry:とexcept:は例外を処理するためのものです。
 件名の文字コードが変だった場合にunicodeが例外を発生していたので、とりあえずその場合も削除することにしました。

 メールのヘッダを処理するのでemailモジュールをimportしました。
import email



 関数を1つ作りました。
 指定されたメールを削除するものです。
def deletemail( index ):
  print popserver.dele( index )


 この関数、1行しかないのであまり作った意味がないかもしれませんね。

 最後にサーバとの接続を切断します。

popserver.quit()


 ひとまずこれで完成、と思ったのですが、Windowsの関連付けで起動したら必要なメールまで削除されてしまいました。コマンドラインから直接pythonを実行すると上手く動くのですが…。文字コードの処理のあたりで良くない事が起きているようで、もう一工夫必要なようです。

 今回のプログラムを作成するにあたり、Python-ml-jpの「pythonでメール」スレッドを参考にさせていただきました。


今回作ったプログラム

#!/usr/bin/python

import poplib
import email

def deletemail( index ):
  print popserver.dele( index )

popserver = poplib.POP3( "サーバ名" )
popserver.user( "ID" )
popserver.pass_( "パスワード" )
list = popserver.list()
messages = len( list[ 1 ] )
for i in range( messages ):
  retr = popserver.retr( i+1 )[ 1 ]
  message = email.message_from_string( "\n".join( retr ) )
  try:
    subject = unicode( email.Header.make_header( email.Header.decode_header( message[ "Subject" ] ) ) ).encode( 'shift_jis' )
    if subject.find( "削除しないメールの件名に含まれる文字列" ) == -1:
      deletemail( i+1 )
  except:
    deletemail( i+1 )
popserver.quit()

posted by 櫻井良堅 at 17:45| 東京 晴れ| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/90605893

この記事へのトラックバック