ほんじゃらねっと

ダイエット中プログラマのブログ

添付ファイル付きメールをdjangoに登録する

メールで送信した画像とテキストデータをdjangoに登録するために、
メールサーバからデータベースに保存したメールデータを
Pythonのemailライブラリとdjango APIを使ってテキストデータと
画像ファイルとして保存するスクリプトを作成した。
色々省いたので、動くかどうか...。


emailパッケージの使用方法についてはこちらを参考にした。
http://nagosui.org/Nagosui/COREBlog2/fight-for-moblog-extra-email-module


C:/test/workspace/sample/scripts/mail_saver.py

import os
import re
import sys
import email
sys.path.append('C:/test/workspace')
from django.core.management import setup_environ
from sample import settings
setup_environ(settings)
from django.core.exceptions import ObjectDoesNotExist
from django.core.files.base import ContentFile
from sample.mail.models import Inbox
from sample.photo.models import Photo
from sample.blog.models import Blog, BlogPhotoMap
def main():
inbox_list = Inbox.objects.all()
for inbox in inbox_list:
message = email.message_from_string(inbox.message_body)
user = None
# ここでユーザー取得処理
if user:
blog = None
photo_list = []
for part in message.walk():
if part.get_content_maintype() == 'multipart':
pass
elif part.get_content_maintype() == 'text':
body = part.get_payload()
enc = part.get_content_charset()
ubody = unicode(body, enc)
blog = Blog()
blog.contents = ubody
blog.user = user
blog.save()
elif part.get_content_maintype() == 'image':
filename = part.get_filename()
photo = Photo()
photo.user = user
photo.image.save("ファイル名", ContentFile(part.get_payload(decode=1)), save=False)
photo.save()
photo_list.append(photo)
if blog:
# Save blog photo map
for photo in photo_list:
bpm = BlogPhotoMap()
bpm.blog = blog
bpm.photo = photo
bpm.save()
inbox_list.delete()
if __name__ == '__main__':
main()