読者です 読者をやめる 読者になる 読者になる

PythonアプリからTheSchwartz経由でメールを送信

Python Perl

TheSchwartzの概要は分かってきたので、実践投入に向けてより実用的なコードを書いてみます。
TheSchwartz::Worker::SendEmailを使ってメールの配信というのが、簡単そう、かつ切実に必要なので、これを試してみました。


まず、PythonとTheSchwartzを媒介するGearmanベースのTheSchwartzを用意します。
基本的には昨日言及したコードを利用し、データベースの設定だけ書き換えます。

# myschwartzd
use Gearman::Worker;
use TheSchwartz;
use JSON::Any;

my $j = JSON::Any->new;

my $ts = TheSchwartz->new(databases => [{
    dsn => "dbi:mysql:database=schwartz",
    user => "root",
    pass => "",
}]);

# FIXME: use embedded gearman server, and workers be child processes

my $worker = Gearman::Worker->new;
$worker->job_servers('127.0.0.1:7003');

$worker->register_function("insert_job" => handler(\&insert_job));
$worker->work while 1;

# 省略
# http://code.sixapart.com/trac/TheSchwartz/browser/trunk/server/bin/schwartzdを参照して下さい


次に実際にメール送信を行うWorkerを用意します。
データベースの設定以外はドキュメントで紹介されているのと全く同じコード。
ドキュメントで説明されているように、MIMEエンコーディングについては全く何もやらないということなので、逆に言えば、クライアント側でMIMEエンコーディングを適切にやれば、日本語もOKのはず。後で試してみます。

use TheSchwartz;
use TheSchwartz::Worker::SendEmail;

# 送信元ホストを設定
TheSchwartz::Worker::SendEmail->set_HELO("example.com");

my $client = TheSchwartz->new(databases => [+{dsn => 'dbi:mysql:schwartz',
                                             user => 'root',
                                             pass => '' }]);

$client->can_do('TheSchwartz::Worker::SendEmail');
$client->work;


クライアントはPythonで書きます。

import simplejson
from email.MIMEText import MIMEText
from gearman import GearmanClient
from gearman.task import Task

client = GearmanClient(["127.0.0.1"]);

mail = MIMEText('test', 'plain', 'iso-2022-jp')
mail['To'] = 'to_addr@example.com'
mail['From'] = 'from_addr@example.com'
mail['Subject'] = 'Test'

arg = {'rcpts'   : ['to_addr@example.com'],
        'env_from': 'from_addr@example.com',
        'data'    : mail.as_string()
}
task = Task('insert_job',
        simplejson.dumps({'funcname': 'TheSchwartz::Worker::SendEmail',
                                      'arg'    : arg})
        )

client.do_task(task)


以上のようなGearman Worker, TheSchwartz Workerを書いて(デーモンorフォアグラウンドで)起動し、PythonのClientからタスクを実行すると・・・ちゃんとメール送信できたー!


今回はCPAN経由で入る安定版Gearmanを使って実験しましたが、ちまたで噂されるように大きめのデータはGearmanではやり取りできないのかもしれません。が、Subversion版のGearmanを使えば大丈夫なはず。


PythonからGearman, TheSchwartzという選択が上手く行きそうだという確信が増してきたので、次はDjangoからTheSchwartzジョブを呼ぶということに関して調査してみたいと思います。