MailFluteでのにほんご

1,074 views
Skip to first unread message

mokkouyou

unread,
Jun 18, 2017, 11:53:57 PM6/18/17
to DBFluteユーザの集い
mokkouyouです

お世話になっております。

ようやくlasta触ってみました。
そこで質問なのですが、MailFluteで日本語のメールを送るにはどうしたらよいでしょう?

そんな難しいことは必要ないとは思うのですが、
ソース読んで行ったらSMailHonestPostieでContent-Transfer-Encoding: 7bit
指定しているように見受けられるのでどうしたものかな?と(iso-2022-jpの必要?とか呼んでる途中で迷子になっちゃった?)

構成ですが、
・harborをもとにシングルプロジェクト
・Mailの(mortorbike?定義)は複数用意してmain以外を利用
・DBは利用しないのでもろもろ削除

なお、元のネタのharborのテンプレートのhelloをやぁに変えてもやっぱり化けちゃったので
おそらく構成の問題ではないのかなと思うのですが

kubo

unread,
Jun 18, 2017, 11:58:23 PM6/18/17
to DBFluteユーザの集い
jfluteです

mokkouyouさん、に Lasta さわってもらえて嬉しいです!(^^

取り急ぎ...
あれ!?普通に特別なことせず日本語メールみんな飛ばしてますね。
iso-2022-jpじゃなくてUTF-8になってるというのが特徴かもですが。
ちょっとこちらでも、色々聞いて確認してみますー。

mokkouyou

unread,
Jun 19, 2017, 1:26:06 AM6/19/17
to DBFluteユーザの集い
mokkouyouです

ですよね。。。きっと何も指定しなくていいんだろうなと信じていました
※ISO-2022-JPというのは7bitにあわせてエンコードかける必要あるのかな?ということで、実際はテンプレートファイルもソースもUTF-8で試しています。
勝手なイメージとしてはcommons-emailみたいに本文の内容によって「quoted-printable」か「base64」が設定されると想像していました。

なお、
harborはhsqldbだとこけるのでmysqlに書き換えて実行しています(コメントsql削除、MemberLoginあたりのデータが入らないので削除とかはしていますが)
テンプレートをちょっとだけ変えて送ったのはこんな感じです(smtp4devで受信)※なお、ログやらだと化けてはいないです。

From: Harbor Support <harbor-...@annie.example.com>
Message-ID: <7817949.0.1497849451057@PC-NOSHIO>
Subject: =?UTF-8?Q?[Test]Welcome_to_your_sign_up,_=E3=81=9F=E3=82=8D=E3=81=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit

c c , c c
c

How are you? Thank you for signing up to Maihama!

You are now temporaly registered to the site.
Please click on the link below to become a formal member.

We hope you will enjoy your time in Maihama.
Thank you.

Regards,
Docksidestage Support Team

kubo

unread,
Jun 19, 2017, 2:27:01 AM6/19/17
to DBFluteユーザの集い
jfluteです

一応、[App]MailDeliveryDepartmentCreatorの
createDogmaticPostalPersonnel()の
SMailDogmaticPostalPersonnelのnewの中で、

@Override
protected SMailHonestPostie newMailHonestPostie(SMailPostalMotorbike
motorbike) {
return new SMailHonestPostie(motorbike) {
@Override
protected String getBasicEncoding() {
return "xxx";
}
};
}

という感じで、差し替えることができますので、
試しに iso-2022-jp とかもできます。

mokkouyou

unread,
Jun 19, 2017, 3:13:58 AM6/19/17
to DBFluteユーザの集い
mokkouyouです。

ありがとうございますー
とはいえISO-2022-JPだと使える値チェックなど必要になってしまうので、
教えていただいた拡張方法をもとに以下にする方が希望通りの挙動に近いです。
FW更新に弱くなりそうなので、うーーーんといったところですが。
※なお、お勉強レベルですのであまり急ぎではないです。

            @Override
            protected SMailHonestPostie newMailHonestPostie(SMailPostalMotorbike motorbike) {
                return new SMailHonestPostie(motorbike) {

                    @Override
                    protected MimePart setupTextPart(MimePart part, String text, TextType textType) {
                        MimePart setupTextPart = super.setupTextPart(part, text, textType);
                        try {
                            part.setHeader("Content-Transfer-Encoding", "Quoted-Printable");//親の指定したヘッダを上書き
                        } catch (MessagingException e) {}
                        return setupTextPart;
                    }

                };
            }

kubo

unread,
Jun 19, 2017, 3:19:56 AM6/19/17
to DBFluteユーザの集い
jfluteです

あとで、りふぁくたしまーーーーーーーーす

mokkouyou

unread,
Jun 19, 2017, 3:49:54 AM6/19/17
to DBFluteユーザの集い
お願いします!
※なぜみんなおくれているのか?のほうが気になりますが><

kubo

unread,
Jun 19, 2017, 11:20:51 AM6/19/17
to DBFluteユーザの集い
jfluteです

LastaFlute-0.9.9-RC2 (がMailFlute-0.5.5-RC2に依存) を公開しました。

getTextEncoding()
getTextTransferEncoding()

がオーバーライドできるようになってます。


to MailFluteで日本語メール飛ばしてるみなさま
飛んでるよーって一言でも投稿もらえるとうれしいです!

加藤健

unread,
Jun 19, 2017, 1:00:58 PM6/19/17
to DBFluteユーザの集い
お世話になっております。miyasamaです。

私もMailFluteを使っているのですが、
特に変更なく、日本語メール送信出来ております。

メールのヘッダーも同じ感じで、以下のように
Content-Transfer-Encoding: 7bit は入っているのですが、
動作が違うのが不思議ですね。。。

----- 
Message-ID: <1147063013.4.1497881521380@ip-10-0-...(省略)>
Subject: =?UTF-8?B?44CQ...(省略)...I5YaF?=
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
-----

LastaFluteのExampleを元に実装しているのですが、
変更しているところは、STARTTLSを使用しているぐらいですが、
関係は無いでしょうし。

原因分からずです;



2017年6月20日火曜日 0時20分51秒 UTC+9 jflute:

awaawa

unread,
Jun 19, 2017, 1:11:44 PM6/19/17
to DBFluteユーザの集い
awaawaです。

自分も文字化けせず、日本語メールを送信できています。

> (smtp4devで受信)※なお、ログやらだと化けてはいないです。
ということなので、smtp4dev(ダミーのSMTPサーバ)を使わず、
GMailのSMTPか、AWSのSESなどを使って、実際に送信してみるのはいかがでしょうか。
(もしお時間があれば、切り分けのために。)

2017年6月20日火曜日 2時00分58秒 UTC+9 加藤健:

mokkouyou

unread,
Jun 19, 2017, 11:36:51 PM6/19/17
to DBFluteユーザの集い
mokkouyouです。

みなさまありがとうございます。
Content-transfer-encodingがみなさん7bitということで安心しました。

さて残念ながらSESとかgmailとかつながらない環境なのでなんとも・・・なんですが、
別のFakeSMTPとかでも同様でした。

で、仕様の話になるのですが、(詳しくはないので間違っていたらすいません)

7bitを指定するとういことはまさにその通りで、7bitであることが条件になります。
むかーしのメール送信だと7bit+ISO-2022-JPで(7bitのためSJISもダメ)という時代がありました。

最近はMIME拡張でいろいろいけるのでbase64/quota-printable+UTF-8というのがあるべき?姿になります。(base64とかにすると結果として7bit)
※8bitも指定できるけど対応出来ない可能性もあるので避けるのが無難とされる?

というわけで、本来的にはまずいんじゃないかな?という気がしています。
勝手な想像ですが、賢いSMTPサーバが内容をみてうまく解釈してくれているだけじゃないか?という疑い



で、ここからはいろいろ読み解いていった結果、
他のライブラリでもこのあたりのMIMEについてはactivation.jarに任せているような。
MailFluteでも
part.setDataHandler(createDataHandler(source));

として、DataHandlerを指定していますのでそのようになっている模様。

とうわけで、
件のオーバーライドを
                    @Override
                    protected MimePart setupTextPart(MimePart part, String text, TextType textType) {
                        assertArgumentNotNull("part", part);
                        assertArgumentNotNull("text", text);
                        assertArgumentNotNull("textType", textType);
                        final String encoding = getTextEncoding();
                        final ByteBuffer buffer = prepareTextByteBuffer(text, encoding);
                        final DataSource source = prepareTextDataSource(buffer);
                        try {
                            part.setDataHandler(createDataHandler(source));
                            part.setHeader("Content-Type", "text/" + textType.code() + "; charset=\"" + encoding + "\"");
                        } catch (MessagingException e) {
                            throw new SMailMessageSettingFailureException("Failed to set headers: " + encoding, e);
                        }
                        return part;
                    }

と、super呼ばずに、かつTransferEncodingのヘッダ指定しない実装に変更したところ
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64

44KE44GCLCDjgYrjgZfjgYoKCuOBkuOCk+OBjeOBp+OBmeOBi+ODvOODvOODvOODvOODvAoKCmh0


万歳無事base64にしてくれました。
というわけで、呼ばないのが正解じゃないかなぁと。(きっとbase64とquota-printableと、7bitのままを判断してくれる)

以上よろしくお願いいたします

kubo

unread,
Jun 20, 2017, 12:50:45 AM6/20/17
to DBFluteユーザの集い
jfluteです

mokkouyouさん、詳しい情報ありがとうございます。
そこの7bitは、単なるISO-2022-JPの時代の名残なので...

> というわけで、本来的にはまずいんじゃないかな?という気がしています。
> 勝手な想像ですが、賢いSMTPサーバが内容をみてうまく解釈してくれているだけじゃないか?という疑い
その可能性大ですね。

> TransferEncoding
なるほど、そもそも呼ばなくていいのかもですね。


to miyasama, awaawaさん

時間のあるときに、LastaFlute-0.9.9-RC4 で、
日本語メールが飛ぶかどうか?どんなヘッダーになるか?
ちょっと試してもらえます?

一方で、もうちょいサクッと指定できるようにしておいたほうがいいのかな...


※変えるなら今しかないですね。

kubo

unread,
Jun 21, 2017, 10:12:35 AM6/21/17
to DBFluteユーザの集い
jfluteです

LastaFlute-0.9.9-RC7 (MailFlute-0.5.5-RC5) にて...

o Textのエンコーディング(charset)はUTF-8 ※これは今までと変わらず
o TextのContent-Transfer-Encodingは未指定 ※もともと7bit固定だった
o 添付ファイルのContent-Transfer-Encodingは未指定 ※もともとbase64固定だった

という風になっています。

もう、中途半端に固定の値は使わずSmtpサーバーの判断に任せてしまおうと。
一方で、Postieをオーバーライドしなくても、
SMailDogmaticPostalPersonnelのオーバーライドにて、
その辺を指定できるようにしています。
文字化けするような場合は、この辺を自分で調整してもらうと。

@Override
protected OptionalThing<SMailMailHeaderStrategy> createMailHeaderStrategy() {
return OptionalThing.of(new SMailMailHeaderStrategy() {
@Override
public OptionalThing<String> getTextTransferEncoding(CardView view) {
return OptionalThing.of("base64");
}
});
}

MailFluteでメール飛ばせる環境にある方は、試していただけるとうれしいです。

デフォルト値でbase64とか入れるべきかまだ迷っている段階ではあります。
ググると、Content-Transfer-Encodingを省略すると 7bit になる、
というのが多いですが、この辺はサーバーの実装次第かもですね。
いまいち、base64とか誰がどこでやってるのか?
とかまだよく仕組みをわかってないので、デフォルト値として何があるべきか?
ってのはリアルタイムで悩み中。

kubo

unread,
Jun 21, 2017, 12:17:07 PM6/21/17
to DBFluteユーザの集い
jfluteです

> LastaFlute-0.9.9-RC7 (MailFlute-0.5.5-RC5) にて...
>
> o Textのエンコーディング(charset)はUTF-8 ※これは今までと変わらず
> o TextのContent-Transfer-Encodingは未指定 ※もともと7bit固定だった
> o 添付ファイルのContent-Transfer-Encodingは未指定 ※もともとbase64固定だった
何人かの人に試してもらいました。
特に文字化けせず正常に日本語メールを受信できたそうです。
また、そのときの Content-Transfer-Encoding は base64 であると。
(mokkouyouさんの挙動と同じ)

なので、省略で特に問題なさそうではありますが、
逆に、base64デフォルトでもいいのかなと考えました。

Smtpサーバーって、ローカル、検証、本番と結構変わりやすいもので、
あっちで動いたりこっちで動かなかったりとする可能性もあり、
そのとき未指定だとよりややこしいかなと想像して、
「MailFluteのデフォルトはこれ!」ってのを決めていたほうがいいと思いました。

それが「UTF-8/base64」と。

この組み合わせで都合が悪い環境であれば、
早々にDogmaticな人事の方にMailHeaderStrategyを教えてあげて、
フィットするエンコーディング指定にしてしまえばいいと。

ということで、
LastaFlute-0.9.9-RC8 (MailFlute-0.5.5-RC6) にて、
base64をデフォルトにしました。
(添付ファイルの方も同様に: 添付の方はもとに戻したという感じ)

みなさん、これで問題なければ、週末あたりにリリースしようかなと思います。

kubo

unread,
Jul 2, 2017, 2:30:45 AM7/2/17
to DBFluteユーザの集い
jfluteです

Content-Transfer-Encoding の件、
LastaFlute-0.9.9 より、デフォルトで base64 になっています。
つまり、MailFlute は「UTF-8/base64」が基本で、
変えたいときは MailHeaderStrategy で指定するという感じになります。
Reply all
Reply to author
Forward
0 new messages