概要
JavaMailをラップして流れるようなIFにする
内容
JavaMailをラップして流れるようなIFにしてみます。
※他のライブラリにも流用可能。
サンプルコード
インターフェース
import javax.mail.MessagingException; import javax.mail.internet.AddressException; /** * JavaMailのラッパー。 * */ public interface JavaMailWrapper { /** * メール送信. * * @throws AddressException 不正なアドレスの際に発生 * @throws MessagingException 送信エラー時に発生 */ public void send() throws AddressException, MessagingException; }
実装ソース
import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Properties; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * JavaMailのラッパークラス。 * */ public class JavaMailWrapperImpl implements JavaMailWrapper { /** Propertiesに設定するSMTPホストのキー文字列 */ private static final String MAIL_SMTP_HOST_KEY = "mail.smtp.host"; /** メール情報 */ private Mail mail = null; /** * メールデータクラスを利用してラッパークラスを初期化する. * * @param setter */ public JavaMailWrapperImpl(Mail setter) { this.mail = setter; } /** * {@inheritDoc} * * @throws MessagingException {@inheritDoc} */ @Override public void send() throws MessagingException { try { MimeMessage mimeMessage = new MimeMessage(getSession()); mimeMessage.setRecipients(MimeMessage.RecipientType.TO, mail.getToAddresses()); mimeMessage.setFrom(mail.getFromAddresses()); mimeMessage.setSubject(mail.subject); mimeMessage.setText(mail.text); Transport.send(mimeMessage); } catch (MessagingException e) { throw e; } } /** * セッション情報を取得。 * * @return セッション情報 */ private Session getSession() { Properties props = new Properties(); props.setProperty(MAIL_SMTP_HOST_KEY, mail.getSmtpHost()); Session session = Session.getDefaultInstance(props); return session; } /** * メールデータ設定クラス. * */ public static class Mail { /** SMTPサーバー */ private String smtpHost = null; /** 宛先アドレスリスト */ private InternetAddress[] toAddresses = null; /** 差出人アドレス */ private InternetAddress fromAddresses = null; /** 件名 */ private String subject = null; /** 本文 */ private String text = null; /** * SMTPサーバーを設定. * * @param smtpHost SMTPサーバー * @return Mailのインスタンス(FluentIF) */ public Mail smtpHost(String smtpHost) { this.smtpHost = smtpHost; return this; } /** * 送信先アドレスを設定. * * <pre> * 宛先アドレスと宛先名のリストを指定して宛先情報を設定する。 * 宛先アドレスと宛先名のリスト数は一致している必要がある。 * </pre> * * @param addresses 宛先アドレスリスト * @param personals 宛先名リスト * @return Mailのインスタンス(FluentIF) * @throws IllegalArgumentException 不正な引数を設定した際に発生 * @throws NullPointerException {@code addresses}か{@code personals}がnullの場合に発生 */ public Mail toAddresses(List<String> addresses, List<String> personals) { validateToAddressNull(addresses, personals); validateToAddressSize(addresses, personals); InternetAddress[] toAddresses = new InternetAddress[addresses.size()]; for (int i = 0; i < toAddresses.length; i++) { InternetAddress internetAddress = getInternetAddress(addresses.get(i), personals.get(i)); toAddresses[i] = internetAddress; } this.toAddresses = toAddresses; return this; } /** * 差出人アドレスを設定. * * @param address 宛先アドレス * @param personal 宛先名 * @return Mailのインスタンス(FluentIF) * @throws NullPointerException {@code address}か{@code personal}がnullの場合に発生 */ public Mail fromAddresses(String address, String personal) { validateFromAddressNull(address, personal); this.fromAddresses = getInternetAddress(address, personal); return this; } /** * 件名を設定. * * @param subject 件名 * @return Mailのインスタンス(FluentIF) */ public Mail subject(String subject) { this.subject = subject; return this; } /** * 本文を設定. * * @param text 本文 * @return Mailのインスタンス(FluentIF) */ public Mail text(String text) { this.text = text; return this; } /** * smtpHostを取得する. * * @return the smtpHost smtpHost */ public String getSmtpHost() { return smtpHost; } /** * toAddressesを取得する. * * @return the toAddresses toAddresses */ public InternetAddress[] getToAddresses() { return toAddresses; } /** * fromAddressesを取得する. * * @return the fromAddresses fromAddresses */ public InternetAddress getFromAddresses() { return fromAddresses; } /** * subjectを取得する. * * @return the subject subject */ public String getSubject() { return subject; } /** * textを取得する. * * @return the text text */ public String getText() { return text; } /** * 宛先情報の取得。 * * @param address 宛先アドレス * @param personal 宛先名 * @return 宛先情報 */ private InternetAddress getInternetAddress(String address, String personal) { InternetAddress internetAddress = new InternetAddress(); internetAddress.setAddress(address); internetAddress = setPersonal(personal, internetAddress); return internetAddress; } /** * 宛先名を設定する. * * @param personal 宛先名 * @param internetAddress 宛先名設定対象 * @return 宛先名設定済みのInternetAddress */ private InternetAddress setPersonal(String personal, InternetAddress internetAddress) { try { internetAddress.setPersonal(personal); return internetAddress; } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(); } } /** * toAddressのaddress,personalのサイズ整合性チェック. * * @param addresses 宛先アドレス * @param personals 宛先名 * @throws IllegalArgumentException サイズが一致しない場合に発生。 */ private void validateToAddressSize(List<String> addresses, List<String> personals) { if (addresses.size() != personals.size()) { throw new IllegalArgumentException(); } } /** * toAddressのnullチェック. * * @param addresses 宛先アドレス * @param personals 宛先名 * @throws NullPointerException {@code address}か{@code personal}がnullの場合に発生 */ private void validateToAddressNull(List<String> addresses, List<String> personals) { if (addresses == null | personals == null) { throw new NullPointerException(); } } /** * fromAddressのnullチェック. * * @param address 宛先アドレス * @param personal 宛先名 * @throws NullPointerException {@code address}か{@code personal}がnullの場合に発生 */ private void validateFromAddressNull(String address, String personal) { if (address == null | personal == null) { throw new NullPointerException(); } } } }
呼び出しサンプル
class JavaMailSample { putlic static void main(String[] args) { JavaMailWrapper javaMail = new JavaMailWrapperImpl( new Mail() .smtpHost("smtp.co.jp") .toAddresses( Arrays.asList(new String[] { "aaaa@bbb.co.jp", "bbbb@ccc.com" }), Arrays.asList(new String[] { "adress to1", "address to2" })) .fromAddresses("dddd@eeee.co.jp", "address from") .subject("件名") .text("本文1\n本文2")); // InternetAddressの作成 try { javaMail.send(); } catch (MessagingException e) { e.printStackTrace(); return null; } } }