SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|

2015-12-10(Thu) pinchmail、または私は如何にしてfetchmailを諦めてmaveから機能を切り出すことにしたか 

  ウェブサービスなどを構築する場合、メールをトリガに処理をさせるのは良いアイデアだと思っており、事実、多用している。

  なにが良いって……

・メールを送信できる端末はどこにでもあり、どこからでも要求を送信できる
・メールというインフラは、概ね信頼性が高く、障害でメールが消失しにくい
・任意のタイミングで(周期的に)要求を受信(POP)し、処理できる
・必要なら即座に応答を送信(SMTP)できる
・処理に失敗したら、メールを削除しなければ、再度要求を受信(POP)できる

  ……などといっても、普通の人にはまったく実感できないことであろうが。要するに、汎用のキュー機構として使い勝手がいいってことだ。

  ひとつのメールアカウントに到着した要求を、複数のサービスで処理することもできる。fetchmailとprocmailを使い、複数のメールアカウントに転送するのである。各々のサービスは、各々のメールアカウントに到着したメールをトリガとし、メールの内容を見て、自分が処理すべきメールであれば処理し、そうでなければ単に読み捨てればいい。

  んが、ここで問題。ひとつのメールアカウントに到着した要求を「ホストをまたがった」複数のサービスで処理することが難しいのだ。

  そんなの、メールアカウントAから、ホストBがメールを受信し、ホストB上のサービスC, D、および、ホストE上のサービスF, Gにメールを転送すればいいじゃん、procmailには、ホスト間のメール転送機能もあるでしょ? といわれればそのとおりなのだが、それはイマイチなのである。

  なぜならば、ホストBが死んでしまった場合、ホストEのサービスも止まってしまうからである。そもそも、ホストBとホストEとは対等な立場なのだから、実装も対等にするべきなのである。

  そうなると、ホストBとホストEが、等しくメールアカウントAにアクセスする構成を採らざるを得ないのだが、ホストBがメールを受信して削除してしまうと、ホストEがメールを受信できなくなってしまう。その逆も起こりうる。片手落ちこの上ない。ならばと、メール受信後もメールを削除しなければ、双方でメールを受信させることが可能になるのだが、今度はメールボックスを溢れさせることになる。

  んが、この解決は別に難しいことではない。

  メール受信後も即座にはメールを消さないが、しばらく経ったメールは消す

  ……という動作ができればいいのだ。しかし、fetchmailにはそのような機能がないようなのである。

  これ、ニッチな機能のようであって、実はかなり有用な機能なのだ。というのも、複数の環境でメールを処理する場合、例えば、本宅と別宅で同じメール環境を持ちたい場合に「しばらく」の長さを、双方のPOP間隔より長めにすることにより、双方に同じ内容のメールボックスを維持できるようになるからである。

  というか、それって拙作のメールクライアント「mave」で既に実現されている機能じゃねぇか……というワケで、POP機能の部分だけ切り出し、パイプでprocmailに渡すコードだけ追加してみた。その名も「pinchmail」。「fetchmail」の代わりとなる物件だから、敢えて名前も似せてみた。

  この「pinchmail」を、ホストB, E の両方に導入し、crontabで周期動作するように設定すれば、両者は対等であり、すべてのメールを処理することができるようになる。

  パッケージを置いておく。