2010/12/14

Google App Engineでcronを使って、定期的にメールを配信する方法を調べました。



Google App Engineでメールを送信するスクリプトがありました。どこで教えていただいたものか忘れてしまいました。
# encoding: utf-8

import os
import logging
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.api import mail, users

class MainPage(webapp.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if not user:
            self.redirect(users.create_login_url("/"))
        else:
            # メール送信の設定
            nickname = user.nickname()
            mailAddr = user.email()

            # ログの記録
            logging.debug("%s<%s>にメールします", nickname, mailAddr)

            # メール送信
            mail.send_mail(sender="<メールアドレス>",
            to="%s<%s>" % (nickname, mailAddr),
            subject="こんにちは!%sさん" % nickname,
            body="""
            拝啓、%sさん
            お世話になっております。
            そしてさようなら。
            """ % nickname)

            # 画面表示
            path = os.path.join(os.path.dirname(__file__), 'response.html')
            self.response.out.write(
            template.render(path, {'username':user.nickname()}))

def main():
    application = webapp.WSGIApplication([('/', MainPage)],
                   debug=True)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()
このアプリのサイトにアクセスをすると、ログインしているGoogleのアカウント宛にメールを送信します。

このプログラムを定期的に動作させるために、cronを使って設定します。下記がcron.yamlの設定。
cron:
- description: mail cron test
  url: /
  schedule: every 2 hours
  timezone: Asia/Tokyo
このプログラムを2時間ごとに起動します。しかし、このままでは、正常には動作しません。スクリプトがログインユーザーがいることを前提に作成されているので、ログインしていない場合は、ログイン画面にリダイレクトされて、実際のメール送信はされません。

そこで、ログインユーザーを想定せずに、固定の送信先へメールを送信するように変更してみます。下記の<メールアドレス名>に固定のメールアドレス表示名、<メールアドレス>の部分にメールアドレスを設定します。
# encoding: utf-8

import os
import logging
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.api import mail

class MainPage(webapp.RequestHandler):
    def get(self):
        # メール送信の設定
        nickname = "<メールアドレス名>"
        mailAddr = "<メールアドレス>"

        # ログの記録
        logging.debug("%s<%s>にメールします", nickname, mailAddr)

        # メール送信
        mail.send_mail(sender="<メールアドレス>",
        to="%s<%s>" % (nickname, mailAddr),
        subject="こんにちは!%sさん" % nickname,
        body="""
        拝啓、%sさん
        お世話になっております。
        そしてさようなら。
        """ % nickname)

def main():
    application = webapp.WSGIApplication([('/', MainPage)],
                   debug=True)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
  main()
これで、定期的にメールを送信することが出来るようになりました。


Google App Engine Launcherを使ってのアップ方法を記録しておきます。

アプリを選んで、「Deploy」ボタンをクリックします。


Deploy Application to Googleの認証画面で、Emailとパスワードを入れて、「OK」ボタンを押します。


その後は自動でアップロードが始まり、動作状況がモニタされます。

0 件のコメント:

人気の投稿 (過去 30 日間)