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認証を利用する場合の方法となります。かなり大急ぎで作ったものなので、エラーハンドリングをほとんど無視していたり、作り自体まだまだ詰めが甘いと思いますが、参考になれば幸いです。