spacer
spacer
開発者の談話室

[解決方法]【.Net】 RFC違反の携帯メアドに送信する

|

問題:

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エンコードになるので、特に設定せずとも各携帯キャリア対応です。

いいことずくめに思えますが、下記のような問題点があります。

  1. 実行環境依存が発生する
  2. CDOモジュールが.Netプログラマにわかり難い
  3. HTMLメール送信機能が不十分
  4. SMTP/SSLが使えない

ひとつひとつ詳しく解説します。

1 実行環境依存が発生する

System.Web.Mailのメール送信はMicrosoft CDO for Exchange 2000のモジュールを利用しているため、実行環境によって挙動が変化します。本番環境でモジュールがなくて動かない・・・ということもありえます。

アプリケーションの実行アカウント権限がCDOオブジェクトにアクセスできないとアウトです。あちらこちらの掲示板で質問があがっては未解決という状態です。

特定のVersionのVisual Studioをインストールしたり、Exchange Serverをインストール&アンインストールしていると症状がでるといった報告もあります。

 参考:
 [MSDN] CDO.DLL ファイルが存在しない

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を公開しました。現在、β公開につき無料で利用できます。ぜひお試しください。

RFC非準拠アドレスに対応メールライブラリ

メッセージ送信

この記事に対してのご意見をお聞かせ下さい。
頂いたメッセージは訪問者様に読みやすいよう整形したのち公開させて頂く場合がございます。
 



 
spacer
spacer