質問
上司から、私が開発中のアプリケーションについてのリクエストを受け取りました。基本的に、外部クライアントが Excel ファイルを送信するための電子メール アドレス セットアップを取得しています。
私に必要なのは、このアドレスに送信された電子メールを自動的に取得して、添付ファイルを取得して処理し、フォルダーに保存できるようにする方法です。
どこから始めればよいかについても情報があれば助かります。\
注記:これを行うために Lotus Notes サーバーを使用していますが、(可能であれば) 一般的な方法の方が便利です。
他のヒント
編集: 私が最初にこの回答を書いて以来、Wiser は移行し、現在は単体テスト ツールのみであると主張しているため、以下の回答は少し理解してください...
Svristの答えは良いですが、彼の中間ステップ(後でJavaシステムによって取得されるようにメールをディスクに書き込むメールサーバー)を回避したい場合は、次のようにすることができます より賢明な.
Wiser を使用すると、Java 内メールサーバーを起動できます。
Wiser wiser = new Wiser();
wiser.setPort(2500);
wiser.start();
その後、メールを定期的にポーリングするだけです。
for (WiserMessage message : wiser.getMessages())
{
String envelopeSender = message.getEnvelopeSender();
String envelopeReceiver = message.getEnvelopeReceiver();
MimeMessage mess = message.getMimeMessage();
// mail processing goes here
}
データベース内のメールを使用します (Domino 管理者が設定できますが、ヘルプ ファイルにも記載されています)。
そのデータベースでは、すべての新しいドキュメントを処理するために定期的に実行されるエージェントを作成できます。このエージェントは、NotesRichTextItem クラスの EmbeddedObjects プロパティと NotesEmbeddedObject クラスの ExtractFile メソッドを使用して、添付ファイルのハンドルを取得し、指定された場所に添付ファイルを抽出します。
たとえば、このスクリプトは、ドキュメントの本文アイテム内のすべての添付ファイル、オブジェクト リンク、および埋め込みオブジェクトを調べます。添付ファイルが見つかるたびに、C ドライブの SAMPLES ディレクトリにファイルが切り離され、ドキュメントから添付ファイルが削除されます。
Dim doc As NotesDocument
Dim rtitem As Variant
'...set value of doc...
Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
If ( o.Type = EMBED_ATTACHMENT ) Then
Call o.ExtractFile( "c:\samples\" & o.Source )
Call o.Remove
Call doc.Save( False, True )
End If
End Forall
End If
私は最近、Domino サーバー上で Java エージェントを使用してかなりの作業を行ってきました。Domino 8.5 サーバーは Java 6 とその組み込みをサポートしているため、Domino 開発の経験が少しあれば、新しいメールの到着時に実行するエージェントを構築するのにそれほど時間はかかりません。LotusScript ではさらに簡単ですが、より専門的なスキルが必要であり、おそらく請負業者に依頼して提供してもらう必要があります。
遭遇する可能性がある制限は、抽出されたファイルに関するもので、ファイルを Domino サーバーのファイル構造に簡単に配置できますが、別のサーバーに配置することは OS のセキュリティによって制限される可能性があります。
Lotus Notes/Domino はメールを Notes データベースに保存します。ドキュメント (電子メール) の取得、フィールド値 (差出人、件名) の読み取り、ファイルの切り離しに使用できる API があります。
API には以下が含まれます
-LotusScript (VB バリアント、Notes データベース内で利用可能)
-Java (データベースの内部または外部から)
-C API (外部)
- COM サーバー経由で同じ API を利用可能
(LotusScript または Java を使用して) データベース内に「スケジュールされたエージェント」を作成すると、前回の実行以降に作成されたドキュメントを検索し、添付ファイルを検索して抽出できます。エージェントは、ファイル システムへの書き込みやその他のプロセスの開始に必要な権限など、サーバー上で適切な権限を持つ ID で署名される必要があります。
データベースの外部では、LotusScript 以外の任意の API を使用してサーバー/メール データベースにログインし、同様のプロセスに従うことができます。ファイルをクライアントまたは別のサーバー上でローカルに抽出します。C API と COM には Notes クライアントのインストールが必要ですが、Java アプリケーションは完全にインストールしなくても CORBA/DIIOP 経由で実行するように設定できます。
詳細については、Domino Designer のヘルプ (または C API については IBM の Web サイト) を参照してください。
これを行うための「一般的な方法」に関しては、Notes のデータにアクセスしていて添付ファイルを抽出する必要がある場合、これらの API が最良の選択肢であると思います。アプリケーションを別のメール システムに移植することを想定している場合は、「インターフェイス」を介して API ルーチンを切り離すことを検討してください。そうすれば、新しいメール システムをサポートするためにそのインターフェイスの新しい実装を追加するだけで済みます。
DIIOP を使用すると比較的簡単に Notes ドキュメントにアクセスできます。C API の道をたどるよりもはるかに簡単です...
で POP3Client を試してください。 ネットコモンズパッケージ;これにより、Java プログラムは任意の間隔 (数分ごと?) で特定のアカウントの新着メールをチェックできるようになります。毎時?)、必要に応じてメッセージを取得/削除します。
SMTP/POP3 は Domino サーバーで有効にすることができます。以前これを使用して、Squirrel Mail を実行できるようにしました。SMTP はリソースを少し消費しますが、作業を行うために LotusLand にアクセスする必要がないため、努力する価値は十分にあります。特定の電子メール ボックス (POP3 または SMTP) をチェックし、メッセージを解析して添付ファイルを取得し、必要な場所に配置する小さな Java CLI プログラムを作成するだけです。
ここにはたくさんのドキュメントと例があります:http://java.sun.com/products/javamail/
このアプローチで開発したテクニックは、Lotus/Domino に特化したテクニックよりも、将来のキャリアに広く応用できるでしょう。
何をするにしても、Lotus Notes のデータ構造を理解する必要があります。幸いなことに、Notes では完全に自動化されたソリューションを非常に簡単に構築できます。
最善の策は、Notes 内にこの機能を組み込んで、新しいメールを受信するたびに自動的に実行されるように設定することです。Gary の答えは正確ですが、経験がなければ、それを自分で実装する方法を理解するのはおそらく難しいでしょう。一方、有能な Notes プログラマーであれば、セットアップに 1 ~ 2 時間以上かかることはありません。