2010/02/19

SAStruts+Mobyletのメール送信問題点まとめ

SAStruts+mobyletという環境で、絵文字入りのメールを携帯に向けて送信する機能を作っています。
mobyletは携帯向けWebアプリ用のフレームワークですが、WebアプリはPCで閲覧されるのを前提にしているので画面はSAStrutsを利用して作成し、メール送信の部分だけmobyletを利用するようにしています。

絵文字入りメールを3キャリア(Docomo、au、SoftBank)に送った場合、携帯側では正常に絵文字が表示されますが、3キャリア以外に送った場合(Gmail)だと絵文字部分がimgタグに変換されてしまいます。この事象について調べてみた結果をまとめてみました。

まずmobyletでメール送信を行う場合は以下のような処理を行います。

// 送信先メールアドレス
MobyletMessage message = MobyletMailer.createMessage("sample@docomo.ne.jp");
MessageBody body = new MessageBody();
body.setText();
message.from("sample@example.com")
.subject()
.setBody(body);
MobyletMailer.send(message);

MobyletMailer#send()ではMobyletMessage#construct()を呼び出しており、そこからは以下のような流れで処理が呼ばれます。(テキストメールの場合)

  • MobyletMessage#construct()

  • MobyletTextMailBuilder#build()

  • MobyletTextMailBuilder#buildSimpleTextMail()

  • MobyletTextMailBuilder#buildTextPart()

  • DataHandlerUtils#getDataHandler()

  • MailEmojiUtils#convert()

  • MobyletPrintWriter#write()


このうち、MobyletPrintWriterでは、useImageEmojiという変数で絵文字を画像として扱うかという判定を行っており、このuseImageEmojiはmobylet.xmlでemojiタグが宣言されている場合にtrueとなります。useImageEmoji==trueの場合、絵文字をimgタグに置き換えるという処理が行われます。
このMobyletPrintWriterがメール送信時だけに使われているならば、判定基準を変更すれば問題なさそうですが、実際はレスポンスを書き出す処理にも使われているため、単純に変更するというのでは上手くいきません。どこかで差し替えができるのが理想ですが、そういった作りにはなっていないため、どうしようかと考え中です。

またこれは別件となりますが、mobyletではSMTP認証を行うメールを送信することができません。MobyletMailConfigでmobylet.mail.propertiesを読み込み、その値を基にjavax.mail.Sessionを生成しますが、そのSession生成時にSMTP認証を行う場合に必要なmail.smtp.authというプロパティが指定できないためです。こちらについても無理矢理ですが、MobyletMailInitializer、MobyletMailConfig、MobyletMessage、MobyletMailerの拡張クラスを作ることでSMTP認証を行うメール送信が可能となります。

追記:
メールにimgタグが埋め込まれてしまう件については、mobylet.xmlからemojiタグの宣言を削除するようにして回避しました。
そもそもemojiタグを宣言している理由としては、メールの確認画面で絵文字を表示させるのにEmojiDesigner#getImageEmoji()を呼び出しているためでしたが、このメソッドを真似たコードをユーティリティクラスに定義してそちらを使うように変更しました。

/** 画像が含まれるディレクトリのパスです。 */
private static final String IMG_PATH = "/sastruts/images/";

/** imgタグのプリフィックスです。 */
private static final String PREFIX_IMG = "
/** imgタグのサフィックスです。 */
private static final String SUFIX_IMG = "\" />";

/**
* 指定された絵文字情報をもとにimgタグを生成します。
*
* @param emoji
* 絵文字情報
* @return imgタグ
*/
public static String getImageEmoji(Emoji emoji) {
char[] codes = emoji.getCodes();
if (codes != null && codes.length == 1) {
return PREFIX_IMG + IMG_PATH
+ Integer.toHexString((int) codes[0]).toUpperCase()
+ ".gif" + SUFIX_IMG;
}
return null;
}

これで3キャリアにはそれぞれの絵文字が、それ以外のキャリアには「〓」が埋め込まれたメールが送信できるようになりました。
ただ、画像のパスが宣言されている場合に、メールにimgタグが埋め込まれるという作りは少々違うんじゃないかと思いますがどうでしょうか。

0 件のコメント:

コメントを投稿