Ploneへの入力をメールから行うpython スクリプトの巻
インターネットで情報を見つけたとき、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)
- The URL to Trackback this entry is:
- http://lightson.dip.jp/blog/seko/2682/tbping
Ploneのドキュメントオブジェクトを生成しているのですか?、それともZopeのファイルオブジェクト?
ただし、タイトルはファイル名になってしまいます。
Plone側で作った文書をFTPで取り出してみると、本文の前に20行くらいのヘッダーがついており、タイトル名や発行日、有効日、変更日などがありました。
このプログラムでは、ヘッダー部分を追加したテキストファイルを作り、アップロードしています。
Plone以下のフォルダーにアップロードしているので、Ploneのドキュメントオブジェクトではないかと思います。
デフォルトで公開できるでしょうか?
Ploneは細かな操作も考慮されていますので、できるような気がします。
ところで、Ploneのバージョンはいくつなのでしょう?
Plone4.05でPlone側からテキストファイルを、素のままアップロードしてみましたら自動的に公開になってしまいました。
>Plone側で作った文書をFTPで取り出してみると、本文の前に20行くらいのヘッダーがついており、タイトル名や発行日、有効日、変更日などがありました。
Plone側で作った文書じゃなくって、Plone側でアップロードしたファイルをFTPで取り出してみて、そのヘッダに合わせてみてはどうでしょうか?
>Plone側でアップロードしたファイルをFTPで取り出してみて、そのヘッダに合わせてみてはどうでしょうか?
それはいいアイデアです。
今、スープストック東京にいるので、部屋に帰ったらやってみます。
もしやと思ってグーグルで検索してみましたが、ありません。
そんな名前をつけたら、訴えられますね。
今は、ドトールコーヒーです。
おばさんが多いです。
散歩がてら近所のスーパーに犬用のハムを買いにいきました、おばさんしかいません。
渋谷まで行かないといけないのでしょうか?
Papasanのおっしゃるように公開されました。
しかし、アップロードされたファイルは、ファイルとして認識されており、ページにはなっていません。
これに対し、FTPからPloneのフォルダーにテキストファイルをアップロードすると、添付ファイルではなくページができます。
そしてそのページは非公開になっています。
外はまた雨になってきました。さてさて、これからどうしましょう?
「ファイルでも公開できればいいのかな」と思っていましたが、「ページ」でないといけないのね。
>これに対し、FTPからPloneのフォルダーにテキストファイルをアップロードすると、添付ファイルではなくページができます。
そしてそのページは非公開になっています。
これは、面白いですね。こちらでも試してみます。Ploneのどんなメソッドが動いているのでしょうね?
FTPでテキストファイルをアップロードすると、「ページ」が生成されました。
コンテンツの状態は「非表示」です。
ワークフロー周辺か、ポータルファクトリーでドキュメントオブジェクト(ページ)を生成するメソッド付近をゴニョゴニョしないといけないのでしょうね?
がんばってね!!