第102章 mail


メールコンポーネント

mail コンポーネントは、Spring のメールサポートと基盤の JavaMail システムを介して電子メールへのアクセスを提供します。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mail</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap
geronimo mail .jar
添付ファイルのあるメールをポーリングする際に、geronimo メール .jar (v1.6)にバグがあることが発見されました。Content-Type を正しく特定できません。したがって、.jpeg ファイルをメールに添付し、ポーリングすると、Content-Typeimage/jpeg ではなく text/plain として解決されます。このため、org.apache.camel.component.ContentTypeResolver SPI インターフェイスが追加され、独自の実装を提供でき、ファイル名に基づいて正しい Mime タイプを返すことでこのバグを修正できるようになりました。そのため、ファイル名が jpeg/jpg で終わる場合は、image/jpeg を返すことができます。
MailComponent インスタンスまたは MailEndpoint インスタンスでカスタムリゾルバーを設定できます。
POP3 または IMAP
POP3 にはいくつかの制限があり、エンドユーザーは可能であれば IMAP を使用することが推奨されます。
テストでの mock-mail の使用
ユニットテストにはモックフレームワークを使用できます。これにより、実際のメールサーバーを必要とせずにテストできます。ただし、実稼働環境などにメールを実際のメールサーバーに送信する必要がある場合、モックメールを含めないでください。クラスパスに mock-javamail.jar が存在するだけで、メールの送信が回避されます。

Camel on EAP デプロイメント

このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください
デフォルトでは、Camel は独自のメールセッションを作成し、このセッションを使用してメールサーバーと対話します。しかし、JBoss EAP にはすでに mail サブシステムがあり、セキュアな接続に関連するすべてのサポート、ユーザー名とパスワードの暗号化などが提供されます。JBoss EAP 設定内でメールセッションを設定し、JNDI を使用して Camel エンドポイントに接続することが推奨されます。
詳細は、Camel-Mail Configuration を参照してください。

URI 形式

メールエンドポイントには、以下の URI 形式のいずれかを使用できます(プロトコル、SMTP、POP3、または IMAP 用)。
smtp://[username@]host[:port][?options]
pop3://[username@]host[:port][?options]
imap://[username@]host[:port][?options]
Copy to Clipboard Toggle word wrap
mail コンポーネントは、これらのプロトコルのセキュアなバリアント(SSL で階層化)にも対応しています。スキームに s を追加して、セキュアなプロトコルを有効にできます。
smtps://[username@]host[:port][?options]
pop3s://[username@]host[:port][?options]
imaps://[username@]host[:port][?options]
Copy to Clipboard Toggle word wrap
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。

サンプルエンドポイント

通常、以下のようにログイン認証情報で URI を指定します(例:SMTP を使用)。
smtp://[username@]host[:port][?password=somepwd]
Copy to Clipboard Toggle word wrap
または、クエリーオプションとしてユーザー名とパスワードの両方を指定することもできます。
smtp://host[:port]?password=somepwd&username=someuser
Copy to Clipboard Toggle word wrap
以下に例を示します。
smtp://mycompany.mailserver:30?password=tiger&username=scott
Copy to Clipboard Toggle word wrap

デフォルトのポート

デフォルトのポート番号がサポートされています。ポート番号を省略すると、Camel はプロトコルに基づいて使用するポート番号を決定します。
Expand
Protocol デフォルトのポート番号
SMTP 25
SMTPS 465
POP3 110
POP3S 995
IMAP 143
IMAPS 993

オプション

Expand
プロパティー デフォルト 説明
host 接続するホスト名または IP アドレス。
port 「デフォルトのポート」を参照してください。 接続先の TCP ポート番号。
username メールサーバーのユーザー名。
password null メールサーバーのパスワード。
ignoreUriScheme false false の場合、Camel はスキームを使用してトランスポートプロトコル(POP、IMAP、SMTP など)を決定します。
contentType text/plain メールメッセージのコンテンツタイプ。HTML メールには text/html を使用します。
folderName INBOX ポーリングするフォルダー。
destination username@host @非推奨: 代わりに to オプションを使用してください。TO 受信者(電子メールの受信側)。
上記を以下のように変更します。 username@host TO 受信者(メールの受信側)。複数のメールアドレスはコンマで区切ります。& などの特殊文字を含む電子メールアドレスは、RAW() 関数で囲む必要があります。これは、URI エンコーディングをバイパスするために使用できます。
replyTo alias@host Camel 2.8.4 以降、2.9.1\+ では、Reply-To 受信者(応答メールの受信側)です。複数のメールアドレスはコンマで区切ります。
CC null CC の受信者(メールの受信側)。複数のメールアドレスはコンマで区切ります。
BCC null BCC 受信者(メールの受信側)。複数のメールアドレスはコンマで区切ります。
from camel@localhost FROM メールアドレス。
subject Camel 2.3 の時点で、送信されるメッセージの Subject。注記:ヘッダーにサブジェクトを設定することは、このオプションよりも優先されます。
peek
true
Camel 2.11.3/2.12.2: コンシューマーのみ。メールメッセージを処理する前に、javax.mail.Message に peeked のマークを付けます。これは、IMAPMessage メッセージタイプにのみ適用されます。peek を使用すると、メールはメールサーバーで SEEN とマークされません。これにより、Camel でエラー処理がある場合にメールメッセージをロールバックできます。
delete false 処理後にメッセージを削除します。これには、メールメッセージに DELETED フラグを設定します。false の場合、SEEN フラグが代わりに設定されます。Camel 2.10 以降では、ヘッダーにキー delete を設定して、メールを削除するかどうかを決定します。
Unseen true コンシューマーエンドポイントを設定して、未確認メッセージ(新しいメッセージ)またはすべてのメッセージのみを処理することができます。Camel は常に削除されたメッセージを省略することに注意してください。true のデフォルトオプションは、未確認のメッセージだけに絞り込みます。POP3 は SEEN フラグをサポートしないため、このオプションは POP3 ではサポートされていません。代わりに IMAP を使用してください。重要: searchTerm オプションも使用する場合、このオプションは使用され ません。代わりに、searchTerm の使用時の未確認を無効にし、searchTerm.unseen=false を用語として追加します。
copyTo null Camel 2.10: コンシューマーのみ。メールメッセージの処理後、指定した名前のメールフォルダーにコピーできます。この設定値を上書きするには、キー copyTo のヘッダーを使用します。これにより、実行時に設定されたフォルダー名にメッセージをコピーできます。
fetchSize \-1 ポーリング中に消費するメッセージの最大数を設定します。メールボックスフォルダーに多くのメッセージが含まれる場合、これを使用してメールサーバーの過負荷を回避することができます。デフォルト値の \-1 はフェッチサイズがなく、すべてのメッセージが消費されることを意味します。値を 0 に設定すると、Camel はメッセージをまったく消費しません。
alternativeBodyHeader CamelMailAlternativeBody 代替メールボディーが含まれる IN メッセージヘッダーへのキーを指定します。たとえば、テキスト/html 形式でメールを送信し、HTML 以外のメールクライアント用に代替メール本文を提供する場合は、別のメール本文をヘッダーとして設定します。
debugMode false 基礎となるメールフレームワークでデバッグモードを有効にします。SUN Mail フレームワークは、デフォルトでデバッグメッセージを System.out に記録します。
connectionTimeout 30000 接続のタイムアウト(ミリ秒単位)。デフォルトは 30 秒です。
consumer.initialDelay 1000 ポーリングが開始するまでの時間(ミリ秒単位)。
consumer.delay 60000 Camel は、メールサーバーのオーバーロードを防ぐために、デフォルトで 1 分ごとにメールボックスをポーリングします。
consumer.useFixedDelay false true に設定すると、ポーリング間の固定遅延が使用されます。それ以外の場合には、固定レートが使用されます。詳細は、JDK の ScheduledExecutorService を参照してください。
disconnect false camel 2.8.3/2.9: ポーリング後にコンシューマーが切断されるかどうか。これを有効にすると、Camel がポーリングごとに強制的に接続します。
closeFolder true Camel 2.10.4: ポーリング後にコンシューマーがフォルダーを閉じるかどうか。このオプションを false に設定して disconnect=false も持つと、コンシューマーはポーリング間でフォルダーを開いたままにします。
mail.XXX null 追加の java メールプロパティー を設定します。たとえば、POP3 を使用する際に特別なプロパティーを設定する場合は、mail.pop3.forgettopheaders=true などの URI にオプションを直接提供できるようになりました。たとえば、mail .pop3.forgettopheaders=true&mail.mime.encodefilename=true などの複数のオプションを設定できます。
mapMailMessage true camel 2.8: Camel が受信したメールメッセージを Camel ボディー/ヘッダーにマップするかどうかを指定します。true に設定すると、メールメッセージのボディーは Camel IN メッセージのボディーにマッピングされ、メールヘッダーは IN ヘッダーにマッピングされます。このオプションを false に設定すると、IN メッセージには生の javax.mail.Message が含まれます。exchange.getIn ().getBody (javax.mail.Message.class) を呼び出すことで、この未加工メッセージを取得できます。
maxMessagesPerPoll 0 ポーリングごとに収集するメッセージの最大数を指定します。デフォルトでは最大値は設定されていません。たとえば、1000 などの制限を設定して、サーバーの起動時に数千のファイルがダウンロードされないようにすることができます。このオプションを無効にするには、0 または負の値を設定します。
javaMailSender null カスタムメール実装を使用するために、プラグ可能な org.apache.camel.component.mail.JavaMailSender インスタンスを指定します。
ignoreUnsupportedCharset false Camel がメールの送信時にローカル JVM でサポートされていない charset を無視するようにするオプション。charset がサポートされていない場合は、charset=XXX ( XXX はサポート対象外の charset を表します)が コンテンツタイプ から削除され、代わりにプラットフォームのデフォルトに依存します。
sslContextParameters null Camel 2.10: Registryorg.apache.camel.util.jsse.SSLContextParameters オブジェクトへの参照。 この参照は、コンポーネントレベルで設定済みの SSLContextParameters を上書きします。Security Guide および Using the JSSE Configuration Utility の Configuring Transport Security for Camel Components の章 を参照してください。
searchTerm null Camel 2.11: javax.mail.search.SearchTerm を参照します。これにより、特定の日付の後に送信されるサブジェクト、ボディー、from などの検索条件に基づいてメールをフィルターリングできます。例については、以下を参照してください。
searchTerm.xxx null Camel 2.11: org.apache.camel.component.mail.SimpleSearchTerm クラスで定義される制限数の用語をサポートするエンドポイント URI から直接検索用語を設定します。例については、以下を参照してください。
sortTerm
null
Camel 2.15: IMAP が検索したメールをソートするために使用する sortTerms を設定します。最初にレジストリーでcom.sun.mail.imap.sortTerm の配列を定義し、この URI オプションで参照するには #name が必要になる場合があります。
Camel 2.16: Camel が内部で変換する URI でソート用語のコンマ区切りリストを指定することもできます。たとえば、日付で降順をソートするには、sortTerm=reverse,date を使用します。com.sun.mail.imap.SortTerm で定義されているソート用語のいずれかを使用できます。
postProcessAction
null Camel 2.15: 通常の処理が終了した後にメールボックスで後処理タスクを実行する場合は、org.apache.camel.component.mail. MailBoxPostProcessAction を参照してください。
skipFailedMessage
false Camel 2.15: メールコンシューマーが指定のメールメッセージを取得できない場合、このオプションを使用するとメッセージをスキップして次のメールメッセージを取得できます。デフォルトの動作では、コンシューマーは例外を出力し、バッチからのメールは Camel によってルーティングできません。
handleFailedMessage
false Camel 2.15: メールコンシューマーが指定のメールメッセージを取得できない場合、このオプションを使用すると、コンシューマーのエラーハンドラーによって原因となった例外を処理できるようになります。コンシューマーでブリッジエラーハンドラーを有効にすると、Camel ルーティングエラーハンドラーは代わりに例外を処理できます。デフォルトの動作では、コンシューマーは例外を出力し、バッチからのメールは Camel によってルーティングできません。
dummyTrustManager
false Camel 2.17: すべての証明書を信頼するためにダミーのセキュリティー設定を使用するには、以下を実行します。実稼働ではなく、開発モードにのみ使用してください。
idempotentRepository
null Camel 2.17: プラグ可能なリポジトリー org.apache.camel.spi.IdempotentRepository。同じメールボックスからのクラスター消費を許可し、コンシューマーの処理にメールメッセージが有効かどうかを調整します。
idempotentRepositoryRemoveOnCommit
true Camel 2.17: idempotent リポジトリーを使用する場合、メールメッセージが正常に処理され、コミットされると、メッセージ ID がべき等リポジトリー(デフォルト)から削除されるか、リポジトリーに保存されます。デフォルトでは、メッセージ ID は一意であり、リポジトリーに格納される値がないことが想定されます。これは、メールメッセージが再度消費されるのを防ぐために表示/移動または削除としてマークされるためです。そのため、メッセージ ID がべき等リポジトリーに保存されるため、値はほとんどありません。ただし、このオプションを使用すると、任意の理由でメッセージ ID を保存できます。
mailUidGenerator
Camel 2.17: カスタムロジックを使用してメールメッセージの UUID を生成できるようにするプラグ可能な MailUidGenerator

SSL サポート

基盤となるメールフレームワークは、SSL サポートを提供します。 必要な Java Mail API 設定オプションを完全に指定して SSL/TLS サポートを設定するか、コンポーネントまたはエンドポイント設定を介して設定された SSLContextParameters オブジェクトを提供することもできます。Security Guide の Configuring Transport Security for Camel Components の章を参照してください

JSSE 設定ユーティリティーの使用

Camel 2.10 の時点で、mail コンポーネントは Camel JSSE 設定ユーティリティーを介して SSL/TLS 設定をサポートします。 このユーティリティーは、作成する必要のあるコンポーネント固有のコードの量を大幅に減らし、エンドポイントおよびコンポーネントレベルで設定可能です。 以下の例は、mail コンポーネントで ユーティリティーを使用する方法を示しています。

エンドポイントのプログラムによる設定

KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/truststore.jks");
ksp.setPassword("keystorePassword");
TrustManagersParameters tmp = new TrustManagersParameters();
tmp.setKeyStore(ksp);
SSLContextParameters scp = new SSLContextParameters();
scp.setTrustManagers(tmp);
Registry registry = ...
registry.bind("sslContextParameters", scp);
...
from(...)
  .to("smtps://smtp.google.com?username=user@gmail.com&password=password&sslContextParameters=#sslContextParameters");
Copy to Clipboard Toggle word wrap

エンドポイントの Spring DSL ベースの設定

...
<camel:sslContextParameters id="sslContextParameters">
  <camel:trustManagers>
    <camel:keyStore resource="/users/home/server/truststore.jks" password="keystorePassword"/>
  </camel:trustManagers>
</camel:sslContextParameters>...
...
<to uri="smtps://smtp.google.com?username=user@gmail.com&password=password&sslContextParameters=#sslContextParameters"/>...
Copy to Clipboard Toggle word wrap

JavaMail の直接設定

Camel は、既知の認証局(デフォルトの JVM 信頼設定)によって発行された証明書のみを信頼する SUN JavaMail を使用します。独自の証明書を発行する場合は、CA 証明書を JVM の Java 信頼/キーストアファイルにインポートする必要があります。デフォルトの JVM 信頼/キーストアファイルを上書きします(詳細は、JavaMail の SSLNOTES.txt を参照してください)。

メールメッセージの内容

Camel はメッセージエクスチェンジの IN ボディーを MimeMessage テキストコンテンツとして使用します。ボディーは String.class に変換されます。
Camel はすべてのエクスチェンジの IN ヘッダーを MimeMessage ヘッダーにコピーします。
MimeMessage のサブジェクトは、IN メッセージのヘッダープロパティーを使用して設定できます。以下のコードはこれを示しています。
from("direct:a").setHeader("subject", constant(subject)).to("smtp://james2@localhost");
Copy to Clipboard Toggle word wrap
recipients などの他の MimeMessage ヘッダーにも適用されるため、以下のようにヘッダープロパティー 使用できます。
Map<String, Object> map = new HashMap<String, Object>();
map.put("To", "davsclaus@apache.org");
map.put("From", "jstrachan@apache.org");
map.put("Subject", "Camel rocks");

String body = "Hello Claus.\nYes it does.\n\nRegards James.";
template.sendBodyAndHeaders("smtp://davsclaus@apache.org", body, map);
Copy to Clipboard Toggle word wrap
Camel 2.11 から MailProducer をサーバーに送信する場合、Camel メッセージヘッダーから CamelMailMessageId キーを持つ MimeMessage のメッセージ ID を取得できるはずです。

ヘッダーが事前設定された受信者よりも優先されます。

メッセージヘッダーに指定された受信者は常にエンドポイント URI で事前設定された受信者よりも優先されます。メッセージヘッダーに受信者を提供する場合は、取得する内容になります。エンドポイント URI で事前設定された受信者はフォールバックとして処理されます。
以下のコード例では、メールメッセージは davsclaus@apache.org に送信されます。これは、事前設定された受信者 info@mycompany.com よりも優先されます。エンドポイント URI の CC および BCC 設定も無視され、これらの受信者はメールを受信しません。ヘッダーと事前設定された設定の選択は all または nothing です。mail コンポーネントはヘッダーのみから受信者を取得する 、事前設定された設定から排他的に取得します。ヘッダーと事前設定された設定を混在させることはできません。
        Map<String, Object> headers = new HashMap<String, Object>();
        headers.put("to", "davsclaus@apache.org");

        template.sendBodyAndHeaders("smtp://admin@localhost?to=info@mycompany.com", "Hello World", headers);
Copy to Clipboard Toggle word wrap

複数の受信者で設定が容易になります。

コンマ区切りまたはセミコロンで区切られたリストを使用して、複数の受信者を設定できます。これは、ヘッダー設定とエンドポイント URI の設定の両方に適用されます。以下に例を示します。
        Map<String, Object> headers = new HashMap<String, Object>();
        headers.put("to", "davsclaus@apache.org ; jstrachan@apache.org ; ningjiang@apache.org");
Copy to Clipboard Toggle word wrap
上記の例では、セミコロン ; を区切り文字として使用します。

送信者名と電子メールの設定

受信者は < email> の形式で指定して、受信者の名前とメールアドレスの両方を含めることができます。
たとえば、Message で以下のヘッダーを定義します。
Map headers = new HashMap();
map.put("To", "Claus Ibsen <davsclaus@apache.org>");
map.put("From", "James Strachan <jstrachan@apache.org>");
map.put("Subject", "Camel is cool");
Copy to Clipboard Toggle word wrap

SUN JavaMail

SUN JavaMail は、メールの消費と生成のフーッドで使用されます。POP3 プロトコルまたは IMAP プロトコルのいずれかを使用する際に、エンドユーザーがこれらの参照を参照することが推奨されます。特に、POP3 の機能は IMAP よりも限定されている点にご留意ください。

サンプル

JMS キューから受信したメッセージを電子メールとして送信する単純なルートから始めます。email アカウントは、mymailserver.com管理者 アカウントです。
from("jms://queue:subscription").to("smtp://admin@mymailserver.com?password=secret");
Copy to Clipboard Toggle word wrap
次のサンプルでは、1 分ごとに新しい電子メールのメールボックスをポーリングします。ポーリング間隔 consumer.delay を 60000 ミリ秒 = 60 秒として設定するのに特別なコンシューマーオプションを使用していることに注意してください。
from("imap://admin@mymailserver.com
     password=secret&unseen=true&consumer.delay=60000")
    .to("seda://mails");
Copy to Clipboard Toggle word wrap
この例では、複数の受信者にメールを送信します。
// all the recipients of this mail are:
// To: camel@riders.org , easy@riders.org
// CC: me@you.org
// BCC: someone@somewhere.org
String recipients = "&To=camel@riders.org,easy@riders.org&CC=me@you.org&BCC=someone@somewhere.org";

from("direct:a").to("smtp://you@mymailserver.com?password=secret&From=you@apache.org" + recipients);
Copy to Clipboard Toggle word wrap

添付ファイルを使用したメールの送信サンプル

添付ファイルはすべての Camel コンポーネントによってサポートされない
接続 API は Java アクティベーションキーフレームワークをベースとしており、一般的に Mail API でのみ使用されます。他の Camel コンポーネントの多くは添付をサポートしないため、添付がルートとともに伝播されるため、アタッチメントが失われる可能性があります。したがって、サムのルールは、メッセージをメールエンドポイントに送信する前に添付ファイルを追加することです。
mail コンポーネントは添付ファイルをサポートします。以下の例では、ロゴファイルアタッチメントのあるプレーンテキストメッセージが含まれるメールメッセージを送信します。
// create an exchange with a normal body and attachment to be produced as email
Endpoint endpoint = context.getEndpoint("smtp://james@mymailserver.com?password=secret");

// create the exchange with the mail message that is multipart with a file and a Hello World text/plain message.
Exchange exchange = endpoint.createExchange();
Message in = exchange.getIn();
in.setBody("Hello World");
in.addAttachment("logo.jpeg", new DataHandler(new FileDataSource("src/test/data/logo.jpeg")));

// create a producer that can produce the exchange (= send the mail)
Producer producer = endpoint.createProducer();
// start the producer
producer.start();
// and let it go (processes the exchange by sending the email)
producer.process(exchange);
Copy to Clipboard Toggle word wrap

SSL の例

この例では、メールの Google メール受信トレイをポーリングします。メールをローカルメールクライアントにダウンロードするには、Google メールで SSL を有効にして設定する必要があります。これには、Google メールアカウントにログインし、IMAP アクセスを許可するように設定を変更します。Google には、これを実行するための詳細なドキュメントがあります。
from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
    + "&delete=false&unseen=true&consumer.delay=60000").to("log:newmail");
Copy to Clipboard Toggle word wrap
上記のルートは、新しいメールを 1 分ごとに新しいメールの Google メールインボックスをポーリングし、受信したメッセージを newmail ロガーカテゴリーに記録します。DEBUG ロギングを有効にしてサンプルを実行すると、ログの進捗をモニターできます。
2008-05-08 06:32:09,640 DEBUG MailConsumer - Connecting to MailStore imaps//imap.gmail.com:993 (SSL enabled), folder=INBOX
2008-05-08 06:32:11,203 DEBUG MailConsumer - Polling mailfolder: imaps//imap.gmail.com:993 (SSL enabled), folder=INBOX
2008-05-08 06:32:11,640 DEBUG MailConsumer - Fetching 1 messages. Total 1 messages.
2008-05-08 06:32:12,171 DEBUG MailConsumer - Processing message: messageNumber=[332], from=[James Bond <007@mi5.co.uk>], to=YOUR_USERNAME@gmail.com], subject=[...
2008-05-08 06:32:12,187 INFO  newmail - Exchange[MailMessage: messageNumber=[332], from=[James Bond <007@mi5.co.uk>], to=YOUR_USERNAME@gmail.com], subject=[...
Copy to Clipboard Toggle word wrap

添付サンプルでメールの消費

この例では、メールボックスをポーリングし、メールからのすべての添付ファイルをファイルとして保存します。まず、メールボックスをポーリングするルートを定義します。このサンプルは google メールをベースとしているため、SSL の例と同じルートを使用します。
from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
    + "&delete=false&unseen=true&consumer.delay=60000").process(new MyMailProcessor());
Copy to Clipboard Toggle word wrap
メールをログに記録する代わりに、java コードからのメールを処理できるプロセッサーを使用します。
    public void process(Exchange exchange) throws Exception {
        // the API is a bit clunky so we need to loop
        Map<String, DataHandler> attachments = exchange.getIn().getAttachments();
        if (attachments.size() > 0) {
            for (String name : attachments.keySet()) {
                DataHandler dh = attachments.get(name);
                // get the file name
                String filename = dh.getName();

                // get the content and convert it to byte[]
                byte[] data = exchange.getContext().getTypeConverter()
                                  .convertTo(byte[].class, dh.getInputStream());

                // write the data to a file
                FileOutputStream out = new FileOutputStream(filename);
                out.write(data);
                out.flush();
                out.close();
            }
        }
   }
Copy to Clipboard Toggle word wrap
ご覧のとおり、添付を処理する API は少し明確ですが、javax.activation.DataHandler を取得して標準 API を使用して添付を処理できるようにすることができます。

添付ファイルを使用したメールメッセージを分割する方法

この例では、複数の添付ファイルがあるメールメッセージを消費します。実行する内容は、個別の添付ファイルごとに Splitter EIP を使用して、添付ファイルを個別に処理することです。たとえば、メールメッセージに 5 つの添付がある場合、Splitter は 1 つの添付を持つ 5 つのメッセージを処理します。これを行うには、Splitter にカスタム を提供する必要があります。ここでは、1 つの添付で 5 つのメッセージが含まれる List<Message> を提供します。
このコードは、camel-mail コンポーネントで Camel 2.10 以降は追加設定なしで提供されます。コードはクラス org.apache.camel.component.mail.SplitAttachmentsExpression にあり、ソースコードは ここにあります。
Camel ルートでは、以下のようにルートでこの を使用する必要があります。
from("pop3://james@mymailserver.com?password=secret&consumer.delay=1000")
    .to("log:email")
    // use the SplitAttachmentsExpression which will split the message per attachment
    .split(new SplitAttachmentsExpression())
        // each message going to this mock has a single attachment
        .to("mock:split")
    .end();
Copy to Clipboard Toggle word wrap
XML DSL を使用する場合は、以下のように Splitter でメソッド呼び出し式を宣言する必要があります。
<split>
  <method beanType="org.apache.camel.component.mail.SplitAttachmentsExpression"/>
  <to uri="mock:split"/>
</split>
Copy to Clipboard Toggle word wrap
Camel 2.16 以降では、添付ファイルを byte[] として分割してメッセージボディーとして保存することもできます。これは、ブール値 true で式を作成して行います。以下に例を示します。
SplitAttachmentsExpression split = SplitAttachmentsExpression(true);
Copy to Clipboard Toggle word wrap
次に、Splitter EIP で式を使用します。

カスタム SearchTerm の使用

Camel 2.11 から利用可能
MailEndpointsearchTerm を設定すると、不要なメールをフィルターリングできます。
たとえば、Subject または Text のいずれかに Camel が含まれるようにメールをフィルターするには、以下のように実行できます。
<route>
  <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subjectOrBody=Camel"/>
  <to uri="bean:myBean"/>
</route>
Copy to Clipboard Toggle word wrap
"searchTerm.subjectOrBody" をパラメーターキーとして使用して、メールの件名またはボディーで検索して、Camel という単語を含めることに注意してください。org.apache.camel.component.mail.SimpleSearchTerm クラスには、設定可能な数多くのオプションがあります。
または、新しい未確認のメールが 24 時間後に戻ってきます。now-24h 構文に注意してください。詳細は以下の表を参照してください。
<route>
  <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.fromSentDate=now-24h"/>
  <to uri="bean:myBean"/>
</route>
Copy to Clipboard Toggle word wrap
エンドポイント URI 設定に複数の searchTerm を指定できます。これらは AND 演算子を使用して組み合わせられるため、両方の条件が一致する必要があります。たとえば、メールの件名に Camel がある 24 時間後に最後に確認されていないメールを取得するには、以下を実行できます。
<route>
  <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subject=Camel&searchTerm.fromSentDate=now-24h"/>
  <to uri="bean:myBean"/>
</route>
Copy to Clipboard Toggle word wrap
Expand
オプション デフォルト 説明
unseen true 未確認のメールのみで制限するかどうか。
subjectOrBody null 単語を含む対象またはボディーで制限します。
subject null サブジェクトには という単語が含まれている必要があります。
body null 本文には という単語が含まれている必要があります。
from null メールは、指定した電子メールパターンから取得する必要があります。
to null メールは特定のメールパターンにする必要があります。
fromSentDate null メールは、指定した日付または等しい(GE)後に送信する必要があります。日付パターンは yyyy-MM-dd HH:mm:SS です。たとえば、2012-01- 01 00:00:00 を 2012 年以降の年から使用します。現在のタイムスタンプ にはnow を使用できます。now 構文はオプションのオフセットをサポートします。これは、数値で + または - のいずれかとして指定できます。たとえば、過去 24 時間の場合は、now - 24h を使用するか、スペース now-24h なしで使用できます。Camel は時間、分、秒の省略形をサポートすることに注意してください。
toSentDate null メールは、指定した日付の前または等しい(BE)に送信する必要があります。日付パターンは yyyy-MM-dd HH:mm:SS です。たとえば、2012-01- 01 00:00:00 を 2012 年前に使用します。現在のタイムスタンプ にはnow を使用できます。now 構文はオプションのオフセットをサポートします。これは、数値で + または - のいずれかとして指定できます。たとえば、過去 24 時間の場合は、now - 24h を使用するか、スペース now-24h なしで使用できます。Camel は時間、分、秒の省略形をサポートすることに注意してください。
SimpleSearchTerm は POJO から簡単に設定できるように設計されています。そのため、XML で <bean> スタイルを使用して設定することもできます。
<bean id="mySearchTerm" class="org.apache.camel.component.mail.SimpleSearchTerm">
  <property name="subject" value="Order"/>
  <property name="to" value="acme-order@acme.com"/>
  <property name="fromSentDate" value="now"/>
 </bean>
Copy to Clipboard Toggle word wrap
その後、以下のように Camel ルートの #beanId を使用して、この Bean を参照できます。
<route>
  <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm=#mySearchTerm"/>
  <to uri="bean:myBean"/>
</route>
Copy to Clipboard Toggle word wrap
Java には、org.apache.camel.component.mail. SearchTermBuilder クラスを使用して複合 SearchTerm を構築するビルダークラスがあります。これにより、次のような複雑な用語を作成できます。
// we just want the unseen mails which is not spam
SearchTermBuilder builder = new SearchTermBuilder();

builder.unseen().body(Op.not, "Spam").subject(Op.not, "Spam")
  // which was sent from either foo or bar
  .from("foo@somewhere.com").from(Op.or, "bar@somewhere.com");
  // .. and we could continue building the terms

SearchTerm term = builder.build();
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat