- PR -

メール受信後の処理について(qmail)

投稿者投稿内容
yoshiki
会議室デビュー日: 2005/05/21
投稿数: 13
投稿日時: 2005-09-06 11:14
いつも参考にしています。


qmail受信後の処理方法について教えてください。


qmail-1.03、qpopper4.0.8を使用して運用していますが、
以下の処理を「.qmail」エイリアスを使用して実現したいと考えています。

・メール受信後、添付ファイルのみを抜き出してサーバの任意のディレクトリに保存
・「.qmail」には転送先アドレスを指定
・転送先アドレスは固定
・添付ファイルを抜き出す処理は転送先アドレスのメールボックスから取得
・メールボックスから抜き出す処理はJavaで実装(javax.mailライブラリを使用してPOP3で接続)
・都合により「Mailbox」形式で運用


ところが「.qmail」の内容を以下のように記述すると、
#転送先アドレス
&hoge@hogehoge.com
#メールボックスから添付ファイルを抜き出す処理(シェルからJavaプログラムを呼ぶのみ)
|/export/home/hoge/hoge.sh


メールを完全に受信する前に、hoge.shが実行されてしまい、
Javaが実行されJavaから見ると、メールボックスには何もないと判断され
添付ファイルを抜き出すことができません。


色々と調べたのですがprocmail等を使用せずに、
「.qmailエイリアス」「シェル」「プログラム」の組み合わせで
何とか処理できる方法はないでしょうか。
どなたかご存知の方はご教授をお願い致します。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2005-09-06 12:37
*procmail等を使用せず*にという枠内で考えると・・・

> メールを完全に受信する前に、hoge.shが実行されてしまい、
> Javaが実行されJavaから見ると、メールボックスには何もないと判断され
> 添付ファイルを抜き出すことができません。

転送・配送の処理が非同期だからですね。

.qmailの設定を変えて、ローカルのMailboxにも残るようにすれば
同期処理できるのではないでしょうか?
「メールボックスから抜き出す処理」はローカルのPOPサービスを
使用するように変更して、最後にPOPのDELEコマンドを発行すれば
メールがたまり続けることもありません。
同時実行制御が難しいかなあ・・・

でも、Java使いなら本当はこれがお勧め↓
http://james.apache.org/
Mailetはすごいですよ!
yoshiki
会議室デビュー日: 2005/05/21
投稿数: 13
投稿日時: 2005-09-06 14:15
Java僧様 返答ありがとうございます。


> .qmailの設定を変えて、ローカルのMailboxにも残るようにすれば
> 同期処理できるのではないでしょうか?

.qmailの設定を変更して、
@転送先アドレスに送信されたメールを転送
A転送先アドレスへ完全にメールボックスに添付ファイルが受信された後、
 Javaを実行し転送先のメールボックスをpop3で接続
B転送先メールボックスより添付ファイル抜き出し
の一連の処理は実現可能となるのでしょうか?

今回はリアルタイム処理を求められていますので、
色々と試したのですが、結局は良い案が思い浮かびませんでした。。。


> 「メールボックスから抜き出す処理」はローカルのPOPサービスを
> 使用するように変更して、最後にPOPのDELEコマンドを発行すれば
> メールがたまり続けることもありません。
> 同時実行制御が難しいかなあ・・・

確かに同時実行制御が難しそうですね。
クーロンで定期的にメールボックスを確認するという案もあるのですが、
実行するたびにプロセスがあがるため余り使用したくはないのですが、
最悪その方法も考えざるを得ません。


> でも、Java使いなら本当はこれがお勧め↓
> http://james.apache.org/
> Mailetはすごいですよ!

使用したいのはやまやまですが既にqmailが導入されていたため、
あきらめざるをえませんでした。
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-09-06 14:50
qmailは使ったこと無いので、解かりませんが

hoge.sh の標準入力にメールデータが渡ってくるんじゃないんですか?
それをテンポラリファイルに保存して処理すればいいんじゃないですかね?

sendmail + .forwardではそういうことをやったことがあったので...
的外れでしたら、すみません。

[ メッセージ編集済み 編集者: jk 編集日時 2005-09-06 14:55 ]
yoshiki
会議室デビュー日: 2005/05/21
投稿数: 13
投稿日時: 2005-09-06 17:51
jk様 返答ありがとうございます。

> hoge.sh の標準入力にメールデータが渡ってくるんじゃないんですか?
> それをテンポラリファイルに保存して処理すればいいんじゃないですかね?

確かにhoge.shにはメールデータが渡るのですが、添付ファイルの扱い方など
perlやphp等を駆使すると簡単に実現出来そうですが、
極力他の言語を使用したくはありませんので。。。

単純な構成で実現したかったのですが、
procmail等を使用しないと今回の内容を満たす事は難しそうですね。

このまま簡単にはあきらめたくありませんので引き続き実現方法を調査します。

それともこのような構成で皆さんは処理を余りしないのですかね?
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-09-06 18:05
標準入力に渡るなら hoge.shをこんな感じにすればいんじゃないですか?

コード:

#!/bin/sh

#一時ファイル名
tempfile="mail.txt"

#標準入力->一時ファイル
cat -n > $tempflie

#Java環境変数等設定
(省略)

#javaアプリ実行
(省略)



ただ、tempfileを一意の名前になるようにしないと衝突したときにでメールが壊れます。
javaアプリにファイル名を渡す処理も必要ですね。

[ メッセージ編集済み 編集者: jk 編集日時 2005-09-06 18:07 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-09-06 18:16
こんにちは。
ちょっと状況が掴みづらいのですが、

1. yoshikiさんは、POP受信+添付ファイル抽出機能を持った javaアプリを持っている
2. qmailでメールを受信する時に添付ファイルを抽出したい
3. メール受信をトリガーとして、別の mbox にそのメッセージを保存し、1. のアプリ( POP経由 )で抽出する方法を考えた

ということでしょうか。今までの話ではそのように見えます。
であるなら、メール受信時のデータを一時ファイルに保存するか、もしくはパイプでダイレクトに読み込んで処理すれば良い物を、POP経由でデータを取得するという既存アプリの制約のために、余分に大きな苦労をしているのではないでしょうか??

[ メッセージ編集済み 編集者: angel 編集日時 2005-09-06 18:22 ]
yoshiki
会議室デビュー日: 2005/05/21
投稿数: 13
投稿日時: 2005-09-06 19:38
angel様 返答ありがとうございます。

今回の要望としてはangel様が記述されている内容そのものずばりです。

> であるなら、メール受信時のデータを一時ファイルに保存するか、もしくはパイプでダイ>
> レクトに読み込んで処理すれば良い物を、POP経由でデータを取得するという既存アプリの
> 制約のために、余分に大きな苦労をしているのではないでしょうか??

メール受信時のデータを一時ファイルに保存する方法が残念ながらうまくいかず、
またパイプでダイレクトしたところ添付ファイルの処理が出来なかったため、
pop経由で抽出する方法を考えた次第です。

jk様も記述されている通り一時ファイルに保存か、もしくは
パイプでダイレクトに読み込んで処理すればよいということですので、
もう少し考えてみます。

スキルアップ/キャリアアップ(JOB@IT)