第102章 mail
メールコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
mail コンポーネントは、Spring のメールサポートと基盤の JavaMail システムを介して電子メールへのアクセスを提供します。
Maven ユーザーは、このコンポーネントの
pom.xml に以下の依存関係を追加する必要があります。
geronimo mail .jar
添付ファイルのあるメールをポーリングする際に、geronimo メール
.jar (v1.6)にバグがあることが発見されました。Content-Type を正しく特定できません。したがって、.jpeg ファイルをメールに添付し、ポーリングすると、Content-Type は image/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]
smtp://[username@]host[:port][?options]
pop3://[username@]host[:port][?options]
imap://[username@]host[:port][?options]
mail コンポーネントは、これらのプロトコルのセキュアなバリアント(SSL で階層化)にも対応しています。スキームに
s を追加して、セキュアなプロトコルを有効にできます。
smtps://[username@]host[:port][?options] pop3s://[username@]host[:port][?options] imaps://[username@]host[:port][?options]
smtps://[username@]host[:port][?options]
pop3s://[username@]host[:port][?options]
imaps://[username@]host[:port][?options]
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
サンプルエンドポイント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
通常、以下のようにログイン認証情報で URI を指定します(例:SMTP を使用)。
smtp://[username@]host[:port][?password=somepwd]
smtp://[username@]host[:port][?password=somepwd]
または、クエリーオプションとしてユーザー名とパスワードの両方を指定することもできます。
smtp://host[:port]?password=somepwd&username=someuser
smtp://host[:port]?password=somepwd&username=someuser
以下に例を示します。
smtp://mycompany.mailserver:30?password=tiger&username=scott
smtp://mycompany.mailserver:30?password=tiger&username=scott
デフォルトのポート リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルトのポート番号がサポートされています。ポート番号を省略すると、Camel はプロトコルに基づいて使用するポート番号を決定します。
| Protocol | デフォルトのポート番号 |
|---|---|
SMTP
|
25
|
SMTPS
|
465
|
POP3
|
110
|
POP3S
|
995
|
IMAP
|
143
|
IMAPS
|
993
|
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー | デフォルト | 説明 |
|---|---|---|
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: Registry の org.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 コンポーネントで ユーティリティーを使用する方法を示しています。
エンドポイントのプログラムによる設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
エンドポイントの Spring DSL ベースの設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
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");
from("direct:a").setHeader("subject", constant(subject)).to("smtp://james2@localhost");
recipients などの他の MimeMessage ヘッダーにも適用されるため、以下のようにヘッダープロパティー
を 使用できます。
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);
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);
複数の受信者で設定が容易になります。 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
コンマ区切りまたはセミコロンで区切られたリストを使用して、複数の受信者を設定できます。これは、ヘッダー設定とエンドポイント URI の設定の両方に適用されます。以下に例を示します。
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("to", "davsclaus@apache.org ; jstrachan@apache.org ; ningjiang@apache.org");
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("to", "davsclaus@apache.org ; jstrachan@apache.org ; ningjiang@apache.org");
上記の例では、セミコロン
; を区切り文字として使用します。
送信者名と電子メールの設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
受信者は <
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");
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");
SUN JavaMail リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SUN JavaMail は、メールの消費と生成のフーッドで使用されます。POP3 プロトコルまたは IMAP プロトコルのいずれかを使用する際に、エンドユーザーがこれらの参照を参照することが推奨されます。特に、POP3 の機能は IMAP よりも限定されている点にご留意ください。
- 一般的に MAIL フラグについて
サンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
JMS キューから受信したメッセージを電子メールとして送信する単純なルートから始めます。email アカウントは、
mymailserver.com の 管理者 アカウントです。
from("jms://queue:subscription").to("smtp://admin@mymailserver.com?password=secret");
from("jms://queue:subscription").to("smtp://admin@mymailserver.com?password=secret");
次のサンプルでは、1 分ごとに新しい電子メールのメールボックスをポーリングします。ポーリング間隔
consumer.delay を 60000 ミリ秒 = 60 秒として設定するのに特別なコンシューマーオプションを使用していることに注意してください。
from("imap://admin@mymailserver.com
password=secret&unseen=true&consumer.delay=60000")
.to("seda://mails");
from("imap://admin@mymailserver.com
password=secret&unseen=true&consumer.delay=60000")
.to("seda://mails");
この例では、複数の受信者にメールを送信します。
添付ファイルを使用したメールの送信サンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
添付ファイルはすべての Camel コンポーネントによってサポートされない
接続 API は Java アクティベーションキーフレームワークをベースとしており、一般的に Mail API でのみ使用されます。他の Camel コンポーネントの多くは添付をサポートしないため、添付がルートとともに伝播されるため、アタッチメントが失われる可能性があります。したがって、サムのルールは、メッセージをメールエンドポイントに送信する前に添付ファイルを追加することです。
mail コンポーネントは添付ファイルをサポートします。以下の例では、ロゴファイルアタッチメントのあるプレーンテキストメッセージが含まれるメールメッセージを送信します。
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");
from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
+ "&delete=false&unseen=true&consumer.delay=60000").to("log:newmail");
上記のルートは、新しいメールを 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=[...
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=[...
添付サンプルでメールの消費 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
この例では、メールボックスをポーリングし、メールからのすべての添付ファイルをファイルとして保存します。まず、メールボックスをポーリングするルートを定義します。このサンプルは 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());
from("imaps://imap.gmail.com?username=YOUR_USERNAME@gmail.com&password=YOUR_PASSWORD"
+ "&delete=false&unseen=true&consumer.delay=60000").process(new MyMailProcessor());
メールをログに記録する代わりに、java コードからのメールを処理できるプロセッサーを使用します。
ご覧のとおり、添付を処理する 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 ルートでは、以下のようにルートでこの 式 を使用する必要があります。
XML DSL を使用する場合は、以下のように Splitter でメソッド呼び出し式を宣言する必要があります。
<split> <method beanType="org.apache.camel.component.mail.SplitAttachmentsExpression"/> <to uri="mock:split"/> </split>
<split>
<method beanType="org.apache.camel.component.mail.SplitAttachmentsExpression"/>
<to uri="mock:split"/>
</split>
Camel 2.16 以降では、添付ファイルを
byte[] として分割してメッセージボディーとして保存することもできます。これは、ブール値 true で式を作成して行います。以下に例を示します。
SplitAttachmentsExpression split = SplitAttachmentsExpression(true);
SplitAttachmentsExpression split = SplitAttachmentsExpression(true);
次に、Splitter EIP で式を使用します。
カスタム SearchTerm の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.11 から利用可能
MailEndpoint で searchTerm を設定すると、不要なメールをフィルターリングできます。
たとえば、Subject または Text のいずれかに Camel が含まれるようにメールをフィルターするには、以下のように実行できます。
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subjectOrBody=Camel"/> <to uri="bean:myBean"/> </route>
<route>
<from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subjectOrBody=Camel"/>
<to uri="bean:myBean"/>
</route>
"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>
<route>
<from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.fromSentDate=now-24h"/>
<to uri="bean:myBean"/>
</route>
エンドポイント 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>
<route>
<from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm.subject=Camel&searchTerm.fromSentDate=now-24h"/>
<to uri="bean:myBean"/>
</route>
| オプション | デフォルト | 説明 |
|---|---|---|
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>
<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>
その後、以下のように Camel ルートの #beanId を使用して、この Bean を参照できます。
<route> <from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm=#mySearchTerm"/> <to uri="bean:myBean"/> </route>
<route>
<from uri="imaps://mymailseerver?username=foo&password=secret&searchTerm=#mySearchTerm"/>
<to uri="bean:myBean"/>
</route>
Java には、
org.apache.camel.component.mail. SearchTermBuilder クラスを使用して複合 SearchTerm を構築するビルダークラスがあります。これにより、次のような複雑な用語を作成できます。