1. MobyletMailConfig
mobylet標準のメール設定保持クラス(MobyletMailConfig)では、SMTP認証を行う場合のプロパティ(mail.smtp.auth)の設定を行えないため、MobyletMailConfigの拡張クラスを作成します。
- /**
- * メール送信時にSMTP認証を行うように設定するための設定情報クラスです。
- *
- * @author namiki
- *
- */
- public class MyMobyletMailConfig extends MobyletMailConfig {
- /** SMTP認証設定のキーです。 */
- private static final String KEY_SMTP_AUTH = "mobylet.smtp.auth";
- /** SMTP認証の初期値です。 */
- private static final String DEF_SMTP_AUTH = "false";
- /**
- * コンストラクタです。
- */
- public MyMobyletMailConfig() {
- super();
- }
- /**
- * SMTP認証設定を取得します。
- *
- * @return SMTP認証設定
- */
- public String getSMTPAuth() {
- String smtpAuth = props.getProperty(KEY_SMTP_AUTH);
- if (StringUtils.isEmpty(smtpAuth)) {
- smtpAuth = DEF_SMTP_AUTH;
- }
- return smtpAuth;
- }
- @Override
- public Session createSession() {
- Properties sessionProperties = new Properties();
- sessionProperties.setProperty("mail.host", getHost());
- sessionProperties.setProperty("mail.smtp.host", getHost());
- sessionProperties.setProperty("mail.smtp.localhost", getHost());
- sessionProperties.setProperty("mail.smtp.port", getPort());
- sessionProperties.setProperty("mail.smtp.user", getUser());
- sessionProperties.setProperty("mail.smtp.pass", getPassword());
- sessionProperties.setProperty("mail.smtp.auth", getSMTPAuth());
- return Session.getInstance(sessionProperties);
- }
- }
2. MobyletMailInitializer
mobylet標準のコンポーネント初期化クラスであるMobyletInitializerでは、1.で作成したMailConfigクラスを生成できないので、MobyletMailInitializerの拡張クラスを作成します。
- /**
- * Mobyletでメール送信を行うためのコンポーネント初期化クラスです。
- * Mobylet標準の{@link org.mobylet.mail.initializer.MobyletMailInitializer}
- * が行う初期化処理に加えて、 SMTP認証の設定を行うクラスを初期化します。
- *
- * @author namiki
- *
- */
- public class MyMobyletMailInitializer extends MobyletMailInitializer {
- @Override
- public void initialize() {
- super.initialize();
- SingletonUtils.put(new MyMobyletMailConfig());
- }
- }
3. mobylet.mail.properties
mobyletのメール設定ファイルであるmobylet.mail.propertiesに新しいプロパティ設定を追加します。
- mobylet.smtp.host=192.168.1.1
- mobylet.smtp.port=587
- mobylet.smtp.user=sample@example.com
- mobylet.smtp.password=aaaaa
- # 新しいプロパティです。
- mobylet.smtp.auth=true
4. MobyletMessage
次にMobyletMessageを拡張します。MobyletMessageはjavax.mail.Sessionを保持していますが、アクセス修飾子がprotectedとなっているため、後述するMobyletMailerのサブクラスからアクセスできないので、アクセスできる状態にするように拡張します。
- /**
- * {@link org.mobylet.mail.message.MobyletMessage}では{@link javax.mail.Session}
- * にアクセスできないため、{@link javax.mail.Session}へのアクセスを確保するためのメッセージクラスです。
- *
- * @author namiki
- *
- */
- public class MyMobyletMessage extends MobyletMessage {
- private Session localSession;
- /**
- * コンストラクタです。
- *
- * @param toCarrier
- * キャリア情報
- * @param session
- * セッション情報
- */
- public MyMobyletMessage(Carrier toCarrier, Session session) {
- super(toCarrier, session);
- this.localSession = session;
- }
- /**
- * セッション情報を返却します。
- *
- * @return
- */
- public Session getSession() {
- return this.localSession;
- }
- }
5. MobyletMailer
実際にメールを送信するMobyletMailerの拡張クラスを作成します。MobyletMessageのサブクラスを返却するcreateMessage()と実際にメール送信を行うsend()を実装します。
- /**
- * mobyletのメール送信でSMTP認証を行うメール送信クラスです。
- *
- * @author namiki
- *
- */
- public class MyMobyletMailer extends MobyletMailer {
- /**
- * 指定された送信先アドレスをもとに、メッセージを作成します。
- *
- * @param to
- * 送信先アドレス
- * @return メッセージ
- */
- public static MyMobyletMessage createMessage(String to) {
- MailConfig config = SingletonUtils.get(MailConfig.class);
- Session session = config.createSession();
- // Carrier
- MailCarrierDetector carrierDetector = SingletonUtils
- .get(MailCarrierDetector.class);
- Carrier carrier = carrierDetector.getCarrierByAddress(to);
- // Message
- MyMobyletMessage message = new MyMobyletMessage(carrier, session);
- return (MyMobyletMessage) message.to(to);
- }
- /**
- * 指定されたメッセージをSMTP認証でメールを送信します。
- *
- * @param message
- * メッセージ
- */
- public static void sendBySMTP(MyMobyletMessage message) {
- Session session = message.getSession();
- Transport transport = null;
- try {
- transport = session.getTransport("smtp");
- transport.connect(session.getProperty("mail.smtp.host"), session
- .getProperty("mail.smtp.user"), session
- .getProperty("mail.smtp.pass"));
- transport.sendMessage(message.construct(), message
- .getAllRecipients());
- transport.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
6. 使い方
最後にこれらのクラスを使ったメール送信の方法です。
- /**
- * Mobyletの機能を利用して、メール送信を行うロジッククラスです。
- *
- * @author namiki
- *
- */
- public class MobyletMailSenderLogic {
- // ------------------------------------------------------------ [Properties]
- /** メールメッセージオブジェクトです。 */
- private MailMessageDto messageDto;
- // -------------------------------------------------------------- [Accessor]
- /**
- * @param messageDto
- * the messageDto to set
- */
- public void setMailMessageDto(MailMessageDto messageDto) {
- this.messageDto = messageDto;
- }
- // -------------------------------------------------------- [Public methods]
- public void send() {
- if (messageDto.to.length <= 0) {
- throw new RuntimeException("送信先アドレスが定義されていません。");
- }
- for (int i = 0; i < messageDto.to.length; i++) {
- MyMobyletMessage message = MyMobyletMailer
- .createMessage(messageDto.to[i]);
- MessageBody body = new MessageBody();
- body.setText(MyEmojiUtils
- .convertEmojiCharByKey(messageDto.bodyText));
- message.from(messageDto.from).subject(
- MyEmojiUtils.convertEmojiCharByKey(messageDto.subject))
- .setBody(body);
- MyMobyletMailer.sendBySMTP(message);
- }
- }
- }
上記のMailMessageDtoは送信元メールアドレス、送信先メールアドレス、件名、本文を保持するためのクラスです。MessageDto.toの数だけ処理を繰り返していますが、これは送信先のキャリアによって絵文字の文字コードを変更する必要があるためです。
以上がmobyletでSMTP認証を利用する場合の方法となります。かなり大急ぎで作ったものなので、エラーハンドリングをほとんど無視していたり、作り自体まだまだ詰めが甘いと思いますが、参考になれば幸いです。
0 件のコメント:
コメントを投稿