第20章 電子メール
Seam には電子メールの送信およびテンプレート作成用のオプションコンポーネントが含まれています。
電子メールのサポートは
jboss-seam-mail.jar により提供されます。 この JAR にはメールの作成に使用されるメール JSF コントロール、および mailSession マネージャコンポーネントが含まれます。
電子メールサポートのデモが Seam にありますので、
examples/mail プロジェクトをご覧ください。 正しいパッケージの方法を示すデモ、 および現在対応している主要な機能が数点含まれています。
Seam の統合テスト環境で電子メールのシステムをテストすることができます。 「Seam メールの統合テスト」 を参照してください。
20.1. メッセージの作成 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Seam は Facelets を使用して電子メールのテンプレートを作成します。
<m:message xmlns="http://www.w3.org/1999/xhtml"
xmlns:m="http://jboss.com/products/seam/mail"
xmlns:h="http://java.sun.com/jsf/html">
<m:from name="Peter" address="peter@example.com" />
<m:to name="#{person.firstname} #{person.lastname}">
#{person.address}
</m:to>
<m:subject>Try out Seam!</m:subject>
<m:body>
<p><h:outputText value="Dear #{person.firstname}" />,</p>
<p>You can try out Seam by visiting
<a href="http://labs.jboss.com/jbossseam">
http://labs.jboss.com/jbossseam
</a>.
</p>
<p>Regards,</p>
<p>Pete</p>
</m:body>
</m:message>
<m:message> タグはメッセージ全体を囲み、 Seam に電子メールのレンダリングを開始するよう指示します。 <m:message> タグ内では、 メッセージの送信者の指定に <m:from> タグ、 受信者の指定に <m:to> タグ、さらに <m:subject> タグを使用します (EL は通常の Facelets にあるためそれが使用される点に注意してください)。
<m:body> タグは電子メールの本文を囲みます。 HTML 正規タグを本文内や JSF コンポーネント内に使用することができます。
m:message がレンダリングされると、 mailSession が電子メールを送信するよう呼び出されます。 電子メールを送信するには Seam にそのビューをレンダリングするよう指示します。
@In(create=true)
private Renderer renderer;
public void send() {
try {
renderer.render("/simple.xhtml");
facesMessages.add("Email sent successfully");
} catch (Exception e) {
facesMessages.add("Email sending failed: " + e.getMessage());
}
}
たとえば、 無効な電子メールアドレスを入力すると例外が送出され、その例外はキャッチされユーザーに表示します。
20.1.1. 添付ファイル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Seam はファイルの処理に関してほとんどの Java の標準タイプに対応するため、 電子メールへのファイルの添付は簡単です。
たとえば、
jboss-seam-mail.jar を送信するには
<m:attachment value="/WEB-INF/lib/jboss-seam-mail.jar"/>
Seam はファイルをクラスパスからロードして電子メールにそれを添付します。 デフォルトでは、
jboss-seam-mail.jar という名前で添付されますが、 fileName 属性を追加して編集すると添付ファイルの名前を変更することができます。
<m:attachment value="/WEB-INF/lib/jboss-seam-mail.jar"
fileName="this-is-so-cool.jar"/>
java.io.File、 java.net.URL を添付することもできます。
<m:attachment value="#{numbers}"/>
または、
byte[] あるいは java.io.InputStream
<m:attachment value="#{person.photo}" contentType="image/png"/>
byte[] や java.io.InputStream には添付ファイルの MIME タイプを指定する必要があります。 この情報はファイルの一部とはならないためです。
通常のタグの前後を
<m:attachment> タグで囲むことで、Seam 生成の PDF や標準の JSF ビューを添付することができます。
<m:attachment fileName="tiny.pdf">
<p:document>
A very tiny PDF
</p:document>
</m:attachment>
複数のファイル一式を添付する場合 — 例えばデータベースからロードした複数の写真一式など —
<ui:repeat> を使うことができます。
<ui:repeat value="#{people}" var="person">
<m:attachment value="#{person.photo}" contentType="image/jpeg"
fileName="#{person.firstname}_#{person.lastname}.jpg"/>
</ui:repeat>
添付したイメージをインラインで表示させるには
<m:attachment value="#{person.photo}" contentType="image/jpeg"
fileName="#{person.firstname}_#{person.lastname}.jpg"
status="personPhoto" disposition="inline" />
<img src="cid:#{personPhoto.contentId}" />
cid:#{...} タグはイメージ検索が試行されたときに添付ファイルの検査が行われるよう指定します。 cid — Content-ID — が一致しなければなりません。
ステータスオブジェクトにアクセスする前に、添付ファイルを宣言しなければいけません。
20.1.2. HTML /Text 代替部分 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ほとんどのメールリーダーは HTML に対応していますが、一部でサポートしていないメールリーダーもあります。 メール本文にプレーンテキストを入れることができます。
<m:body>
<f:facet name="alternative">
Sorry, your email reader can't show our fancy email. Please go to
http://labs.jboss.com/jbossseam to explore Seam.
</f:facet>
</m:body>
20.1.3. 複数の受信者 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
登録ユーザーなど、 複数の受信者で構成されるグループに電子メールを送信したいことがよくあります。 すべての受信者のメールタグを
<ui:repeat> の中に置くことができます。
<ui:repeat value="#{allUsers} var="user">
<m:to name="#{user.firstname} #{user.lastname}"
address="#{user.emailAddress}"/>
</ui:repeat>
20.1.4. 複数のメッセージ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
パスワードのリセットなど、 若干異なる内容のメッセージを各受信者に送信する必要がある場合もあります。 最適な方法としては、 メッセージ全体を
<ui:repeat> 内に配置することです。
<ui:repeat value="#{people}" var="p">
<m:message>
<m:from name="#{person.firstname} #{person.lastname}">
#{person.address}
</m:from>
<m:to name="#{p.firstname}">#{p.address}</m:to>
...
</m:message>
</ui:repeat>
20.1.5. テンプレートの作成 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
メールテンプレートのサンプルでは Facelets のテンプレートが Seam のメールタグと動作することを示しています。
template.xhtml には次の内容が含まれています。
<m:message>
<m:from name="Seam" address="do-not-reply@jboss.com" />
<m:to name="#{person.firstname} #{person.lastname}">
#{person.address}
</m:to>
<m:subject>#{subject}</m:subject>
<m:body>
<html>
<body>
<ui:insert name="body">
This is the default body, specified by the template.
</ui:insert>
</body>
</html>
</m:body>
</m:message>
templating.xhtml には次の内容が含まれています。
<ui:param name="subject" value="Templating with Seam Mail"/>
<ui:define name="body">
<p>
This example demonstrates that you can easily use
<i>facelets templating</i> in email!
</p>
</ui:define>
電子メールには Facelets のソースタグも使用できます。 ソースタグは
WEB-INF/lib の JAR ファイルに入れて置く必要があります。 Seam Mail を使用する場合は web.xml からの .taglib.xml の参照は信頼性に欠けるためです (非同期でメールを送信すると Seam Mail は JSF あるいは Servelt コンテキストにアクセスできないため、 web.xml の設定パラメータを認識しません)。
メール送信時にさらに Facelets や JSF の設定を行うためには、 Renderer コンポーネントを上書きしてプログラム的に設定を行う必要があります。これは上級ユーザーのみ行うようにしてください。
20.1.6. 国際化 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Seam は国際化メッセージの送信に対応しています。デフォルトでは、 JSF によるエンコーディングが使用されますが、 テンプレートで上書きすることができます。
<m:message charset="UTF-8">
...
</m:message>
本文、 件名、 受信者名および送信者名はコード化されます。 テンプレートのエンコーディングを設定して、 Facelets にページの解析をする際に必ず正しい文字セットを使用させるようにする必要があります。
<?xml version="1.0" encoding="UTF-8"?>
20.1.7. その他のヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Seam は電子メールのヘッダーにもサポートを提供しています (「タグ」参照)。電子メールの重要度を設定し、受信者の受け取り確認を求めることができます。
<m:message xmlns:m="http://jboss.com/products/seam/mail"
importance="low" requestReadReceipt="true"/>
または、
<m:header> タグを使うとメッセージにあらゆるヘッダーを追加することができます。
<m:header name="X-Sent-From" value="JBoss Seam"/>