airxmailで文字化けしますが・・・・という方いましたので、ちょっと詳しく説明することにしました。
そちらの方はご自分で解決していただけたようですが、確かにわかりにくい気もしますので・・・・
(ご報告していただいた方、ありがとうございました。)
airxmailでは、文字コードは何も設定しないと、JIS(ISO-2022-JP)に設定されます。
ただし、
if(Capabilities.language == "ja"){
return "ISO-2022-JP";
}
else{
return "UTF-8";
}
となっており、日本の環境でない(と判断された場合)には、UTF-8になる。
さらに、ただしがあり、文字コードにはairxmailでは2つある。
1つは、ヘッダの文字コードであり、(こちらは日本環境ではなければデフォルトはない。つまり、ASCII)
2つは、本文の文字コードである。
では、この設定を変更するにはどうすればいいかと言えば、
AirxMailConfig.setDefaultBodyCharset("UTF-8");
AirxMailConfig.setDefaultHeaderCharset("UTF-8");
とすることで、何も文字コードを設定していない場合には、UTF-8が使われることになる。
では、個別に文字コードを変えたい場合にはどうすればいいかと言えば、
サブジェクトの場合には
var mimeMsg:MimeMessage = new MimeMessage();
mimeMsg.setSubject("これでUTF-8になるよ","UTF-8");
本文の場合には・・・とこれがちょっとややこしい。
というか、あまりきちんと整理されていないし、こちらで細かくテストをしきれているわけではないので、
問題があるかもしれませんが・・・ので・・それでもやりたい方への一応説明。
(おかしい場所があったら、教えてくださればできるだけ対応します。)
まずは、普通のテキストメールの場合(マルチパートでない場合)には
ContentTypeのcharsetを見ます。
従って、
var mimeMsg:MimeMessage = new MimeMessage(ContentType.parseValue("text/plain; charset=Shift_JIS"));
のようにします。
ただし、これだけでは単なる文字コードがShift_JISになるだけなので、うまくいかないケースもあります。
(このあたりが電子メールの面倒なところです。できるだけ見えるようにするために多少のバグがあっても問題ないケースがあったりするのです。)
ただしくは、
var mimeMsg:MimeMessage = new MimeMessage(ContentType.parseValue("text/plain; charset=Shift_JIS"));
mimeMsg.transferEncoding = "8bit";
にしなければならないのです。
ちなみに、UTF-8にしたときには、自動的にこちらを”8bit”にしてしまいます。
(だったら、SJISとかもすればいいじゃないか・・・かな・・・)
もう一つは、テキストパートの場合です。
こちらは、MimeMessage(ただしくはその親クラスのMimeMultiPart)にcreateTextPart()というメソッドがあります。
こちらの実装が、以下のようになっています。
public function createTextPart(charset:String = null,transferEnc:String = "7bit"):MimeTextPart{
var part:MimeTextPart = new MimeTextPart();
if(charset){
part.contentType.setParameter("charset",charset);
}
part.transferEncoding = transferEnc;
this.addChildPart(part);
return part;
}
つまり、引数に文字コードを渡してもいいですし、返ってきたオブジェクトのcontentTypeのcharsetにセットしてもいいわけです。
こちらも同様に、設定した文字コードに対応するtransferEncodingを設定する必要があります。
ちなみに、文字化けするが意味がわからない。いったいどこでおかしくなってるんだ。
という方は、リビジョン53で、DirSenderというクラスを追加しました。
こちら、メールを送る代わりに、ローカルのディレクトリにファイルで書き出します。
//var sender:IMailSender = new SMTPSender(); var sender:IMailSender = new DirSender();
と、クラス名だけ変えてもらえば、それで動くようになります。
File.userDirectory.resolvePath(“airxmail”);
のディレクトリに書き出します。


