/* ERMailDeliveryHTML.java - Camille Troillard - tuscland@mac.com */ package er.javamail; import java.util.Date; import javax.activation.DataHandler; import javax.mail.BodyPart; import javax.mail.MessagingException; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMultipart; /** * <div class="en"> * This ERMailDelivery subclass is specifically crafted for HTML messages using a WOComponent as rendering device. * </div> * * <div class="ja"> * HTML メッセージに使用する ERMailDelivery サブクラス * </div> * * @author Camille Troillard <tuscland@mac.com> */ public class ERMailDeliveryHTML extends ERMailDeliveryComponentBased { protected static Factory factory; /** Holds the HTML content */ protected String _htmlContent; /** * Plain text preamble set in top of HTML source so that non-HTML compliant mail readers can at least display this * message. */ private String _hiddenPlainTextContent; /** * <div class="en"> * Gets the current factory. If the factory is unset, sets it to the default factory. * </div> * * <div class="ja"> * カレント・ファクトリーを戻します。 * ファクトリーがセットされていない場合、デフォルト・ファクトリーが使用される * </div> * * @return <div class="en">the current factory</div> * <div class="ja">カレント・ファクトリー</div> */ public static Factory factory() { if (factory == null) factory = new DefaultFactory(); return factory; } /** * <div class="en"> * Sets the factory. * </div> * * <div class="ja"> * ファクトリーをセットします。 * </div> * * @param value <div class="en">the factory to use</div> * <div class="ja">使用されるファクトリー</div> */ public static void setFactory(Factory value) { factory = value; } public static ERMailDeliveryHTML newMailDelivery() { return factory().newHTMLMailDelivery(); } /** * <div class="en"> * Sets the Plain text preamble that will be displayed set in top of HTML source. Non-HTML compliant mail readers * can at least display this message. * </div> * * <div class="ja"> * HTML ソースの前に標準テキストをセットします。 * HTML 表示が不可能なメール・ソフトウェアでも標準テキストが表示できるようになります。 * </div> */ public void setHiddenPlainTextContent(String content) { _hiddenPlainTextContent = content; } /** * <div class="en"> * Sets the HTML content. Note that if you set the WOComponent to be used when rendering the message this content * will be ignored. * </div> * * <div class="ja"> * HTML コンテントをセットします。 * 注意:レンダリングに WOComponent を使用される場合にはこのコンテントが無視されます。 * </div> * * @param content <div class="en">HTML content to be used</div> * <div class="ja">使用される HTML コンテント</div> */ public void setHTMLContent(String content) { _htmlContent = content; } /** * <div class="en"> * Creates a new mail instance within ERMailDelivery. Sets hasHiddenPlainTextContent to false. * </div> * * <div class="ja"> * ERMailDelivery の新規メール・インスタンスを作成します。hasHiddenPlainTextContent を null にします。 * </div> */ @Override public void newMail() { super.newMail(); _hiddenPlainTextContent = null; setHTMLContent(null); } protected String htmlContent() { String htmlContent = null; if (component() != null) { htmlContent = componentContentString(); } else { htmlContent = _htmlContent; } return htmlContent; } /** * <div class="en"> * Pre-processes the mail before it gets sent. * </div> * * <div class="ja"> * メールが送信される前の前処理 * </div> * * @see ERMailDelivery#prepareMail() */ @Override protected DataHandler prepareMail() throws MessagingException { MimeMultipart multipart = null; MimeBodyPart textPart = null; MimeBodyPart htmlPart = null; mimeMessage().setSentDate(new Date()); multipart = new MimeMultipart("alternative"); // set the plain text part String textContent; if (_hiddenPlainTextContent != null) { textContent = _hiddenPlainTextContent; } else { textContent = alternativeComponentContentString(); } if (textContent != null) { textPart = new MimeBodyPart(); textPart.setText(textContent + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", charset()); multipart.addBodyPart(textPart); } // create and fill the html message part htmlPart = new MimeBodyPart(); // Set the content of the html part htmlPart.setContent(htmlContent(), "text/html; charset=\"" + charset() + "\""); // Inline attachements if (inlineAttachments().count() == 0) { multipart.addBodyPart(htmlPart); } else { // Create a "related" MimeMultipart MimeMultipart relatedMultiparts = new MimeMultipart("related"); relatedMultiparts.addBodyPart(htmlPart); // add each inline attachments to the message for (ERMailAttachment attachment : inlineAttachments()) { BodyPart bp = attachment.getBodyPart(); relatedMultiparts.addBodyPart(bp); } // Add this multipart to the main multipart as a compound BodyPart BodyPart relatedAttachmentsBodyPart = new MimeBodyPart(); relatedAttachmentsBodyPart.setDataHandler(new DataHandler(relatedMultiparts, relatedMultiparts.getContentType())); multipart.addBodyPart(relatedAttachmentsBodyPart); } return new DataHandler(multipart, multipart.getContentType()); } public static interface Factory { /** * <div class="en"> * Vends a new instance of an HTML mail delivery. * </div> * * <div class="ja"> * HTML メールの新規インスタンスを作成します。 * </div> * * @return <div class="en">a new instance</div> * <div class="ja">新規インスタンス</div> */ public ERMailDeliveryHTML newHTMLMailDelivery(); } /** * <div class="en"> * The default factory. Vends the ERMailDeliveryHTML object back. * </div> * * <div class="ja"> * デフォルト・ファクトリー * ERMailDeliveryHTML オブジェクトが戻ります。 * </div> */ public static class DefaultFactory implements Factory { public ERMailDeliveryHTML newHTMLMailDelivery() { return new ERMailDeliveryHTML(); } } }