Smdn.Formats.Mimeのドキュメントとサンプルです。 ここに記載されているものはversion 0.40時点のものです。
このドキュメントは完全ではないため、ライブラリの使用方法に関する疑問やここに記載されていない事項については掲示板へどうぞ。
ライブラリの構成
アセンブリ構成
本ライブラリはいくつかのアセンブリに分かれています。
アセンブリ | 含まれる型 |
---|---|
Smdn.dll | 他のアセンブリで共通して使用される型、ユーティリティクラス、.NET Framework 4.x, 3.x互換の型など |
Smdn.Core.Standards.dll | MIMEエンコード/デコード、URLエンコード/デコード等の標準に関するクラス群 (Smdn.Net.Imap4.Client・Smdn.Net.Pop3.Clientと共用) |
Smdn.Formats.Mime.dll | MIMEメッセージのパース・デコード機能を含むクラス郡 |
本ライブラリを使用する場合は、上記アセンブリへの参照を追加してください。
主なクラス・型
本ライブラリに含まれる主な型と用途は次のとおりです。
型 | 用途 | アセンブリ |
---|---|---|
MimeMessageクラス | MIMEメッセージを読み込んでパース・デコードを行うクラス。 マルチパートメッセージでは、一つ一つのパートがMimeMessageとして分解された入れ子構造となります。 | Smdn.Formats.Mime.dll |
Mailクラス | MimeMessageクラスをラップして、From/To/Subjectなどのヘッダの参照等をより簡単に行えるようにしたクラス。 | Smdn.Formats.Mime.dll |
AttachedFileクラス | MimeMessageクラスをラップして、添付ファイルの操作をより簡単に行えるようにしたクラス。 Mail.AttachedFileプロパティから取得可能。 | Smdn.Formats.Mime.dll |
MimeHeaderNamesクラス | よく使われるヘッダ名(Content-Type等)を定数としてまとめたクラス。 | Smdn.Formats.Mime.dll |
Charsetsクラス |
廃止予定
よく使われる文字セットを定数としてまとめたクラス。 また、文字セット名から対応するSystem.Text.Encodingを検索するためのメソッドも実装しています。 |
Smdn.Formats.Mime.dll |
ContentTransferEncodingクラス | 転送エンコーディング(Content-Transfer-Encoding)でエンコードされた本文のデコードを行うためのStream/StreamReader/BinaryReaderを作成するクラス。 | Smdn.Core.Standards.dll |
MimeEncodingクラス | MIMEヘッダエンコーディング(MIME-Encoding)で文字列をエンコード・デコードするためのクラス。 | Smdn.Core.Standards.dll |
型 | 用途 | アセンブリ |
---|---|---|
MimeMessageBuilderクラス | MIMEメッセージの組立・エンコードを行うクラス。 | Smdn.Formats.Mime.dll |
MimeHeaderBuilderクラス | MIMEヘッダの組立・エンコードを行うクラス。 | Smdn.Formats.Mime.dll |
MimeFormat | メッセージ組立時の折り返し文字数・改行文字などの書式を定義するクラス。 | Smdn.Formats.Mime.dll |
型 | 用途 | アセンブリ |
---|---|---|
UUDecoderクラス | uuencodeされたデータを含むストリームからファイルをデコードして抽出するクラス。 | Smdn.Core.Standards.dll |
version 0.40時点ではSmdn.Formats.Mime.Formatting名前空間のクラスは実装・動作検証が不十分です。 また、今後のバージョンで大きな変更を行う可能性もあります。
サンプルコード
Mailクラス
メールの読み込み・解析 (Loadメソッド)
emlファイルを読み込んで件名・差出人・日付と本文を表示する例。
Mail.Loadメソッドでは、ファイルからMailのインスタンスを作成した場合、内部で開いたファイルのFileStreamを保持します。 Mailインスタンスが不要になったら、Disposeメソッドを呼び出すようにしてください。
Mail.Loadメソッドの引数loadContentToMemoryにtrueを指定すると、ファイルの内容をメモリ上に展開して保持します。 この場合FileStreamは保持しないため、必ずしもDisposeメソッドを呼ぶ必要はありません。
MimeMessage.Loadメソッドも、Mail.Loadメソッドと同様の動作となります。
文字列からの読み込み (LoadMailメソッド)
文字列(string)に格納されているメール内容からMailインスタンスを作成する場合は、Mail.LoadMailメソッドが使えます。
添付ファイルの保存 (SaveAttachedFilesToDirectoryメソッド)
emlファイルを読み込んでメールに添付されているファイルを保存する例。
上記の例で使用しているSaveAttachedFilesToDirectoryメソッドでは、添付ファイルにファイル名が設定されていない場合ライブラリがファイル名を決定します。 個々の添付ファイルのファイル名を指定したい場合は、SaveAttachedFilesAsメソッドを使うか、次の例のようにMail.AttachedFilesプロパティを参照して添付ファイルを一つずつ保存してください。
AttaachedFileクラス
メールに添付されているファイル(Mail.AttachedFiles)を一つずつ保存する例。
MimeMessageクラス
分割メールの結合 (ReassembleFragmentedMessageメソッド)
分割メール(message/partial)を結合して、結合したメッセージのMimeMessageを取得する例。 ReassembleFragmentedMessageメソッドではメールヘッダを参照して適切な順序に並び替えた上で結合するため、このメソッドに渡す配列・コレクションは結合されるべき順序で並べ替えられている必要はありません。
なお、ReassembleFragmentedMessageメソッドはインスタンスメソッドと静的メソッドでidパラメータの取り扱いで動作が異なります。 インスタンスメソッドのReassembleFragmentedMessageでは、Content-Typeヘッダのidパラメータをチェックして同一のidを持つ分割メッセージのみを順番に結合します(引数に渡されたメッセージのうち、異なるidのメッセージは無視します)。 一方、静的メソッドのReassembleFragmentedMessageではidパラメータのチェックは行わず、numberパラメータのみをチェックして順番に結合します(引数に渡されたメッセージのうち、異なるidのメッセージがある場合でも結合します)。
emlファイルの解析
emlファイルを読み込んでヘッダの一覧とボディの内容を表示する例。
ContentTransferEncodingクラス
BASE64のデコード
BASE64エンコードされたストリームのデコードを行う例。
quoted-printableのデコード
quoted-printable形式のストリームをデコードして読み込む場合は、BASE64の場合と同じコードを使い、ContentTransferEncodingMethod.Base64の代わりにContentTransferEncodingMethod.QuotedPrintableを指定するだけで出来ます。
MimeEncodingクラス
Qエンコードされた文字列のデコード・エンコード (Encode, Decode)
Qエンコードされた文字列のデコード・エンコードを行う例。
MimeEncodingMethod.QEncodingの代わりにMimeEncodingMethod.BEncodingを指定すれば、Bエンコード(BASE64)した文字列を取得出来ます。
UUDecoderクラス
uuencodeされたファイルの抽出 (ExtractFiles)
uuencodeされたファイルをデコードし、抽出したファイルを保存する例。
以下のようなコマンドでエンコードされたファイルを読み込んだ場合、カレントディレクトリに foo.zip と bar.zip が保存されます。 なお、現在の実装ではファイルに指定されているパーミッションは無視されます。
ReadContentメソッドとUUDecoder.ExtractFiles
uuencodeコマンドとmailコマンドを使って送信された、複数のファイルが添付されているメールを解析する例。
上記のようにして送信されたメールを読み込んだ場合、Mail.AttachedFileプロパティでは添付されたファイルを参照することはできません。 また、SaveContent(), ReadContentAsText(), ReadContent(Action<BinaryReader>)等のメソッドは、添付されているファイルのうち最初の一つのみしか読み込みません(この例ではfoo.zip)。 添付されている全てのファイルを読み込む必要がある場合は、ReadContent(Action<Stream>)メソッドを使ってデコードされていないストリームを取得し、そのストリームをUUDecoder.ExtractFilesメソッドに渡します。