Python Gmailに届いたメールの内容をmantisに自動で転記する

Python SOAP通信でmantisに案件を追加する(suds使用)
PythonでGmailに送信されたメールの内容と添付ファイルを取得する
この2つを組み合わせれば、Gmailに届いたメールの内容をmantisに自動で転記できるはず。




仕様



IMAP4でGmailに接続し、メールの内容と添付ファイルを取得。
取得した内容をSOAP通信でmantisに登録します。
同時に、メールに添付されていたファイルもmantisに登録することにします。

メールの件名が、mantisの要約に。
本文がmantisの詳細にそれぞれ登録されます。

また、重複登録を避けるためmantisへの登録を行ったメールは
削除することにしました。




ソース



こんなかんじです。


  1. # -*- coding:utf-8 -*-
  2. import imaplib,email,email.Header,mimetypes
  3. import time
  4. import cStringIO
  5. import base64
  6. from suds.client import Client
  7. ### ============= メールの取得と解析部分 ============= ###
  8. class imap4mail(object):
  9.     
  10.     def __init__(self, data):
  11.         """
  12.         コンストラクタで与えられたメールデータの解析を実行する
  13.         """
  14.         self.files = {}
  15.         
  16.         #メッセージをパース
  17.         msg = email.message_from_string(data)
  18.         #タイトル取得
  19.         self.title = self.decode(msg.get('Subject'))
  20.         #送信者取得
  21.         self.sender = self.decode(msg.get('From'))
  22.         #送信日付取得
  23.         self.date = self.get_format_date(msg.get('Date'))
  24.         
  25.         #添付ファイルを抽出
  26.         for part in msg.walk():
  27.             if part.get_content_maintype() == 'multipart':
  28.                 continue
  29.                 
  30.             #ファイル名を取得
  31.             filename = part.get_filename()
  32.             
  33.             #ファイル名が取得できなければ本文
  34.             if not filename:
  35.                 self.body = self.decode_body(part)
  36.                 
  37.             #ファイル名が存在すれば添付ファイル
  38.             else:
  39.                 tmpfile = cStringIO.StringIO()
  40.                 tmpfile.write(part.get_payload(decode=1))
  41.                 
  42.                 self.files[filename] = tmpfile
  43.     def decode(self, dec_target):
  44.         """
  45.         メールタイトル、送信者のデコード
  46.         """
  47.         decodefrag = email.Header.decode_header(dec_target)
  48.         title = ''
  49.         
  50.         for frag, enc in decodefrag:
  51.             if enc:
  52.                 title += unicode(frag, enc)
  53.             else:
  54.                 title += unicode(frag)
  55.         
  56.         return title
  57.         
  58.     
  59.     def decode_body(self, part):
  60.         """
  61.         メール本文のデコード
  62.         """
  63.         body = ''
  64.         charset = str(part.get_content_charset())
  65.         
  66.         if charset:
  67.             body = unicode(part.get_payload(), charset)
  68.             
  69.         else:
  70.             body = part.get_payload()
  71.             
  72.         return body
  73.     def get_format_date(self, date_string):
  74.         """
  75.         メールの日付をtimeに変換
  76.         http://www.faqs.org/rfcs/rfc2822.html
  77.         "Jan" / "Feb" / "Mar" / "Apr" /"May" / "Jun" / "Jul" / "Aug" /"Sep" / "Oct" / "Nov" / "Dec"
  78.         Wed, 12 Dec 2007 19:18:10 +0900
  79.         """
  80.         
  81.         format_pattern = '%a, %d %b %Y %H:%M:%S'
  82.         
  83.         #3 Jan 2012 17:58:09という形式でくるパターンもあるので、
  84.         #先頭が数値だったらパターンを変更
  85.         if date_string[0].isdigit():
  86.             format_pattern = '%d %b %Y %H:%M:%S'
  87.         
  88.         return time.strptime(date_string[0:-6], format_pattern)
  89. ### ============= SOAP通信でmantisに案件登録を行う部分 ============= ###
  90. def mantis_update(mail):
  91.     
  92.     mantis_user = 'administrator'
  93.     mantis_password = 'mantis_pasword'
  94.     url = 'http://localhost/mantis/api/soap/mantisconnect.php?wsdl'
  95.     client = Client(url)
  96.     issue = client.factory.create('IssueData')
  97.     issue.project.id = 1
  98.     issue.category = u'登録カテゴリー'
  99.     issue.summary = mail.title
  100.     issue.description = mail.body
  101.     try:
  102.         
  103.         #案件の登録実行
  104.         result = client.service.mc_issue_add(
  105.             username=mantis_user,
  106.             password=mantis_password,
  107.             issue=issue)
  108.         
  109.         #添付ファイルの登録
  110.         for name, value in mail.files.items():
  111.             #添付ファイルのデータをbase64変換
  112.             image_bin_data = base64.encodestring( value.getvalue() )
  113.             #mimetype取得
  114.             mimetype,encoding = mimetypes.guess_type(name)
  115.             
  116.             #添付ファイルの登録を実行。
  117.             #issue_idに、result(直前で登録した案件のID)を指定する
  118.             attach_result = client.service.mc_issue_attachment_add(
  119.                 username=mantis_user,
  120.                 password=mantis_password,
  121.                 issue_id=result,
  122.                 name=name,
  123.                 file_type=mimetype,
  124.                 content=image_bin_data)
  125.         
  126.     except Exception as e:
  127.         print e.message
  128. if __name__ == "__main__":
  129.     
  130.     host = 'imap.gmail.com'
  131.     user = 'example@gmail.com'
  132.     password = 'gmail_password'
  133.     mailbox = 'INBOX'
  134.     
  135.     #メールサーバ指定
  136.     M = imaplib.IMAP4_SSL(host=host)
  137.     #ログイン
  138.     M.login(user, password)
  139.     
  140.     #メールボックス選択
  141.     M.select(mailbox)
  142.     
  143.     typ, data = M.search(None, 'ALL')
  144.     for num in data[0].split():
  145.         typ, data = M.fetch(num, '(RFC822)')
  146.         mail = imap4mail(data[0][1])
  147.         mantis_update(mail)
  148.         
  149.         #解析したメールは削除
  150.         M.store(num, '+FLAGS', '\\Deleted')
  151.         
  152.     M.expunge()
  153.     M.close()
  154.     M.logout()



※注意
実行したら、Gmailのメールが消えます。


お試し実行の時は、

#解析したメールは削除
M.store(num, '+FLAGS', '\\Deleted')


この部分をコメントしておくと、メールが削除されなくなります。



事前にGmailへこんなメールを送っておきました。
37_001.png


ちなみに、添付ファイルのサンプルはこちらからお借りしました。
http://hakurizai.blog100.fc2.com/blog-entry-29.html



実行してみると、見事mantisに転記されてました。
37_002.png



このスクリプトをcronで定期的に実行するようにすれば、自動的にmantisへ転記できそうです。
あんまり更新頻度が高いと、Gmailのアカウントをロックされるようなので、
実行間隔は考える必要がありそうですが・・・




【参考URL】

20.10. imaplib ― IMAP4 プロトコルクライアント
http://www.python.jp/doc/release/library/imaplib.html

18.7. mimetypes ― ファイル名を MIME 型へマップする
http://www.python.jp/doc/release/library/mimetypes.html

SUDS
https://fedorahosted.org/suds/


関連記事

コメント

非公開コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ