久々にハマった
.NETでメール送信するときは MailMessage というクラスを部分的に使うのですが、こいつは日本語環境で文字化けしやすいという問題を抱えていました
この問題については "MailMessage 文字化け" などでググると山ほど出てきます
今回はこの問題ではなく .NET Framework 4.5からMailMessageクラスの挙動が変更された ということに起因します
.NET Frameworkの4.0と4.5は共存できない
.NET Frameworkの4.5をインストールすると4.0は勝手にアンインストールされてしまいます
4.5がインストールされているマシンだと、コンパイル時の対象フレームワークに4.0を指定しても実際使用されるのは4.5のアセンブリです
また、Environment.Version を使ってインストールされているVerを判定することはできません(4.5でも “4.0.30319” が返る)。これは、4.5のアセンブリVerが4.0と同じであるためです
インストールされているVerを判定するには
StackOverflow のエラい人によると、下記のようにすればインストールされているVerが4.0以下なのか、4.5以上なのか判定することができるようです
public static bool IsNet45OrNewer() {
return Type.GetType("System.Reflection.ReflectionContext", false) != null;
}ReflectionContext クラスは4.5以上にしか存在しないので、4.5以上だと true が返るという塩梅です。スマートですね~
毎回判定してるとパフォーマンスがよろしくないので静的変数に切り出してしまうのが良いでしょう(2つ目のfalseは省略可能です)
public static readonly bool IsNet45OrNewer =
Type.GetType("System.Reflection.ReflectionContext") != null;
コード例
// Bエンコード処理
private String BEncode(String text, Encoding encoding) {
var bytes = encoding.GetBytes(text);
text = Convert.ToBase64String(bytes);
return String.Format("=?{0}?B?{1}?=", encoding.HeaderName, text);
}
// メール送信処理
private void SendMail() {
var encoding = Encoding.GetEncoding("ISO-2022-JP");
var subject = "件名です";
if (IsNet45OrNewer) {
// .NET Framework4.5以上だと二重でBエンコードする
subject = BEncode(subject, encoding);
}
using (var mail = new MailMessage()) {
mail.Subject = BEncode(subject, encoding);
// 以降、メール送信処理(ry
}
}
.NET Frameworkの4.0と4.5は完全互換ではない
今回のケースはまさに↓の記事にあるとおりの内容でした
おそらくこのような互換性の問題はかなりレアではあるものの、MailMessageクラスの変更は結構影響が大きそうな気がします
ちなみに MS公式の4.0→4.5の互換性 のページにもMailMessageクラスの変更は載っていません
思ってたよりザルですね…
そもそもMailMessageクラスは日本語環境だと問題が発生しやすいので、Tokiさんが公開されている TKMP というライブラリを使わさせていただくのも手です





4件のコメント
#01
megane
お疲れ様です。
先週、しばらくアクセスできへんなぁ~と思ってましたww
先週は、プライベートな都合により有給とりまくりで
実家に寄せていたので、なにかネタあるかな~って思って。
#02
管理人
有給いっぱい取れるんだったらまだ会社としては良さそうですね
以前に勤めていたある会社では有給+休出の代休で40日以上ありましたが、退職時の買い取りもなくうやむやにされてしまいました
トラが開幕3連勝。奇跡ですね
#03
megane
休みを取らせてくれるのは本当に今の職場の人たちはありがたいです。
正直、有給を全部消化しろ的な労組が強いわけではないけど、
自分の周りは専門職だから、そこんところはドライですよね。
阪神、どないしたんですかねぇ…
でも、開幕戦は負けるかと思いました。
#04
管理人
エンジニアのための時間管理術 という本にこう書いてありました
自分も同意見です。megane氏の会社は健全そうですが、会社に休暇を取ることがはばかられる雰囲気が漂っているのであれば本当に残念なことです