2010/02/19

mobyletでSMTP認証を利用する

前回の記事でmobyletではSMTP認証を利用したメール送信ができないと書きましたが、いくつかのクラスを拡張することによってSMTP認証の利用は可能となります。その方法についてまとめてみました。

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 件のコメント:

コメントを投稿