はじめに
メール配信機能を実装する場合にレイアウトが結構面倒だったりしませんか?
プログラムに直に書く場合もあるかもしれませんし、Velocityエンジンなどを使用する場合もあるかもしれません。ここではXSLTを使用してメールテンプレートを実装します。言語に関わらず使用でき、レイアウト変更が比較的簡単に行うことができます。
対象読者
- メール配信機能を実装できる人。
- Javaによるサンプルですが他の言語でも流用できます。
Javaによるサンプルデータの実装
メール本文を生成するプログラムのメソッド部分です。実際にはメール配信を行う部分の実装も必要ですが、対象読者はメール配信機能を実装できる人としているため、割愛しています。また本来ならメソッドを細かく分けるべきですが、サンプルのため1つにまとめています。
private String createContent() throws Exception{ //サンプルデータ生成 //header Map header = new HashMap(); header.put( "TANTOU_NAME", "○×" ); //detail List detail = new ArrayList(); Map detail1 = new HashMap(); detail1.put( "DATE", "5月22日" ); detail1.put( "ITEM", "バナナ" ); detail1.put( "QUANTITY", "100" ); detail1.put( "PRICE", "200" ); detail1.put( "MONEY", "20,000" ); detail.add( detail1 ); Map detail2 = new HashMap(); detail2.put( "DATE", "5月23日" ); detail2.put( "ITEM", "みかん" ); detail2.put( "QUANTITY", "120" ); detail2.put( "PRICE", "50" ); detail2.put( "MONEY", "6,000" ); detail.add( detail2 ); Map detail3 = new HashMap(); detail3.put( "DATE", "5月23日" ); detail3.put( "ITEM", "バナナ" ); detail3.put( "QUANTITY", "100" ); detail3.put( "PRICE", "100" ); detail3.put( "MONEY", "10,000" ); detail.add( detail3 ); //footer Map footer = new HashMap(); footer.put( "MAIL", "hoge@sample.com" ); //xmlデータ生成(DOM) DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = dbfactory.newDocumentBuilder(); Document document = docbuilder.newDocument(); Element root = document.createElement("data"); document.appendChild(root); if( header != null ){ Element sub = document.createElement("header"); root.appendChild( sub ); for( Iterator iterator = header.entrySet().iterator(); iterator.hasNext(); ){ Map.Entry e = (Map.Entry)iterator.next(); header.get( e.getKey() ); Element key = document.createElement( (String)e.getKey() ); sub.appendChild( key ); Text text = document.createTextNode( (String)header.get( e.getKey() ) ); key.appendChild( text ); } } if( detail != null ){ for ( int i=0; i < detail.size(); i++ ){ Element sub = document.createElement("detail"); root.appendChild( sub ); Map map = (Map)detail.get(i); for( Iterator iterator =map.entrySet().iterator(); iterator.hasNext(); ){ Map.Entry e = (Map.Entry)iterator.next(); map.get( e.getKey() ); Element key = document.createElement( (String)e.getKey() ); sub.appendChild( key ); Text text = document.createTextNode( (String)map.get( e.getKey() ) ); key.appendChild( text ); } } } if( footer != null ){ Element sub = document.createElement("footer"); root.appendChild( sub ); for( Iterator iterator =footer.entrySet().iterator(); iterator.hasNext(); ){ Map.Entry e = (Map.Entry)iterator.next(); footer.get( e.getKey() ); Element key = document.createElement( (String)e.getKey() ); sub.appendChild( key ); Text text = document.createTextNode( (String)footer.get( e.getKey() ) ); key.appendChild( text ); } } //XSLTファイル取得 String sXsl = "file:///sample01.xsl"; StringWriter sw = new StringWriter(); StreamResult sr = new StreamResult( sw ); TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer transformer = tfactory.newTransformer( new StreamSource( sXsl ) ); transformer.transform( new DOMSource(document), sr ); String result = StringUtils.remove( sw.toString(), "\r" ); return result; }
次ページよりソースコードの解説を行います。