

問題:
System.Net.Mail.MailAddressクラスは携帯各社が許可している、RFCに準拠しないメールアドレスを渡すことができません。
MailAddress address = new MailAddress( "test...@docomo.ne.jp" );
上記のようなメールアドレスを渡そうとするとFormatExceptionが発生してしまいます。
System.FormatException はユーザー コードによってハンドルされませんでした。
Message="指定された文字列は、電子メール アドレスに必要な形式ではありません。"
Source="System"
StackTrace:
場所 System.Net.Mime.MailBnfHelper.ReadMailAddress(String data, Int32& offset, String& displayName)
原因:
System.Net.MailAddressがRFCで定められているよりも厳しくメールアドレスの形式をチェックしているため。
実はこのようなRFC準拠していないメールアドレスであっても「"test..."@docomo.ne.jp 」とアカウント部分をエスケープすることでRFC準拠として扱えるのですが、MailAddressクラスはFormatExceptionを発生させます。
解決方法:
ASP.NET開発で携帯メールアドレスを扱うことは多々あり、「RFC非準拠アドレスにメール送信できないのは仕様です」といっても発注元が検収してくれません。
そこで、簡単な逃げ道としては.Net Framework 1.1で使われていたSystem.Web.Mailを利用する方法があります。
MailMessage msg = new MailMessage();
msg.To = "test...@docomo.ne.jp";
MailMessageクラスのToプロパティはstring型でメール形式をチェックしません。どんな文字列でも渡すことができます。また、OSが日本語環境であれば、デフォルトのエンコーディングはiso-2022-jp かつ Bエンコードになるので、特に設定せずとも各携帯キャリア対応です。
いいことずくめに思えますが、下記のような問題点があります。
- 実行環境依存が発生する
- CDOモジュールが.Netプログラマにわかり難い
- HTMLメール送信機能が不十分
- SMTP/SSLが使えない
ひとつひとつ詳しく解説します。
1 実行環境依存が発生する
System.Web.Mailのメール送信はMicrosoft CDO for Exchange 2000のモジュールを利用しているため、実行環境によって挙動が変化します。本番環境でモジュールがなくて動かない・・・ということもありえます。
アプリケーションの実行アカウント権限がCDOオブジェクトにアクセスできないとアウトです。あちらこちらの掲示板で質問があがっては未解決という状態です。
特定のVersionのVisual Studioをインストールしたり、Exchange Serverをインストール&アンインストールしていると症状がでるといった報告もあります。
2 CDOモジュールが.Netプログラマにわかり難い
この自由度の高かった1.1のSystem.Web.Mailが2.0でSystem.Net.Mailに置き換えられているのは、基本的にSystem.Web.MailはExchangeモジュールの.Net用ラッパークラスにすぎないためです。細かい制御は全て、CDOに対するメッセージを付加する必要があります。たとえば、portを25番以外に変更する場合には、MailMessageのFilesプロパティにCDOの設定をメッセージとして追加する必要があります。
msg.Fields[
"http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = 25;
また、CDOのエラーメッセージが不親切で、原因の切り出しがし難い点があります。
参考:
「CDO.Message」を作成しなかったための」エラー メッセージのトラブルシューティング方法
3 HTMLメール送信機能が不十分
msg.BodyFormat = MailFormat.Html;
上記のプロパティを設定することでHTMLメールを送信することができるのですが、機能的に不十分です。携帯のデコメール等はimgタグで指定するsrc属性を外部リソースを指定することができません。そのため、添付ファイルを表示するためにContentIdを指定したいのですが、System.Web.Mail.MailAttachmentにはContentIdを指定できません。をまた、HTMLメールを指定した際の、Textメールは自動生成なので、HTMLとTextメールをそれぞれ整形して指定できません。
参考:
DoCoMo デコメ
KDDI デコメ
SoftBank
4 SMTP/SSLが使えない
SMTP/SSLをサポートしていないようです。CDOの設定を探せばあるのかしれませんが、ドキュメントを発掘できません。SMTPAuthはサポートしているのですが、平文 or NTLM(=CRAM-MD5 )となり、ベストエフォート設定はできません。ちなみにSMIME署名はCAPICOMを使うのが常道なので、1.1、2.0いずれのVersionでもサポートしていません。
参考:
[Microsoft]System.Web.mail を使用している 有効 SMTP 認証の方法
[MSDN] リファレンス http://schemas.microsoft.com/cdo/configuration/
総括:
「入会案内程度のメールであればSystem.Web.Mailは利用に耐える」、セキュリティに執着しない顧客で、メルマガのようにHTMLメールが不要なケースであればSystem.Web.Mailでも十分です。しかし問題点1で指摘したように、テスト環境では動いてたものが、本番環境によってCDOモジュールが見つからないというエラーがでて顧客のクレームを浴びることもありえます。必ず、CDOモジュールが動作するかミニプログラムを本番サーバで動かして確認してください。
弊社ではSMTPは、System.Net.MailもSystem.Web.Mailのどちらも使うことを辞め、自前で実装したSMTPクライアントを利用しています。顧客からの要望に細かく対応できるので便利です。
[追記 2008/11/20 ] 弊社より、サブジェクト文字化けとRFC非準拠アドレスに対応したSMTPClientを公開しました。現在、β公開につき無料で利用できます。ぜひお試しください。


メッセージ送信