- PR -

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

投稿者投稿内容
yoshiki
会議室デビュー日: 2005/05/21
投稿数: 13
投稿日時: 2005-09-07 09:59
あれから色々と試行錯誤を繰り返した結果、
パイプでダイレクトに処理をして添付ファイルを抽出する方法が
私に知識が無いのもありますが、残念ながら実現できませんでした。

また、jk様の記述にもありますように標準入力から
添付ファイルを抜き出す方法も検討したのですが、
Javaだと標準入力から抽出する方法は実現するのには
難しいと判断したためあきらめました。

やはりこのような処理の場合はprocmail等を使用しないといけないみたいですね。
極力設定する項目を増やしたくなかったのですが。


標準入力から添付ファイルを抽出するより、
POPから抽出するのが一番簡単だと思っていたのですが、
それも無理ですし。。。

皆さんもJavaのみで実現しようとしたとき、標準入力に処理をしようとして
同じようなことで一度は悩まれてるとは思うのですが、
どのように実現しているのですかね。。。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-09-07 11:55
おはようございます。
標準入力から読みこんで抽出が難しいというのは ?? なのですが ( 私は java使いではないもので )、ただ、yoshikiさんが、既存アプリの有効活用 ( POP3経由のデータ取得 ) を優先されるのであれば、それはそれで良いのではないかと思います。

で、
引用:
POPから抽出するのが一番簡単だと思っていたのですが、
それも無理ですし。。。


そんなことは無いと思いますよ。
元々 .qmail に列挙した処理は非同期ではなくシーケンシャルに実行されますから。

今回非同期になっているのは、& による転送を行うことで、メールキューを介在させているからです。
ここを hoge ユーザの Mailbox に直接保存する記述に替えれば良いと考えます。

勿論、パーミッションの問題やら、色々調整が必要になると思いますが、敢えて POP経由にする以上は仕方がないところでしょう。

追記:
よくよく読み返してみると、Java僧さんから既に同様のコメントが出ていましたね。


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

返信が遅れて申し訳ございません。

> そんなことは無いと思いますよ。
> 元々 .qmail に列挙した処理は非同期ではなくシーケンシャルに実行されますから。

この記述をみて初めて.qmailに記述した内容はシーケンシャルに実行されることが分かりました。
てっきり.qmail内の処理が完了するごとに動作すると思っていましたので勘違いしていました。

そこで2日ほど試行錯誤を繰り返し以下の@、Aの確認を行いました。

@ この記述内容を見る前に考えていた.qmailの内容
#転送先アドレス
&hoge@hogehoge.com
#メールボックスから添付ファイルを抜き出す処理(シェルからJavaプログラムを呼ぶのみ)
|/export/home/hoge/hoge.sh

・結果
hoge.shが実行後に転送先のメールボックスにメールが保存されるため、
絶対にメールボックスからは取得不可能。
理由はシーケンシャルに.qmailが実行されるため。


A .qmailの内容は変更せずに以下の処理をhoge.shに追加
sleep 30
/export/home/hoge/hogehoge.sh &

hoge.shからJavaプログラムを呼び出していたのをhogehoge.shから起動するようにし、
そのシェルをキックする時に「&」を追加し、バックグラウンド実行とする

・結果
hoge.shが実行と同時に、転送先のメールボックスにメールが保存される。
30秒待機後にJavaプログラムが起動されるが、メールボックスには既にメールが保存されているため、
Javaプログラムよりメールボックスからメールを取得できる。


以上の結果となり、一応ではありますがJavaプログラムからpop3接続にて
添付ファイルを抽出する処理を行うことができました。


> 標準入力から読みこんで抽出が難しいというのは ?? なのですが ( 私は java使いではないもので )、
> ただ、yoshikiさんが、既存アプリの有効活用 ( POP3経由のデータ取得 )
> を優先されるのであれば、それはそれで良いのではないかと思います。

perlやphpなどでは既に標準入力から読み込む処理などがライブラリ等で提供されているのですが、
Javaの場合、一から実装する必要があり、また時間が足りないため断念しました。


上記Aの方法の場合、同時にメール送信された場合の処理はどうするのか等
色々問題はありますがとりあえずこの方法で進めていきます。


貴重なご意見ありがとうございました。

また、Javaでも標準入力から添付ファイルも含むメール内容を取得できたと
いう方がいれば是非実現方法などのご報告をお願い致します。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-09-09 13:09
こんにちは。
引用:
返信が遅れて申し訳ございません。


いいえ、お気になさらずに。

さて、前のコメントについて補足させていただきます。
引用:
> そんなことは無いと思いますよ。
> 元々 .qmail に列挙した処理は非同期ではなくシーケンシャルに実行されますから。

この記述をみて初めて.qmailに記述した内容はシーケンシャルに実行されることが分かりました。
てっきり.qmail内の処理が完了するごとに動作すると思っていましたので勘違いしていました。


これは、yoshikiさんの当初の解釈で問題ありません。勘違いではないですよ。
.qmailに列挙した処理は、「シーケンシャル ( 順番 ) に」「一つ一つの完了を待って」実行されます。
( 完了を待たずに次々実行するような「非同期」ではない、ということです )

ただし、yoshikiさんの設定の場合、

 (0)  qmail-local が .qmail を読み込み処理を開始
 (1-1) & の指定により、転送を開始
 (1-2) 転送メールをキューに登録
 (1-3) 転送を完了
 (2-1) | の指定により、hoge.sh を実行
 (2-2) hoge.sh が実行した Javaアプリが POP接続し、qpopperがMailboxを読み込む

 (2'-1) qmail-send がキュー登録されたメールを処理
 (2'-2) hogeユーザの Mailbox へメッセージを追加

という流れになりまして、確かに (0)→(1)→(2) と、(0)→(1)→(2') は時系列に沿って行われます。が、(2) と (2') の前後関係は定かではありません。
これが、
引用:
今回非同期になっているのは、& による転送を行うことで、メールキューを介在させているからです。


と申し上げた所以です。

ここで、
引用:
ここを hoge ユーザの Mailbox に直接保存する記述に替えれば良いと考えます。


この案を採用すれば、

 (0)  qmail-local が .qmail を読み込み処理を開始
 (1-1) mbox形式保存の指定により、hogeユーザのMailbox相当のファイルへ追記開始
 (1-2) 追記完了
 (2-1) | の指定により、hoge.sh を実行
 (2-2) hoge.sh が実行した Javaアプリが POP接続し、qpopperがMailboxを読み込む

となり、(2-2) の時点では既に Mailboxにメッセージが入っているので、上手く行くだろう、ということになります。
※ 実際の設定方法の詳細については、man dot-qmail で。

以上、蛇足ながら。

[ メッセージ編集済み 編集者: angel 編集日時 2005-09-09 13:23 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-09-09 19:11
こんばんは。
補足の補足 ( 訂正 ) です。
かなり嘘をついていたことが判明しまして、大変失礼致しました。
引用:
という流れになりまして、確かに (0)→(1)→(2) と、(0)→(1)→(2') は時系列に沿って行われます。が、(2) と (2') の前後関係は定かではありません。


こちらですが、(0)→(1)→(2) ではなく、(0)→(2)→(1)の順番が正しいです。
よって、(0)→(2)→(1)→(2') の順に実行されるので…、確かに POPで読み出せないわけですね。(2)と(2')が非同期というのは嘘でした。
※ガセビアの沼へ直行です。

yoshikiさんはこのことをシーケンシャルと仰っていたのでしょうか…??
少なくとも、最初に私が使った時は、言葉のままの意味でしか使っていませんでした。
今、敢えて言うなら、「転送処理に関する例外事項」が妥当でしょうか。
詳しくは、man dot-qmail の最後の項、“ERROR HANDLING”参照です。
※ “&メールアドレス”ではなく、“| forward メールアドレス”なら順番通りなんでしょうけどね。

以上、失礼致しました。

[ メッセージ編集済み 編集者: angel 編集日時 2005-09-09 19:13 ]

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