Personal tools

moblog.py

Click here to get the file

Size 3.2 kB - File type text/python-source

File contents

#!/usr/bin/env python

import mimetypes
import email
import email.Header
import urllib
import time


def get_parts(msgbody):
    """
    Find out body,attached image, and return them.
    msgbody : mime message of email
    """
    
    msg = email.message_from_string(msgbody)
    
    subj_l = email.Header.decode_header(msg.get('subject'))[0]
    enc = 'us-ascii'
    if subj_l[1]:
        enc = subj_l[1]
    subj = unicode(subj_l[0],enc).encode('utf-8')

    body = ""
    images = []
    for part in msg.walk():
        if part.get_content_maintype() == 'multipart':
            continue
        tp = part.get_type()
        if not body and tp.find('text') != -1:
            # body like part was found !!
            body = part
            continue
        if tp.find('image') != -1:
            # Image found!
            images.append(part)
    return body,subj,images

def add_moblog_entry(msgbody,blogbase,passwd):
    """
    Add entry from mail
    
    msgbody  : This argument will be mime message of one email.
    blogbase : This argument will be url for blog.
               Authentication informations(user/pass) must be included.
    """

    body,subj,images = get_parts(msgbody)

    if not body:
        # no body was found
        return

    # Add images
    fns = []
    for img in images:
        filename = img.get_filename()
        if not filename:
            ext = None
            try:
                ext = mimetypes.guess_extension(img.get_type())
            except:
                pass
            if not ext:
                # Use a generic bag-of-bits extension
                ext = '.bin'
            filename = 'image-%d%s' % (time.time(),ext)
        # Invoke factory to add image
        dt = urllib.urlencode({'id':filename,'type_name':'Image'})
        urllib.urlopen(blogbase+'images/invokeFactory',dt)
        # Send raw content
        dt = urllib.urlencode({'title':filename,'content_type':img.get_type(),
                               'filedata':str(img.get_payload(decode=1)) })
        urllib.urlopen(blogbase+'images/'+filename + '/manage_edit',dt)
        fns.append(filename)
    body_str = body.get_payload(decode=1)
    if body_str.find(passwd) != 0:
        return
    else:
        body_str = body_str.replace(passwd,'')
        while body_str[0] == '\n':
            body_str = body_str[1:]
    body_str = body_str.split('---')[0]
    body_str = unicode(body_str,'iso-2022-jp').encode('utf-8')

    # Add entry
    id = time.strftime('moblog%Y-%m-%d-%H-%M',time.localtime())
    dt = urllib.urlencode({'entry_id':id,'title':subj,
                           'body':body_str,
                           'image_path':'images/' + filename})
    urllib.urlopen(blogbase+'add_moblog_entry',dt)

def main():

    #
    # Please set some information,(host of mail server,etc) to use
    #

    import poplib
    s = poplib.POP3('host.of.mail.server')
    s.apop('yourmailaccount','mailpassword')
    l = s.list()
    if len(l) and l[1]:
        m = s.retr(1)

        msgbody = '\n'.join(m[1])
        add_moblog_entry(msgbody,
         'http://[user]:[pass]@url.of.blog/path2/blog/','password4mail')

        s.dele(1)

    s.quit()

    return

if __name__ == '__main__':
    main()
Pythonな求人
r = urlopen("http://www.webcore.co.jp/recruit")
About this blog
■Author
atsこと柴田淳です。Atsushiはガイジンにうまく発音して頂けないので,これからはJunというペンネームで行こうと思っていましたがあんまり使ってません。
Webcore株式会社 代表取締役
■TRIVIAL TECHNOLOGIES 2.0
トリビアル・テクノロジー 2.0,「トリテク 2.0」と呼んでください。
Blog(ブログ)サイトです。Plone上で動く,オープンソースのBlog Product - COREBlog2を使っています。
 
最近書いた本,Mook
みんなのPython Webアプリ編
Pythonの基礎から,Webアプリやフレームワークの仕組みまで,つまることなく一気に学べる書籍です。「みんなのPython」と一緒に読んでください:-)。
みんなのPython
Pythonの入門書です。基本的なことから分かりやすく解説するよう勤めました。Pythonをはじめたいと思っている人,JavaやC++,PerlやRubyを学ぼうと思って躓いてしまった人はぜひ読んで下さい。
 

Powered by Plone, the Open Source Content Management System