Personal tools
You are here: Home Lights on Zope Ploneへの入力をメールから行うpython スクリプトの巻
« May 2012 »
Su Mo Tu We Th Fr Sa
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
Recent entries
評価経済社会 ぼくらは世界の変わり目に立ち会っている 岡田 斗司夫 (著) seko 2012-05-13
史上最強の哲学入門 東洋の哲人たち 飲茶 (著) seko 2012-05-12
史上最強の哲学入門 飲茶 (著) seko 2012-05-12
製造業が日本を滅ぼす 野口 悠紀雄 (著) seko 2012-05-10
サニーサイドエッグ 荻原 浩【著】 seko 2012-05-03
強運の持ち主 瀬尾 まいこ【著】 seko 2012-05-03
カラーひよことコーヒー豆 小川 洋子【著】 seko 2012-05-03
「長生き」が地球を滅ぼす―現代人の時間とエネルギー 本川 達雄【著】 seko 2012-05-02
日本全国津々うりゃうりゃ [単行本] 宮田 珠己 (著) seko 2012-05-02
遺伝子はダメなあなたを愛してる [単行本] 福岡伸一 (著) seko 2012-05-02
哲学的な何か、あと数学とか 飲茶【著】 seko 2012-05-01
哲学的な何か、あと科学とか 飲茶【著】 seko 2012-05-01
宇宙に外側はあるか 松原 隆彦【著】 seko 2012-05-01
世渡り 万(よろづ)の智慧袋―江戸のビジネス書が教える仕事の基本 田中 優子【著】 seko 2012-04-29
Recent comments
Re:フェルデンクライスメソッド112回目 おててニギニギ3 seko 2012-04-07
Re:フェルデンクライスメソッド112回目 おててニギニギ3 Papasan 2012-04-07
Re:ブッダのいる女子会 Reiko 2012-03-25
おしらせと追加 やぶい 2012-03-23
Re:上島珈琲閉店 えくぼの姉さんにもう会えない Papasan 2012-03-22
Re:上島珈琲閉店 えくぼの姉さんにもう会えない seko 2012-03-22
Re:上島珈琲閉店 えくぼの姉さんにもう会えない Papasan 2012-03-21
Re:上島珈琲閉店 えくぼの姉さんにもう会えない seko 2012-03-21
Re:上島珈琲閉店 えくぼの姉さんにもう会えない Papasan 2012-03-20
Re:荒俣 宏 (著) 「歌枕」謎ときの旅 通りすがり 2012-02-11
Re:http://papasan.mydns.jp/ の飛び先がマシンによって異なる seko 2012-02-11
Re:http://papasan.mydns.jp/ の飛び先がマシンによって異なる Papasan 2012-02-10
Re:フェルデンクライスメソッド 107回目 アスリートの脚になる seko 2012-01-29
Re:フェルデンクライスメソッド 107回目 アスリートの脚になる Reiko 2012-01-29
Recent trackbacks
ぼくはお金を使わずに生きることにした 紹介 感想 わかめになりたい 2011-12-02
au の HTC EVO がなかなか良かった話 tdtshのブログ 2011-05-25
逆転経済の反響 世界一のバイヤーになってみろ!!坂口孝則の本棚と雑文 2010-12-27
Who Moved My Cheese? 大学生の気ままな書評 おすすめ和書・洋書! 2010-10-30
sekoさんちからPOSTがあったけど・・・ PapaBlog 2010-09-12
Squid(キャッシュサーバーモード)を試してみる PapaBlog 2010-08-25
Apache 2.2のキャッシュ機能を使ってみる PapaBlog 2010-08-08
愛と資本主義 中村うさぎ ばみの乱読日記 と猫雑貨。 2010-08-07
自転車用鞄(かばん)通販 鞄専門【かばん通販】 2010-06-09
Flowplayerがバージョンアップしてスッキリしていた PapaBlog 2010-06-06
荻原規子 「レッドデータガール はじめてのお化粧」 ゼロから 2010-06-01
加納朋子「モノレールねこ」 ご本といえばblog 2010-04-29
武蔵境でWiMAX電波を追ってみる においの事件簿 2010-04-19
荻原規子 「レッドデータガール はじめてのお使い」 ゼロから 2010-04-18
 
Document Actions

Ploneへの入力をメールから行うpython スクリプトの巻

by seko posted at 2011-11-18 21:20 last modified 2011-11-19 18:42

インターネットで情報を見つけたとき、Ploneサイトにアクセスして、コピペするのは面倒ですね。

そこで、メールで届いた内容をpop3でアクセスして取り出し、テキストファイルを生成し、FTPでPloneにアップロードするpythonスクリプトを書いてみました。メールの添付ファイルはとりあえず、スクリプトと同じ場所に保存するだけで、アップロードはしていません。

これを使えば、気になる情報をメールで送るだけで、Ploneの記事になります。

予めPloneのFTPを使えるようにしておく必要があります。やり方は、Papasanのサイト を見てください。

Windows上のpython2.6で作り、CentOS5で動作を確認したらpythonのバージョンが2.4のせいで、動きませんでした。 Unified InstallerでPloneをインストールした際にpython2.6が入ったので、それを使えばOKでした。

課題としては、アップロードされた文書はそのままでは非公開になっているので、一般の人に見せるには一つ一つ手で公開にする必要があることです。最初から公開にする方法を知りたいです。

参考にさせていただいたところ:

 # -*- coding: utf-8 -*-
 import os
 import poplib
 import datetime
 import email
 from email.Header import Header,make_header,decode_header
 import ftplib
 import time

 def mailread(src,mypath):
     """
     生メールから件名、本文、添付ファイルを取り出す
     """
     # Messageオブジェクトを作る
     msg = email.message_from_string(src)
     # ヘッダをデコード
     subject = decode_header(msg["Subject"])
     # ヘッダーを表示
     try:
         print "-" * 70
         #print msg["Date"]
         st = datetime.datetime.strptime(msg["Date"][:-6], "%a, %d %b %Y %H:%M:%S")
         delivered_date = st.strftime("%Y/%m/%d %H:%M:%S") + " GMT+9"
         my_id = st.strftime("%Y%m%d-%H%M%S")
         #print unicode(make_header(subject))
     except: pass;
     print "-" * 70
     #全パートをスキャン
     for part in msg.walk():
         type =part.get_content_maintype()
         #print type
         if type and type.find("image") != -1:
             #画像が見つかったら、ファイルに保存
             filename = part.get_filename("notitle.img")
             f = open (os.path.join(mypath,filename),"wb")
             f.write(part.get_payload(decode=True))
             f.close()
         if type and type.find("application") != -1:
             #EXCELやWordがあったらファイルに保存
             filename = part.get_filename("notitle.img")
             f = open (os.path.join(mypath,filename),"wb")
             f.write(part.get_payload(decode=True))
             f.close()       
         if type and type.find("text") !=-1:
             #テキストは表示
             enc = part.get_charsets()[0] or "us-ascii"
             body = part.get_payload().decode(enc,"ignore")
     return my_id ,delivered_date, unicode(make_header(subject)), body, msg

 def upload_ftp(server,port,username,password,directory,upfilename):
     ftp = ftplib.FTP()
     ftp.connect(server,port)
     print " connect ok"
     ftp.login(username, password)
     print "login ok"
     ftp.cwd(directory)
     print "CD ok"
     # upload file
     print upfilename
     upfile = open(upfilename, "rb")
     ftp.storbinary("STOR %s" % upfilename, upfile)
     upfile.close()
     ftp.quit()

 def set_headers():
     headers ="""id:
 title:
 description:
 subject:
 relatedItems:
 location:
 language: ja
 effectiveDate:
 expirationDate: None
 creation_date:
 modification_date:
 creators: admin
 contributors:
 rights:
 allowDiscussion: False
 excludeFromNav: False
 presentation: False
 tableContents: False
 Content-Type: text/html
 """
     return headers
 ####################### Main ##############################
 # interval設定 sec
 interval = 1 * 60
 # FTPサーバ設定
 ftp_server = "servername"
 ftp_port = 8021
 ftp_user = "admin"
 ftp_password = "xxxxx"
 ftp_directory = "/Plone/frommail"
 # メール基本設定
 mail_server    = "servername"
 pop3_port      = 110
 user_id   = "user"
 user_pass = "password"

 # pathの取得
 mypath = os.getcwd()

 while 1:
     # メールサーバに接続
     pop3 = poplib.POP3(mail_server,pop3_port)
     pop3.user(user_id)
     pop3.pass_(user_pass)
     # メール一覧の取得
     mail_list = pop3.list()
     print mail_list
     # メールのリストは[1]にある
     for mail_id in mail_list[1]:
         (no,msg_size) = mail_id.split(" ")
         # 番号指定で取り出し
         mail_data = pop3.retr(no)
         my_id, delivered_date, title, body ,msg = mailread("\n".join(mail_data[1]),mypath)
         print my_id,delivered_date, title
         # ヘッダを行に分ける
         lst = set_headers().split("\n")
         # 作成日、更新日、発効日をメールの受信日に設定
         n = 0
         for line in lst:
             if line in ("effectiveDate: ","creation_date: ","modification_date: "):
                 lst[n] = lst[n] + delivered_date
             n = n + 1
         lst[0] = lst[0] + my_id
         lst[1] = lst[1] + title
         lst[21] = lst[21] + body
         # テキストファイルにまとめて、書き出す
         txt = ""
         for line in lst:
             txt = txt + line + '\n'
         file_name = os.path.join(mypath,my_id+'.txt')
         o = open(file_name,'w')
      # utf8なので先頭にBOMが必要
         o.write('\xef\xbb\xbf')
         o.write(txt.encode('utf8','ignore'))
         o.close()
         # FTPでアップロードする
         upload_ftp(ftp_server,ftp_port,ftp_user,ftp_password,ftp_directory,my_id+'.txt')

     # メールを削除
     for mail_id in mail_list[1]:
         (no,msg_size) = mail_id.split(" ")
         pop3.dele(no)
     # pop3 切断
     pop3.quit()
     # ある時間待つ
     time.sleep(interval)
Category(s)
python
zope
The URL to Trackback this entry is:
http://lightson.dip.jp/blog/seko/2682/tbping

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by Papasan at 2011-11-20 10:22
>課題としては、アップロードされた文書はそのままでは非公開になっているので・・・

Ploneのドキュメントオブジェクトを生成しているのですか?、それともZopeのファイルオブジェクト?

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by seko at 2011-11-20 11:21
良くは分かりませんが、Ploneでフォルダを作って、そこにFTPでファイルをアップロードすると、記事ができました。
ただし、タイトルはファイル名になってしまいます。

Plone側で作った文書をFTPで取り出してみると、本文の前に20行くらいのヘッダーがついており、タイトル名や発行日、有効日、変更日などがありました。
このプログラムでは、ヘッダー部分を追加したテキストファイルを作り、アップロードしています。

Plone以下のフォルダーにアップロードしているので、Ploneのドキュメントオブジェクトではないかと思います。

デフォルトで公開できるでしょうか?

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by Papasan at 2011-11-20 12:24
>デフォルトで公開できるでしょうか?

Ploneは細かな操作も考慮されていますので、できるような気がします。
ところで、Ploneのバージョンはいくつなのでしょう?

Plone4.05でPlone側からテキストファイルを、素のままアップロードしてみましたら自動的に公開になってしまいました。

>Plone側で作った文書をFTPで取り出してみると、本文の前に20行くらいのヘッダーがついており、タイトル名や発行日、有効日、変更日などがありました。
Plone側で作った文書じゃなくって、Plone側でアップロードしたファイルをFTPで取り出してみて、そのヘッダに合わせてみてはどうでしょうか?

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by seko at 2011-11-20 12:46
バージョンは4.05です。

>Plone側でアップロードしたファイルをFTPで取り出してみて、そのヘッダに合わせてみてはどうでしょうか?
それはいいアイデアです。
今、スープストック東京にいるので、部屋に帰ったらやってみます。

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by Papasan at 2011-11-20 15:05
ソープストック東京ですね、了解。

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by seko at 2011-11-20 15:18
そんなとこ 行ってません!!
もしやと思ってグーグルで検索してみましたが、ありません。
そんな名前をつけたら、訴えられますね。

今は、ドトールコーヒーです。
おばさんが多いです。

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by Papasan at 2011-11-20 15:39
今日、九州は朝から快晴です。
散歩がてら近所のスーパーに犬用のハムを買いにいきました、おばさんしかいません。
渋谷まで行かないといけないのでしょうか?

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by seko at 2011-11-20 17:16
Ploneのメニューを使い、テキストファイルをアップロードしてみました。
Papasanのおっしゃるように公開されました。
しかし、アップロードされたファイルは、ファイルとして認識されており、ページにはなっていません。

これに対し、FTPからPloneのフォルダーにテキストファイルをアップロードすると、添付ファイルではなくページができます。
そしてそのページは非公開になっています。

外はまた雨になってきました。さてさて、これからどうしましょう?

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by Papasan at 2011-11-20 18:29
>しかし、アップロードされたファイルは、ファイルとして認識されており、ページにはなっていません。
「ファイルでも公開できればいいのかな」と思っていましたが、「ページ」でないといけないのね。

>これに対し、FTPからPloneのフォルダーにテキストファイルをアップロードすると、添付ファイルではなくページができます。
そしてそのページは非公開になっています。
これは、面白いですね。こちらでも試してみます。Ploneのどんなメソッドが動いているのでしょうね?

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by Papasan at 2011-11-20 19:10
Plone4.05で確認しました。
FTPでテキストファイルをアップロードすると、「ページ」が生成されました。
コンテンツの状態は「非表示」です。

ワークフロー周辺か、ポータルファクトリーでドキュメントオブジェクト(ページ)を生成するメソッド付近をゴニョゴニョしないといけないのでしょうね?

がんばってね!!

Re:Ploneへの入力をメールから行うpython スクリプトの巻

Posted by seko at 2011-11-20 21:05
問題解決シート使って頑張るんば。
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)


Powered by Plone, the Open Source Content Management System

This site conforms to the following standards: