Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Collections
Imports System.Collections.Specialized
Imports System.Net.Sockets
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Threading
Imports System.Diagnostics

Namespace nMail

    ''' <summary>
    ''' nMail.DLL からエラーが返ってきた場合に発生する例外
    ''' </summary>
    Class nMailException
        Inherits ApplicationException

        Private _error_code As Integer

        ''' <summary>
        ''' エラーメッセージとエラーコードを指定して、<c>nMailException</c>クラスの新しいインスタンスを初期化します。
        ''' </summary>
        ''' <param name="message"></param>
        ''' <param name="error_code"></param>
        Public Sub New(ByVal message As String, ByVal error_code As Integer)
            MyBase.New(message)
            _error_code = error_code
        End Sub

        ''' <summary>
        ''' エラーコードです。
        ''' </summary>
        Public ReadOnly Property ErrorCode() As Integer
            Get
                Return _error_code
            End Get
        End Property

        ''' <summary>
        ''' サーバーから返されたエラーメッセージです。
        ''' </summary>
        Public Overrides ReadOnly Property Message() As String
            Get
                Return MyBase.Message
            End Get
        End Property

    End Class

    ''' <summary>
    ''' Winsock 関連クラス
    ''' </summary>
    Class Winsock

        ''' <summary>
        ''' Winsock を初期化します。
        ''' </summary>
        <DllImport("nMail.DLL", EntryPoint:="NMailInitializeWinSock")> _
        Public Shared Function Initialize() As Boolean
        End Function

        ''' <summary>
        ''' Winsock の使用を終了します。
        ''' </summary>
        <DllImport("nMail.DLL", EntryPoint:="NMailEndWinSock")> _
        Public Shared Function Done() As Boolean
        End Function

    End Class

    ''' <summary>
    ''' POP3メール受信クラス
    ''' </summary>
    Class Pop3
        Implements IDisposable

        ''' <summary>
        ''' ヘッダ領域のサイズです。
        ''' </summary>
        Protected Const HeaderSize As Integer = 32768
        ''' <summary>
        ''' パス文字列のサイズです。
        ''' </summary>
        Protected Const MaxPath As Integer = 32768
        ''' <summary>
        ''' 拡張機能用バッファサイズです。
        ''' </summary>
        Protected Const AttachmentTempSize As Integer = 2000

        ''' <summary>
        ''' ソケットエラーもしくは未接続状態です。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Connect"/>を呼び出さずに<see cref="GetMail"/>等を、</para>
        ''' <para>呼び出したり、なんらかの理由で接続が切断されるとこのエラーとなります。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorSocket As Integer = -1
        ''' <summary>
        ''' 認証エラーです。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Authenticate"/>呼び出しで認証に失敗した場合</para>
        ''' <para>このエラーとなります。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorAuthenticate As Integer = -2
        ''' <summary>
        ''' 番号で指定されたメールが存在しません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>で指定した番号のメールが存在しないとこのエラーとなります。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorInvalidNo As Integer = -3
        ''' <summary>
        ''' タイムアウトエラーです。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Options.Timeout"/>で指定した値より長い時間サーバから応答が</para>
        ''' <para>ない場合、このエラーが発生します。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorTimeout As Integer = -4
        ''' <summary>
        ''' 添付ファイルが開けません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Path"/>で指定したフォルダに添付ファイルが書き込めない</para>
        ''' <para>ない場合、このエラーが発生します。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorFileOpen As Integer = -5
        ''' <summary>
        ''' 分割ファイルがそろっていません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Flag"/>に<see cref="PartialAttachmentFile"/> を設定して</para>
        ''' <para><see cref="GetMail"/>を呼び出した際に、サーバ上に分割されたメールがすべて</para>
        ''' <para>揃っていない場合にこのエラーが発生します。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorPartial As Integer = -6
        ''' <summary>
        ''' 添付ファイルと同名のファイルがフォルダに存在します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="nMail.Options.AlreadyFile"/> に <see cref="nMail.Options.FileAlreadyError"/></para>
        ''' <para>を設定し、<see cref="Path"/>で指定したフォルダに添付ファイルと同じ名前のファイルが</para>
        ''' <para>ある場合にこのエラーが発生します。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorFileAlready As Integer = -7
        ''' <summary>
        ''' メモリ確保エラーです。
        ''' </summary>
        ''' <remarks>
        ''' 内部で文字コードを変換するためのメモリを確保できませんでした。
        ''' </remarks>
        Public Const ErrorMemory As Integer = -9
        ''' <summary>
        ''' その他のエラーです。
        ''' </summary>
        Public Const ErrorEtc As Integer = -10
        ''' <summary>
        ''' 添付ファイル受信中でまだ残りがある状態です。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Flag"/>に<see cref="SuspendAttachmentFile"/>または</para>
        ''' <para><see cref="SuspendNext"/>を指定し<see cref="GetMail"/></para>
        ''' <para>を呼び出した場合、まだメールの残りがある場合、<see cref="nMailException.ErrorCode"/></para>
        ''' <para>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorSuspEndAttachmentFile As Integer = -20
        ''' <summary>
        ''' 添付ファイルは存在しません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetAttachmentFileStatus"/> 実行後、添付ファイルが存在しない場合に</para>
        ''' <para><see cref="PartNo"/> に設定されます。</para>
        ''' </remarks>
        Public Const NoAttachmentFile As Integer = -1
        ''' <summary>
        ''' 添付ファイルは存在しますが、分割されていません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetAttachmentFileStatus"/> 実行後、添付ファイルが存在しない場合に</para>
        ''' <para><see cref="PartNo"/> に設定されます。</para>
        ''' </remarks>
        Public Const AttachmentFile As Integer = 0
        ''' <summary>
        ''' 実行成功
        ''' </summary>
        ''' <para>各種メソッドが成功を返した場合、<see cref="nMailException.ErrorCode"/>に設定される値です。</para>
        Public Const Success As Integer = 1
        ''' <summary>
        ''' POP3 通常認証です。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const AuthNormal As Integer = 0
        ''' <summary>
        ''' APOP 認証を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const AuthAPop As Integer = 1
        ''' <summary>
        ''' OAUTH2 認証を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const AuthOAuth2 As Integer = 16
        ''' <summary>
        ''' 分割された添付ファイルを取得します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const PartialAttachmentFile As Integer = 1
        ''' <summary>
        ''' メール本文のみ取得します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const TextOnly As Integer = 2
        ''' <summary>
        ''' 添付ファイル受信で一時休止ありの一回目に指定します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const SuspendAttachmentFile As Integer = 4
        ''' <summary>
        ''' 添付ファイル受信で一時休止ありの二回目以降に指定します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const SuspendNext As Integer = 8
        ''' <summary>
        ''' UIDL をすべて取得します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="GetUidl"/>で指定することによって全ての UIDL を取得できます。
        ''' </remarks>
        Public Const UidlAll As Integer = 0
        ''' <summary>
        ''' SSLv3 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const SSL3 As Integer = &H1000
        ''' <summary>
        ''' TSLv1 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1 As Integer = &H2000
        ''' <summary>
        ''' STARTTLS を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const STARTTLS As Integer = &H4000
        ''' <summary>
        ''' TSLv1.2 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1_2 As Integer = &H10000
        ''' <summary>
        ''' TSLv1.3 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1_3 As Integer = &H20000
        ''' <summary>
        ''' サーバ証明書が期限切れでもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const IgnoreNotTimeValid As Integer = &H800
        ''' <summary>
        ''' ルート証明書が無効でもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const AllowUnknownCA As Integer = &H400
        ''' <summary>
        ''' Common Name が一致しなくてもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const IgnoreInvalidName As Integer = &H40
        ''' <summary>
        ''' POP3 の標準ポート番号です
        ''' </summary>
        Public Const StandardPortNo As Integer = 110
        ''' <summary>
        ''' POP3 over SSL のポート番号です
        ''' </summary>
        Public Const StandardSslPortNo As Integer = 995

        ''' <summary>
        ''' POP3 ポート番号です。
        ''' </summary>
        Protected _port As Integer = 110
        ''' <summary>
        ''' ソケットハンドルです。
        ''' </summary>
        Protected _socket As IntPtr = IntPtr.op_Explicit(ErrorSocket)
        ''' <summary>
        ''' メール数です。
        ''' </summary>
        Protected _count As Integer = -1
        ''' <summary>
        ''' メールサイズです。
        ''' </summary>
        Protected _size As Integer = -1
        ''' <summary>
        ''' ヘッダーサイズです。
        ''' </summary>
        Protected _header_size As Integer = -1
        ''' <summary>
        ''' 本文のサイズです。
        ''' </summary>
        Protected _body_size As Integer = -1
        ''' <summary>
        ''' メール受信時の設定用フラグです。
        ''' </summary>
        Protected _flag As Integer = 0
        ''' <summary>
        ''' 分割ファイル番号です。
        ''' </summary>
        Protected _part_no As Integer = -1
        ''' <summary>
        ''' エラー番号です。
        ''' </summary>
        Protected _err As Integer
        ''' <summary>
        ''' 認証方法です。
        ''' </summary>
	Protected _mode As Integer = AuthNormal
        ''' <summary>
        ''' POP3 サーバ名です。
        ''' </summary>
        Protected _host As String = ""
        ''' <summary>
        ''' POP3 ユーザー名です。
        ''' </summary>
        Protected _id As String = ""
        ''' <summary>
        ''' POP3 パスワードです。
        ''' </summary>
        Protected _password As String = ""
        ''' <summary>
        ''' 添付ファイル保存用のパスです。
        ''' </summary>
        Protected _path As String = Nothing
        ''' <summary>
        ''' ヘッダフィールド名です。
        ''' </summary>
        Protected _field_name As String = ""
        ''' <summary>
        ''' 本文格納バッファです。
        ''' </summary>
        Protected _body As StringBuilder
        ''' <summary>
        ''' 件名格納バッファです。
        ''' </summary>
        Protected _subject As StringBuilder
        ''' <summary>
        ''' 日付文字列保存バッファです。
        ''' </summary>
        Protected _date As StringBuilder
        ''' <summary>
        ''' 差出人格納バッファです。
        ''' </summary>
        Protected _from As StringBuilder
        ''' <summary>
        ''' ヘッダ格納バッファです。
        ''' </summary>
        Protected _header As StringBuilder
        ''' <summary>
        ''' 添付ファイル名格納バッファです。
        ''' </summary>
        Protected _filename As StringBuilder
        ''' <summary>
        ''' 添付ファイル名のリストです。
        ''' </summary>
        Protected _filename_list As String() = Nothing
        ''' <summary>
        ''' ヘッダフィールド内容格納バッファです。
        ''' </summary>
        Protected _field As StringBuilder
        ''' <summary>
        ''' 分割ファイルの ID です。
        ''' </summary>
        Protected _part_id As StringBuilder
        ''' <summary>
        ''' UIDL 格納バッファです。
        ''' </summary>
        Protected _uidl As StringBuilder
        ''' <summary>
        ''' Dispose 処理を行ったかどうかのフラグです。
        ''' </summary>
        Protected _disposed As Boolean = False
        ''' <summary>
        ''' HTML パートを保存したファイルの名前です。
        ''' </summary>
        Protected _html_file As StringBuilder
        ''' <summary>
        ''' SSL 設定フラグです。
        ''' </summary>
        Protected _ssl As Integer = 0
        ''' <summary>
        ''' SSL クライアント証明書名です。
        ''' </summary>
        Protected _cert_name As String = Nothing
        ''' <summary>
        ''' message/rfc822 パートを保存したファイルの名前です。
        ''' </summary>
        Protected _rfc822_file As StringBuilder

        ''' <summary>
        ''' <c>Pop3</c>クラスの新規インスタンスを初期化します。
        ''' </summary>
        Public Sub New()
            Init()
        End Sub

        ''' <summary>
        ''' <c>Pop3</c>クラスの新規インスタンスを初期化します。
        ''' <param name="host">POP3 サーバー名</param>
        ''' </summary>
        Public Sub New(ByVal host As String)
            Init()
            _host = host
        End Sub

        Protected Overrides Sub Finalize()
            MyBase.Finalize()
            Dispose(False)
        End Sub

        ''' <summary>
        ''' <see cref="Pop3"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        Overridable Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        ''' <summary>
        ''' <see cref="Pop3"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        ''' <param name="disposing">
        ''' マネージリソースとアンマネージリソースの両方を解放する場合は<c>true</c>。
        ''' アンマネージリソースだけを解放する場合は<c>false</c>。
        ''' </param>
        Protected Overloads Sub Dispose(ByVal disposing As Boolean)
            If Not _disposed Then
                If disposing Then
                End If
                If Not _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                    Pop3Close(_socket)
                    _socket = IntPtr.op_Explicit(ErrorSocket)
                End If
                _disposed = True
            End If
        End Sub

        ''' <summary>
        ''' 初期化処理です。
        ''' </summary>
        Protected Sub Init()
        End Sub

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3ConnectPortNo", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3ConnectPortNo(ByVal Host As String, ByVal Port As Integer) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3ConnectSsl", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3ConnectSsl(ByVal Host As String, ByVal Port As Integer, ByVal Flag As Integer, ByVal Name As String) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3Close")> _
        Protected Shared Function Pop3Close(ByVal Socket As IntPtr) As Boolean
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3AuthenticateMode", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3Authenticate(ByVal Socket As IntPtr, ByVal Id As String, ByVal Pass As String, ByVal Mode As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3GetMailStatus", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3GetMailStatus(ByVal Socket As IntPtr, ByVal No As Integer, ByVal Subject As StringBuilder, ByVal DateStr As StringBuilder, ByVal From As StringBuilder, ByVal Header As StringBuilder, ByVal SizeFlag As Boolean) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3GetMailSize")> _
        Protected Shared Function Pop3GetMailSize(ByVal Socket As IntPtr, ByVal No As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3GetMail", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3GetMail(ByVal Socket As IntPtr, ByVal No As Integer, ByVal Subject As StringBuilder, ByVal DateStr As StringBuilder, ByVal From As StringBuilder, ByVal Header As StringBuilder, ByVal Body As StringBuilder, ByVal Path As String, ByVal FileName As StringBuilder) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3GetMailEx", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3GetMailEx(ByVal Socket As IntPtr, ByVal No As Integer, ByVal Subject As StringBuilder, ByVal DateStr As StringBuilder, ByVal From As StringBuilder, ByVal Header As StringBuilder, ByVal Body As StringBuilder, ByVal Path As String, ByVal FileName As StringBuilder, ByVal Temp As IntPtr, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3DeleteMail")> _
        Protected Shared Function Pop3DeleteMail(ByVal Socket As IntPtr, ByVal No As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailGetHeaderField", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3GetHeaderField(ByVal Field As StringBuilder, ByVal Header As String, ByVal Name As String, ByVal Size As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3GetUidl", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3GetUidl(ByVal Socket As IntPtr, ByVal No As Integer, ByVal Id As StringBuilder, ByVal Max As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailPop3GetAttachmentFileStatus", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3GetAttachmentFileStatus(ByVal Socket As IntPtr, ByVal No As Integer, ByVal Id As StringBuilder, ByVal Max As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailDecodeHeaderField", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3DecodeHeaderField(ByVal Dst As StringBuilder, ByVal Src As String, ByVal Size As Integer) As Integer
        End Function

        ''' <summary>
        ''' ヘッダ格納用バッファのサイズを決定します。
        ''' </summary>
        Protected Sub SetHeaderSize()
            If _header_size < 0 Then
                _header_size = Options.HeaderMax
            End If
            If _header_size <= 0 Then
                _header_size = HeaderSize
                Options.HeaderMax = _header_size
            End If
        End Sub

        ''' <summary>
        ''' POP3 サーバに接続します。
        ''' </summary>
        ''' <remarks>
        ''' POP3 サーバに接続します。
        ''' </remarks>
        Public Sub Connect()
            If (_port < 0) Or (_port > 65536) Then
                Throw New ArgumentOutOfRangeException
            End If
            _socket = Pop3ConnectSsl(_host, _port, _ssl, _cert_name)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                _err = ErrorSocket
                _socket = IntPtr.op_Explicit(ErrorSocket)
                Throw New nMailException("Connect", _err)
            End If
        End Sub

        ''' <summary>
        ''' POP3 サーバに接続します。
        ''' </summary>
        ''' <param name="host_name">POP3 サーバー名</param>
        ''' <remarks>
        ''' POP3 サーバに接続します。
        ''' </remarks>
        Public Sub Connect(ByVal host_name As String)
            _host = host_name
            Connect()
        End Sub

        ''' <summary>
        ''' POP3 サーバに接続します。
        ''' </summary>
        ''' <param name="host_name">POP3 サーバ名</param>
        ''' <param name="port_no">ポート番号</param>
        ''' <remarks>
        ''' POP3 サーバに接続します。
        ''' </remarks>
        Public Sub Connect(ByVal host_name As String, ByVal port_no As Integer)
            _host = host_name
            _port = port_no
            Connect()
        End Sub

        ''' <summary>
        ''' POP3 サーバに接続します。
        ''' </summary>
        ''' <param name="port_no">ポート番号</param>
        ''' <remarks>
        ''' POP3 サーバに接続します。
        ''' </remarks>
        Public Sub Connect(ByVal port_no As Integer)
            _port = port_no
            Connect()
        End Sub

        ''' <summary>
        ''' POP3 サーバとの接続を終了します。
        ''' </summary>
        Public Sub Close()
            If Not _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Pop3Close(_socket)
            End If
            _socket = IntPtr.op_Explicit(ErrorSocket)
        End Sub

        ''' <summary>
        ''' POP3 サーバ認証を行います。
        ''' </summary>
        ''' <remarks>
        ''' POP3 サーバ認証を行います。
        ''' </remarks>
        ''' <param name="id_str">POP3 ユーザー ID</param>
        ''' <param name="pass_str">POP3 パスワード</param>
        Public Sub Authenticate(ByVal id_str As String, ByVal pass_str As String)
            If (id_str = "") Or (pass_str = "") Then
                Throw New FormatException
            End If
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _id = id_str
            _password = pass_str
            _body_size = -1
            _count = Pop3Authenticate(_socket, _id, _password, _mode)
            If _count < 0 Then
                _err = _count
                Throw New nMailException("Authenticate:" + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' POP3 サーバ認証を行います。
        ''' </summary>
        ''' <remarks>
        ''' POP3 サーバ認証を行います。
        ''' </remarks>
        ''' <param name="id_str">POP3 ユーザー ID</param>
        ''' <param name="pass_str">POP3 パスワード</param>
        ''' <param name="apop_flag">APOP を使用するか</param>
        Public Sub Authenticate(ByVal id_str As String, ByVal pass_str As String, ByVal apop_flag As Boolean)
            If apop_flag Then
                _mode = AuthAPop
            Else
                _mode = AuthNormal
            End If
            Authenticate(id_str, pass_str)
        End Sub

        ''' <summary>
        ''' POP3 サーバ認証を行います。
        ''' </summary>
        ''' <remarks>
        ''' POP3 サーバ認証を行います。
        ''' </remarks>
        ''' <param name="id_str">POP3 ユーザー ID</param>
        ''' <param name="pass_str">POP3 パスワード</param>
        ''' <param name="mode">APOP を使用するか</param>
        Public Sub Authenticate(ByVal id_str As String, ByVal pass_str As String, ByVal mode As Integer)
            _mode = mode
            Authenticate(id_str, pass_str)
        End Sub

        ''' <summary>
        ''' メールのステータスを取得します。
        ''' </summary>
        ''' <param name="no">メール番号</param>
        ''' <remarks>
        ''' <paramref name="no"/>パラメータでステータスを取得したいメール番号を指定します。
        ''' <para>件名は<see cref="Subject"/>で取得できます。</para>
        ''' <para>日付文字列は<see cref="DateString"/>で取得できます。</para>
        ''' <para>差出人は<see cref="From"/>で取得できます。</para>
        ''' <para>ヘッダは<see cref="Header"/>で取得できます。</para>
        ''' <para>メールサイズは<see cref="Size"/>で取得できます。</para>
        ''' <para>ステータス取得失敗の場合のエラー番号は<see cref="nMailException.ErrorCode"/>で取得できます。</para>
        ''' </remarks>
        Public Sub GetStatus(ByVal no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            SetHeaderSize()
            _subject = New StringBuilder(_header_size)
            _date = New StringBuilder(_header_size)
            _from = New StringBuilder(_header_size)
            _header = New StringBuilder(_header_size)
            _err = Pop3GetMailStatus(_socket, no, _subject, _date, _from, _header, False)
            If _err < 0 Then
                Throw New nMailException("GetStatus:" + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールのサイズを取得します。
        ''' </summary>
        ''' <param name="no">メール番号</param>
        ''' <remarks>
        ''' <paramref name="no"/>パラメータでメールサイズを取得したいメール番号を指定します。
        ''' </remarks>
        ''' <returns>メールサイズ</returns>
        Public Function GetSize(ByVal no As Integer) As Integer
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _size = Pop3GetMailSize(_socket, no)
            If _size < 0 Then
                _err = _size
                Throw New nMailException("GetSize:" + Options.ErrorMessage, _err)
            Else
                _body_size = _size * 2
            End If
            Return Size
        End Function

        ''' <summary>
        ''' メールを取得します。
        ''' </summary>
        ''' <param name="no">メール番号</param>
        ''' <remarks>
        ''' <paramref name="no"/>パラメータでメールを取得したいメール番号を指定します。
        ''' <para>添付ファイルを展開したい場合、<see cref="Path"/>に展開したいフォルダを指定しておきます。</para>
        ''' <para>拡張機能を使用したい場合、<see cref="Flag"/>で設定しておきます。</para>
        ''' <para>件名は<see cref="Subject"/>で取得できます。</para>
        ''' <para>日付文字列は<see cref="DateString"/>で取得できます。</para>
        ''' <para>差出人は<see cref="From"/>で取得できます。</para>
        ''' <para>ヘッダは<see cref="Header"/>で取得できます。</para>
        ''' <para>メールサイズは<see cref="Size"/>で取得できます。</para>
        ''' <para>添付ファイル名は<see cref="FileName"/>で取得できます。</para>
        ''' </remarks>
        Public Sub GetMail(ByVal no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            If (Not _path Is Nothing) Then
                If (_path <> "") And (Not Directory.Exists(_path)) Then
                    Throw New DirectoryNotFoundException(_path)
                End If
            End If
            If no <= 0 Then
                Throw New ArgumentOutOfRangeException
            End If
            If (_flag And SuspendNext) <> 0 Then
                _err = Pop3GetMailEx(_socket, no, _subject, _date, _from, _header, _body, _path, _filename, IntPtr.Zero, _flag)
            Else
                SetHeaderSize()
                _subject = New StringBuilder(_header_size)
                _date = New StringBuilder(_header_size)
                _from = New StringBuilder(_header_size)
                _header = New StringBuilder(_header_size)
                Options.FileNameMax = MaxPath
                _filename = New StringBuilder(MaxPath)
                If _body_size < 0 Then
                    GetSize(no)
                End If
                If _body_size > 0 Then
                    _body = New StringBuilder(_body_size)
                    If Flag <> 0 Then
                        _err = Pop3GetMailEx(_socket, no, _subject, _date, _from, _header, _body, _path, _filename, IntPtr.Zero, _flag)
                    Else
                        _err = Pop3GetMail(_socket, no, _subject, _date, _from, _header, _body, _path, _filename)
                    End If
                End If
            End If
            If _err <> ErrorSuspEndAttachmentFile Then
                If _filename.Length > 0 Then
                    _filename_list = _filename.ToString().Split(Options.SplitChar)
                Else
                    _filename_list = Nothing
                End If
                If Options.SaveHtmlFile = Options.SaveHtmlFileOn Then
                    GetHeaderField("X-NMAIL-HTML-FILE:")
                    _html_file = _field
                End If
                If Options.SaveRfc822File <> Options.SaveRfc822FileOff Then
                    GetHeaderField("X-NMAIL-RFC822-FILE:")
                    _rfc822_file = _field
                End If
            End If
            If (_err < 0) And (_err <> ErrorSuspEndAttachmentFile) Then
                Throw New nMailException("GetMail:" + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールを削除します。
        ''' </summary>
        ''' <param name="no">メール番号</param>
        ''' <remarks>
        ''' <para>メール削除失敗の場合のエラー番号は<see cref="nMailException.ErrorCode"/>で取得できます。</para>
        ''' </remarks>
        Public Sub Delete(ByVal no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            If no <= 0 Then
                Throw New ArgumentOutOfRangeException
            End If
            _err = Pop3DeleteMail(_socket, no)
            If _err < 0 Then
                Throw New nMailException("Delete:" + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' 添付ファイルの存在チェックを行います。
        ''' </summary>
        ''' <param name="no">メール番号</param>
        ''' <remarks>
        ''' <para>添付ファイルの分割数は<see cref="PartNo"/>で取得できます。</para>
        ''' <para><see cref="NoAttachmentFile"/>の場合添付ファイルはありません。</para>
        ''' <para><see cref="AttachmentFile"/>の場合分割されていない添付ファイル付きメールです。</para>
        ''' <para>1 以上の場合分割されている添付ファイルで返り値はパート番号を表します。</para>
        ''' <para>1 の場合は、<see cref="Flag"/>に<see cref="PartialAttachmentFile"/> を設定して
        ''' <see cref="GetMail"/>を呼び出すと添付ファイルを結合して保存可能です。</para>
        ''' </remarks>
        Public Function GetAttachmentFileStatus(ByVal no As Integer) As Boolean
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            SetHeaderSize()
            _part_id = New StringBuilder(_header_size)
            _part_no = Pop3GetAttachmentFileStatus(_socket, no, _part_id, _header_size)
            If _part_no > 0 Then
                Return True
            Else
                Return False
            End If
        End Function

        ''' <summary>
        ''' メールの UIDL を取得します。
        ''' </summary>
        ''' <param name="no">メール番号</param>
        ''' <remarks>
        ''' <para>取得した UIDL は<see cref="Uidl"/>で取得できます。</para>
        ''' <para><paramref name="no"/>に<see cref="UidlAll"/>を指定すると、
        ''' POP3 サーバ上にあるすべてのメールの UIDL を取得します。</para>
        ''' </remarks>
        Public Sub GetUidl(ByVal no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            SetHeaderSize()
            _uidl = New StringBuilder(_header_size)
            _err = Pop3GetUidl(_socket, no, _uidl, _header_size)
            If _err < 0 Then
                Throw New nMailException("GetUild:" + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールヘッダから指定のフィールドの内容を取得します。
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <remarks>
        ''' POP3 サーバとの接続とは無関係に使用できます。
        ''' <para>ヘッダは、<see cref="Header"/>で設定しておきます。
        ''' <see cref="GetMail"/>で受信した直後に呼び出した場合、
        ''' 受信したメールのヘッダを使用します。</para>
        ''' <para>取得したフィールド内容は<see cref="Field"/>で取得できます。</para>
        ''' </remarks>
        ''' <returns>フィールドの内容</returns>
        Public Function GetHeaderField(ByVal field_name As String) As String
            _field_name = field_name
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Pop3GetHeaderField(_field, _header.ToString(), _field_name, _header_size)
            If _err < 0 Then
                Throw New nMailException("GetHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' メールヘッダから指定のフィールドの内容を取得します。
        ''' </summary>
        ''' <remarks>
        ''' POP3 サーバとの接続とは無関係に使用できます。
        ''' <para>取得したフィールド内容は<see cref="Field"/>で取得できます。</para>
        ''' </remarks>
        ''' <param name="field_name">フィールド名</param>
        ''' <param name="header">ヘッダ</param>
        ''' <returns>フィールドの内容</returns>
        Public Function GetHeaderField(ByVal field_name As String, ByVal header As String) As String
            _field_name = field_name
            _header = New StringBuilder(header)
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Pop3GetHeaderField(_field, _header.ToString(), _field_name, _header_size)
            If _err < 0 Then
                Throw New nMailException("GetHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' MIME ヘッダフィールドの文字列をデコードします
        ''' </summary>
        ''' <param name="field">フィールドの文字列</param>
        ''' <returns>デコードしたフィールド内容</returns>
        Public Function DecodeHeaderField(ByVal field As String) As String
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Pop3DecodeHeaderField(_field, field, _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' メールヘッダから指定のヘッダフィールドの内容を取得し、
        ''' MIME ヘッダフィールドのデコードを行って返します
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <returns>取得したデコード済みのフィールド内容</returns>
        Public Function GetDecodeHeaderField(ByVal field_name As String) As String
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            Dim src As String = GetHeaderField(field_name, _header.ToString())
            _err = Pop3DecodeHeaderField(_field, src, _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' メールヘッダから指定のヘッダフィールドの内容を取得し、
        ''' MIME ヘッダフィールドのデコードを行って返します
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <param name="header">ヘッダ</param>
        ''' <returns>取得したデコード済みのフィールド内容</returns>
        Public Function GetDecodeHeaderField(ByVal field_name As String, ByVal header As String) As String
            SetHeaderSize()
            _err = Pop3DecodeHeaderField(_field, GetHeaderField(field_name, header), _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' 添付ファイル名の配列を取得します。
        ''' </summary>
        ''' <returns>添付ファイル名の配列</returns>
        Public Function GetFileNameList() As String()
            If _filename_list Is Nothing Then
                Return New String() {}
            Else
                Return CType(_filename_list.Clone(), String())
            End If
        End Function

        ''' <summary>
        ''' POP3 ポート番号です。
        ''' </summary>
        ''' <value>POP3 ポート番号</value>
        Public Property Port() As Integer
            Get
                Return _port
            End Get
            Set(ByVal Value As Integer)
                _port = Value
            End Set
        End Property

        ''' <summary>
        ''' ソケットハンドルです。
        ''' </summary>
        ''' <value>ソケットハンドル</value>
        Public ReadOnly Property Handle() As IntPtr
            Get
                Return _socket
            End Get
        End Property

        ''' <summary>
        ''' POP3 サーバ上のメール数です。
        ''' </summary>
        ''' <value>POP3 サーバ上のメール数</value>
        Public ReadOnly Property Count() As Integer
            Get
                Return _count
            End Get
        End Property

        ''' <summary>
        ''' メールのサイズサイズです。
        ''' </summary>
        ''' <value>メールのサイズ</value>
        Public ReadOnly Property Size() As Integer
            Get
                Return _size
            End Get
        End Property

        ''' <summary>
        ''' POP3 サーバ名です。
        ''' </summary>
        ''' <value>POP3 サーバ名</value>
        Public Property HostName() As String
            Get
                Return _host
            End Get
            Set(ByVal Value As String)
                _host = Value
            End Set
        End Property

        ''' <summary>
        ''' POP3 ユーザー名です。
        ''' </summary>
        ''' <value>POP3 ユーザー名</value>
        Public Property Id() As String
            Get
                Return _id
            End Get
            Set(ByVal Value As String)
                _id = Value
            End Set
        End Property

        ''' <summary>
        ''' POP3 パスワードです。
        ''' </summary>
        ''' <value>POP3 パスワード</value>
        Public Property Password() As String
            Get
                Return _password
            End Get
            Set(ByVal Value As String)
                _password = Value
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイルを保存するフォルダです。
        ''' </summary>
        ''' <remarks>
        ''' Nothing の場合保存しません。
        ''' </remarks>
        ''' <value>添付ファイル保存フォルダ</value>
        Public Property Path() As String
            Get
                Return _path
            End Get
            Set(ByVal Value As String)
                _path = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの本文です。
        ''' </summary>
        ''' <value>メール本文</value>
        Public ReadOnly Property Body() As String
            Get
                Return _body.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの件名です。
        ''' </summary>
        ''' <value>メールの件名</value>
        Public ReadOnly Property Subject() As String
            Get
                Return _subject.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの送信日時の文字列です。
        ''' </summary>
        ''' <value>メール送信日時文字列</value>
        Public ReadOnly Property DateString() As String
            Get
                Return _date.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの差出人です。
        ''' </summary>
        ''' <value>メールの差出人</value>
        Public ReadOnly Property From() As String
            Get
                Return _from.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールのヘッダです。
        ''' </summary>
        ''' <value>メールのヘッダ</value>
        Public Property Header() As String
            Get
                Return _header.ToString()
            End Get
            Set(ByVal Value As String)
                _header = New StringBuilder(Value)
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイル名です。
        ''' </summary>
        ''' <remarks>
        ''' 複数の添付ファイルがある場合、"," で区切られて格納されます。
        ''' <see cref="Options.SplitChar"/>で区切り文字を変更できます。
        ''' </remarks>
        ''' <value>添付ファイル名</value>
        Public ReadOnly Property FileName() As String
            Get
                Return _filename.ToString()
            End Get
        End Property

        ''' <summary>
        ''' 添付ファイル名の配列です。
        ''' </summary>
        ''' <value>添付ファイル名</value>
        Public ReadOnly Property FileNameList() As String()
            Get
                Return _filename_list
            End Get
        End Property

        ''' <summary>
        ''' ヘッダのフィールド名です。
        ''' </summary>
        ''' <value>ヘッダのフィールド名</value>
        Public ReadOnly Property FieldName() As String
            Get
                Return _field_name
            End Get
        End Property

        ''' <summary>
        ''' ヘッダフィールドの内容です。
        ''' </summary>
        ''' <value>ヘッダフィールドの内容</value>
        Public ReadOnly Property Field() As String
            Get
                Return _field.ToString()
            End Get
        End Property

        ''' <summary>
        ''' 添付ファイルの分割数です。
        ''' </summary>
        ''' <value>添付ファイルの分割数</value>
        Public ReadOnly Property PartNo() As Integer
            Get
                Return _part_no
            End Get
        End Property

        ''' <summary>
        ''' 添付ファイルの ID です。
        ''' </summary>
        ''' <value>添付ファイルの ID </value>
        Public ReadOnly Property PartId() As String
            Get
                Return _part_id.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの UIDL です。
        ''' </summary>
        ''' <value>メール UIDL</value>
        Public ReadOnly Property Uidl() As String
            Get
                Return _uidl.ToString()
            End Get
        End Property

        ''' <summary>
        ''' APOP を使用するかどうかのフラグです。
        ''' </summary>
        ''' <remarks>
        ''' true で APOP を使用します。
        ''' true で APOP を使用します。
        ''' 互換性のために残していますが、通常は AuthMode を使用してください。
        ''' </remarks>
        ''' <value>APOP を使用するかどうかのフラグ</value>
        Public Property APop() As Boolean
            Get
                If _mode = AuthAPop Then
                    Return True
                Else
                    Return False
                End If
            End Get
            Set(ByVal Value As Boolean)
                If Value = True Then
                    _mode = AuthAPop
                Else
                    _mode = AuthNormal
                End If
            End Set
        End Property
        ''' <summary>
        ''' POP3 の認証方法です。
        ''' </summary>
        ''' <see cref="AuthNormal"/> で 通常の認証を使用します。。
        ''' <see cref="AuthAPop"/> で APOP 認証を使用します。
        ''' <see cref="AuthOAuth2"/> OAUTH2 認証を使用します。
        ''' <remarks>
        ''' 複数の指定はできません。
        '''	デフォルト値は AuthNormal です。
        ''' </remarks>
        ''' <value>送信モード</value>
        Public Property AuthMode() As Integer
            Get
                Return _mode
            End Get
            Set
                _mode = Value
            End Set
        End Property

        ''' <summary>
        ''' メール拡張機能指定フラグです。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="PartialAttachmentFile"/>分割された添付ファイルを取得します。</para>
        ''' <para><see cref="TextOnly"/>メール本文のみ取得します。</para>
        ''' <para><see cref="SuspendAttachmentFile"/>添付ファイル受信で一時休止ありの一回目に指定します。</para>
        ''' <para><see cref="SuspendNext"/>添付ファイル受信で一時休止ありの二回目以降に指定します。</para>
        ''' </remarks>
        Public Property Flag() As Integer
            Get
                Return _flag
            End Get
            Set(ByVal Value As Integer)
                _flag = Value
            End Set
        End Property

        ''' <summary>
        ''' エラー番号です。
        ''' </summary>
        ''' <value>エラー番号</value>
        Public ReadOnly Property ErrorCode() As Integer
            Get
                Return _err
            End Get
        End Property
        ''' <summary>
        ''' HTML パートを保存したファイルの名前です。
        ''' </summary>
        ''' <value>ファイル名</value>
        Public ReadOnly Property HtmlFile() As String
            Get
                If _html_file Is Nothing Then
                    Return ""
                Else
                    Return _html_file.ToString()
                End If
            End Get
        End Property
        ''' <summary>
        ''' SSL 設定フラグです。
        ''' </summary>
        ''' <value>SSL 設定フラグ</value>
        Public Property SSL() As Integer
            Get
                Return _ssl
            End Get
            Set(ByVal Value As Integer)
                _ssl = Value
            End Set
        End Property
        ''' <summary>
        ''' SSL クライアント証明書名です。
        ''' </summary>
        ''' <remarks>
        ''' nothing の場合指定しません。
        ''' </remarks>
        ''' <value>SSL クライアント証明書名</value>
        Public Property CertName() As String
            Get
                Return _cert_name
            End Get
            Set(ByVal Value As String)
                _cert_name = Value
            End Set
        End Property
        ''' <summary>
        ''' message/rfc822 パートを保存したファイルの名前です。
        ''' </summary>
        ''' <value>ファイル名</value>
        Public ReadOnly Property Rfc822File() As String
            Get
                If _rfc822_file Is Nothing Then
                    Return ""
                Else
                    Return _rfc822_file.ToString()
                End If
            End Get
        End Property
    End Class

    ''' <summary>
    ''' SMTP メール送信クラス
    ''' </summary>
    Class Smtp
        Implements IDisposable

        ''' <summary>
        ''' 拡張機能用バッファのサイズです。
        ''' </summary>
        Protected Const AttachmentTempSize As Integer = 2000

        ''' <summary>
        ''' ソケットエラーもしくは非接続状態です。
        ''' </summary>
        Public Const ErrorSocket As Integer = -1
        ''' <summary>
        ''' 認証失敗エラーです。
        ''' </summary>
        Public Const ErrorAuthenticate As Integer = -2
        ''' <summary>
        ''' タイムアウトエラーです。
        ''' </summary>
        Public Const ErrorTimeout As Integer = -4
        ''' <summary>
        ''' 添付ファイルオープン失敗エラーです。
        ''' </summary>
        Public Const ErrorFileOpen As Integer = -5
        ''' <summary>
        ''' サーバが指定した認証形式に対応していません。
        ''' </summary>
        Public Const ErrorAuthenticateNoSupport As Integer = -8
        ''' <summary>
        ''' メモリ確保エラーです。
        ''' </summary>
        Public Const ErrorMemory As Integer = -9
        ''' <summary>
        ''' その他のエラーです。
        ''' </summary>
        Public Const ErrorEtc As Integer = -10
        ''' <summary>
        ''' メール送信中の一時休止状態です。
        ''' </summary>
        Public Const ErrorSuspendAttachmentFile As Integer = -20
        ''' <summary>
        ''' サービスが利用できません。
        ''' </summary>
        Public Const ErrorServiceNotAvaliable As Integer = -421
        ''' <summary>
        ''' メールボックスが使用できません。（使用中等）
        ''' </summary>
        Public Const ErrorMailboxUnavalable As Integer = -450
        ''' <summary>
        ''' サーバ処理エラーです。
        ''' </summary>
        Public Const ErrorLocal As Integer = -451
        ''' <summary>
        ''' システム容量不足エラーです。
        ''' </summary>
        Public Const ErrorInsufficientSystemStorage As Integer = -452
        ''' <summary>
        ''' コマンドの文法エラーです。
        ''' </summary>
        Public Const ErrorSyntax As Integer = -500
        ''' <summary>
        ''' パラメータか引数の文法エラーです。
        ''' </summary>
        Public Const ErrorParameter As Integer = -501
        ''' <summary>
        ''' 未実装コマンドです。
        ''' </summary>
        Public Const ErrorCommandNotImplemented As Integer = -502
        ''' <summary>
        ''' コマンドのシーケンス異常です。
        ''' </summary>
        Public Const ErrorBadSequence As Integer = -503
        ''' <summary>
        ''' SMTP 認証失敗です。
        ''' </summary>
        Public Const ErrorSmtpAuthenticate As Integer = -535
        ''' <summary>
        ''' 送信先がありません。
        ''' </summary>
        Public Const ErrorUserUnkown As Integer = -550
        ''' <summary>
        ''' ユーザーが存在しないか、転送先がありません。
        ''' </summary>
        Public Const ErrorUserNotLocal As Integer = -551
        ''' <summary>
        ''' 容量オーバーエラーです。
        ''' </summary>
        Public Const ErrorExceededStorageAllocation As Integer = -552
        ''' <summary>
        ''' メールボックス名が正しくありません。
        ''' </summary>
        Public Const ErrorMailboxNameNotAllowed As Integer = -553
        ''' <summary>
        ''' リレー防止エラーです。
        ''' </summary>
        Public Const ErrorRelayOperationRejected As Integer = -553
        ''' <summary>
        ''' トランザクションに失敗しました。
        ''' </summary>
        Public Const ErrorTransactionFailed As Integer = -554
        ''' <summary>
        ''' 送信日時フィールドを nMail.DLL 内で生成します。
        ''' </summary>
        Public Const AddDateField As Integer = 1
        ''' <summary>
        ''' Message-ID フィールドを nMail.DLL 内で生成します。
        ''' </summary>
        Public Const AddMessageId As Integer = 2
        ''' <summary>
        ''' 大きなサイズの添付ファイル送信中に一旦処理を戻します。
        ''' </summary>
        Public Const SuspendAttachmentFile As Integer = 4
        ''' <summary>
        ''' 大きなサイズの添付ファイル送信二回目以降です。
        ''' </summary>
        Public Const SuspendNext As Integer = 8
        ''' <summary>
        ''' RFC2231 で添付ファイル名をエンコードします。
        ''' </summary>
        Public Const FileNameRfc2231 As Integer = 16
        ''' <summary>
        ''' UTF-8 でメールをエンコードします（さらにBASE64でエンコードされます）
        ''' </summary>
        Public Const EncodeUtf8 As Integer = 32
        ''' <summary>
        ''' HTML メールを送信します。
        ''' </summary>
        Public Const HtmlMail As Integer = 64
        ''' <summary>
        ''' text/html パートをファイルで指定します。
        ''' </summary>
        Public Const HtmlUseFile As Integer = 128
        ''' <summary>
        ''' HTML メールの宛先のドメインをみて multipart の構成を決定します。
        ''' </summary>
        Public Const HtmlAutoPart As Integer = 256
        ''' <summary>
        ''' text/html パートで使用する画像ファイルを添付する場合、multipart/mixed なしで送信します。
        ''' </summary>
        Public Const HtmlNoMixedPart As Integer = 512
        ''' <summary>
        ''' Softbank 携帯向けオプション（HtmlNoMixedPartと同じ）
        ''' </summary>
        Public Const HtmlSoftbank As Integer = 512
        ''' <summary>
        ''' EMOBILE 携帯向けオプション（HtmlNoMixedPartと同じ）
        ''' </summary>
        Public Const HtmlEmobile As Integer = 512
        ''' <summary>
        ''' WILLCOM 携帯向けオプション（HtmlNoMixedPartと同じ）
        ''' </summary>
        Public Const HtmlWillcom As Integer = 512
        ''' <summary>
        ''' text/html パートで使用する画像ファイルを添付する場合、multipart/related なしで送信します。
        ''' </summary>
        Public Const HtmlNoRelatedPart As Integer = 1024
        ''' <summary>
        ''' au 携帯向けオプション（HtmlNoRelatedPartと同じ）
        ''' </summary>
        Public Const HtmlAu As Integer = 1024
        ''' <summary>
        ''' text/html パートのみ（text/plain パートなし）で HTML メールを送信します。
        ''' </summary>
        Public Const HtmlNoPlainPart As Integer = 2048
        ''' <summary>
        ''' text/plain パートで使用する文字列を Body で指定します。
        ''' </summary>
        Public Const HtmlSetPlainBody As Integer = 4096
        ''' <summary>
        ''' 処理成功です。
        ''' </summary>
        Public Const Success As Integer = 1
        ''' <summary>
        ''' SMTP AUTH は使用しません。
        ''' </summary>
        Public Const AuthNotUse As Integer = 0
        ''' <summary>
        ''' SMTP AUTH PLAIN を使用します。
        ''' </summary>
        Public Const AuthPlain As Integer = 1
        ''' <summary>
        ''' SMTP AUTH LOGIN を使用します。
        ''' </summary>
        Public Const AuthLogin As Integer = 2
        ''' <summary>
        ''' SMTP AUTH CRAM MD5 を使用します。
        ''' </summary>
        Public Const AuthCramMd5 As Integer = 4
        ''' <summary>
        ''' SMTP AUTH DIGEST MD5 を使用します。
        ''' </summary>
        Public Const AuthDigestMd5 As Integer = 8
        ''' <summary>
        ''' SMTP AUTH OAUTH2 を使用します。
        ''' </summary>
        Public Const AuthOAuth2 As Integer = 16
        ''' <summary>
        ''' SSLv3 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const SSL3 As Integer = &H1000
        ''' <summary>
        ''' TSLv1 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1 As Integer = &H2000
        ''' <summary>
        ''' STARTTLS を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const STARTTLS As Integer = &H4000
        ''' <summary>
        ''' TSLv1.2 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1_2 As Integer = &H10000
        ''' <summary>
        ''' TSLv1.3 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1_3 As Integer = &H20000
        ''' <summary>
        ''' サーバ証明書が期限切れでもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const IgnoreNotTimeValid As Integer = &H800
        ''' <summary>
        ''' ルート証明書が無効でもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const AllowUnknownCA As Integer = &H400
        ''' <summary>
        ''' Common Name が一致しなくてもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const IgnoreInvalidName As Integer = &H40
        ''' <summary>
        ''' SMTP の標準ポート番号です
        ''' </summary>
        Public Const StandardPortNo As Integer = 25
        ''' <summary>
        ''' SMTP over SSL のポート番号です
        ''' </summary>
        Public Const StandardSslPortNo As Integer = 465
        ''' <summary>
        ''' SMTP サブミッションポート番号です
        ''' </summary>
        Public Const SubmissionPortNo As Integer = 587

        ''' <summary>
        ''' SMTP ポート番号です。
        ''' </summary>
        Protected _port As Integer = 25
        ''' <summary>
        ''' ソケットハンドルです。
        ''' </summary>
        Protected _socket As IntPtr = IntPtr.op_Explicit(ErrorSocket)
        ''' <summary>
        ''' メール送信拡張機能の指定です。
        ''' </summary>
        Protected _flag As Integer = 0
        ''' <summary>
        ''' エラー番号です。
        ''' </summary>
        Protected _err As Integer
        ''' <summary>
        ''' SMTP AUTH のモードです。
        ''' </summary>
        Protected _mode As Integer = AuthNotUse
        ''' <summary>
        ''' SMTP サーバ名です。
        ''' </summary>
        Protected _host As String = ""
        ''' <summary>
        ''' SMTP AUTH ユーザー名です。
        ''' </summary>
        Protected _id As String = ""
        ''' <summary>
        ''' SMTP AUTH パスワードです。
        ''' </summary>
        Protected _password As String = ""
        ''' <summary>
        ''' メールの宛先です。
        ''' </summary>
        Protected _to As String = ""
        ''' <summary>
        ''' メールの CC です。
        ''' </summary>
        Protected _cc As String = ""
        ''' <summary>
        ''' メールの BCC です。
        ''' </summary>
        Protected _bcc As String = ""
        ''' <summary>
        ''' メールの差出人です。
        ''' </summary>
        Protected _from As String = ""
        ''' <summary>
        ''' メールの件名です。
        ''' </summary>
        Protected _subject As String = ""
        ''' <summary>
        ''' メールの本文です。
        ''' </summary>
        Protected _body As String = ""
        ''' <summary>
        ''' メールの追加ヘッダです。
        ''' </summary>
        Protected _header As String = ""
        ''' <summary>
        ''' メールに添付するファイル名です。
        ''' </summary>
        Protected _filename As String = ""
        ''' <summary>
        ''' 添付ファイル名のリストです。
        ''' </summary>
        Protected _filename_list As String() = Nothing
        ''' <summary>
        ''' Connect() を使ったかどうかのフラグです。
        ''' </summary>
        Protected _connect_flag As Boolean = False
        ''' <summary>
        ''' Dispose 処理を行ったかどうかのフラグです。
        ''' </summary>
        Protected _disposed As Boolean = False
        ''' <summary>
        ''' SSL 設定フラグです。
        ''' </summary>
        Protected _ssl As Integer = 0
        ''' <summary>
        ''' SSL クライアント証明書名です。
        ''' </summary>
        Protected _cert_name As String = Nothing

        <DllImport("nMail.DLL", EntryPoint:="NMailSmtpSendMailPortNo", CharSet:=CharSet.Auto)> _
        Protected Shared Function SmtpSendMailPortNo(ByVal HostName As String, ByVal ToStr As String, ByVal Cc As String, ByVal Bcc As String, ByVal From As String, ByVal Subject As String, ByVal Body As String, ByVal Header As String, ByVal Path As String, ByVal Flag As Integer, ByVal PortNo As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailSmtpSendMailSsl", CharSet:=CharSet.Auto)> _
        Protected Shared Function SmtpSendMailSsl(ByVal HostName As String, ByVal ToStr As String, ByVal Cc As String, ByVal Bcc As String, ByVal From As String, ByVal Subject As String, ByVal Body As String, ByVal Header As String, ByVal Path As String, ByVal Flag As Integer, ByVal PortNo As Integer, ByVal SslFlag As Integer, ByVal Name As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailSmtpConnect", CharSet:=CharSet.Auto)> _
        Protected Shared Function SmtpConnect(ByVal Host As String) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailSmtpConnectSsl", CharSet:=CharSet.Auto)> _
        Protected Shared Function SmtpConnectSsl(ByVal Host As String, ByVal Port As Integer, ByVal Flag As Integer, ByVal Name As String) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailSmtpConnectPortNo", CharSet:=CharSet.Auto)> _
        Protected Shared Function SmtpConnectPortNo(ByVal Host As String, ByVal PortNo As Integer) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailSmtpAuthenticate", CharSet:=CharSet.Auto)> _
        Protected Shared Function SmtpAuthenticate(ByVal Socket As IntPtr, ByVal HostName As String, ByVal Id As String, ByVal Pass As String, ByVal Mode As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailSmtpSendMailEx", CharSet:=CharSet.Auto)> _
        Protected Shared Function SmtpSendMailEx(ByVal Socket As IntPtr, ByVal ToStr As String, ByVal Cc As String, ByVal Bcc As String, ByVal From As String, ByVal Subject As String, ByVal Body As String, ByVal Header As String, ByVal Path As String, ByVal Temp As IntPtr, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailSmtpClose")> _
        Protected Shared Function SmtpClose(ByVal Socket As IntPtr) As Boolean
        End Function

        ''' <summary>
        ''' 初期化処理です。
        ''' </summary>
        Protected Sub Init()
            _filename_list = Nothing
        End Sub

        ''' <summary>
        ''' <c>Smtp</c>クラスの新規インスタンスを初期化します。
        ''' </summary>
        Public Sub New()
            Init()
        End Sub

        ''' <summary>
        ''' <c>Smtp</c>クラスの新規インスタンスを初期化します。
        ''' </summary>
        ''' <param name="host_name">SMTP サーバ名</param>
        Public Sub New(ByVal host_name As String)
            Init()
            _host = host_name
        End Sub

        ''' <summary>
        ''' 
        ''' </summary>
        Protected Overrides Sub Finalize()
            MyBase.Finalize()
            Dispose(False)
        End Sub

        ''' <summary>
        ''' <see cref="Smtp"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        Overridable Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        ''' <summary>
        ''' <see cref="Smtp"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        ''' <param name="disposing">
        ''' マネージリソースとアンマネージリソースの両方を解放する場合は<c>true</c>。
        ''' アンマネージリソースだけを解放する場合は<c>false</c>。
        ''' </param>
        Protected Overloads Sub Dispose(ByVal disposing As Boolean)
            If Not _disposed Then
                If disposing Then
                End If
                If _connect_flag And (Not _socket.Equals(IntPtr.op_Explicit(ErrorSocket))) Then
                    SmtpClose(_socket)
                End If
                _socket = IntPtr.op_Explicit(ErrorSocket)
                _connect_flag = False
                _disposed = True
            End If
        End Sub

        ''' <summary>
        ''' メールを送信します。
        ''' </summary>
        ''' <remarks>
        '''	一時休止機能の二回目以降の呼び出しで使用します。
        ''' </remarks>
        Public Sub SendMail()
            Dim no As Integer

            _filename = ""
            If Not _filename_list Is Nothing Then
                If _filename_list.Length > 0 Then
                    For no = 0 To _filename_list.Length - 1
                        If Not File.Exists(_filename_list(no)) Then
                            Throw New FileNotFoundException(_filename_list(no))
                        End If
                    Next no
                    _filename = String.Join(Options.SplitChar, _filename_list)
                End If
            End If
            If _connect_flag Then
                _err = SmtpSendMailEx(_socket, _to, _cc, _bcc, _from, _subject, _body, _header, _filename, IntPtr.Zero, _flag)
            Else
                _err = SmtpSendMailSsl(_host, _to, _cc, _bcc, _from, _subject, _body, _header, _filename, _flag, _port, _ssl, _cert_name)
            End If
            If (_err < 0) And (_err <> ErrorSuspendAttachmentFile) Then
                Throw New nMailException("SendMail:" + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールを送信します。
        ''' </summary>
        ''' <param name="to_str">宛先</param>
        ''' <param name="from_str">差出人</param>
        ''' <param name="subject_str">件名</param>
        ''' <param name="body_str">本文</param>
        ''' <remarks>
        ''' <paramref name="to_str"/>パラメータでメールの宛先を指定します。
        ''' <paramref name="from_str"/>パラメータで差出人を指定します。
        ''' <paramref name="subject_str"/>パラメータで件名を指定します。
        ''' <paramref name="body_str"/>パラメータで本文を指定します。
        ''' <para>CC を指定したい場合、<see cref="Cc"/>に指定しておきます。</para>
        ''' <para>BCC を指定したい場合、<see cref="Bcc"/>に指定しておきます。</para>
        ''' <para>ファイルを添付したい場合、<see cref="FileName"/>に指定しておきます。</para>
        ''' </remarks>
        Public Sub SendMail(ByVal to_str As String, ByVal from_str As String, ByVal subject_str As String, ByVal body_str As String)
            _to = to_str
            _from = from_str
            _subject = subject_str
            _body = body_str
            SendMail()
        End Sub

        ''' <summary>
        ''' SMTP サーバに接続します。
        ''' </summary>
        ''' <remarks>
        '''	SMTP AUTH および一時休止機能を使う場合に使用します。
        ''' </remarks>
        Public Sub Connect()
            If _host = "" Then
                Throw New FormatException
            End If
            If (_port < 0) Or (_port > 65536) Then
                Throw New ArgumentOutOfRangeException
            End If
            _socket = SmtpConnectSsl(_host, _port, _ssl, _cert_name)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                _err = ErrorSocket
                _socket = IntPtr.op_Explicit(ErrorSocket)
                Throw New nMailException("Connect", _err)
            Else
                _connect_flag = True
            End If
        End Sub

        ''' <summary>
        ''' SMTP サーバに接続
        ''' </summary>
        ''' <param name="host_name">SMTP サーバ名</param>
        ''' <remarks>
        '''	SMTP AUTH および一時休止機能を使う場合に使用します。
        ''' </remarks>
        Public Sub Connect(ByVal host_name As String)
            _host = host_name
            Connect()
        End Sub

        ''' <summary>
        ''' SMTP サーバに接続
        ''' </summary>
        ''' <param name="host_name">SMTP サーバ名</param>
        ''' <param name="port_no">ポート番号</param>
        ''' <remarks>
        '''	SMTP AUTH および一時休止機能を使う場合に使用します。
        ''' </remarks>
        Public Sub Connect(ByVal host_name As String, ByVal port_no As Integer)
            _host = host_name
            _port = port_no
            Connect()
        End Sub

        ''' <summary>
        ''' SMTP サーバに接続
        ''' </summary>
        ''' <param name="port_no">ポート番号</param>
        ''' <remarks>
        '''	SMTP AUTH および一時休止機能を使う場合に使用します。
        ''' </remarks>
        Public Sub Connect(ByVal port_no As Integer)
            _port = port_no
            Connect()
        End Sub

        ''' <summary>
        ''' SMTP サーバとの接続終了
        ''' </summary>
        Public Sub Close()
            If Not _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                SmtpClose(_socket)
            End If
            _socket = IntPtr.op_Explicit(ErrorSocket)
            _connect_flag = False
        End Sub

        ''' <summary>
        ''' SMTP AUTH 認証
        ''' </summary>
        Public Sub Authenticate()
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = SmtpAuthenticate(_socket, _host, _id, _password, _mode)
            If _err < 0 Then
                Throw New nMailException("Authenticate:" + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' SMTP AUTH 認証
        ''' </summary>
        ''' <param name="id_str">ユーザー ID</param>
        ''' <param name="pass_str">パスワード</param>
        ''' <param name="mode">AUTH 種別</param>
        ''' <remarks>
        ''' AUTH 種別の設定可能な値は下記の通りです。
        ''' <see cref="AuthPlain"/> で PLAIN を使用します。
        ''' <see cref="AuthLogin"/> で LOGIN を使用します。
        ''' <see cref="AuthCramMd5"/> CRAM MD5 を使用します。
        ''' AuthNotUse 以外は Or で複数指定可能です。
        ''' CRAM MD5→LOGIN→PLAIN の優先順位で認証を試みます。
        ''' </remarks>
        Public Sub Authenticate(ByVal id_str As String, ByVal pass_str As String, ByVal mode As Integer)
            _id = id_str
            _password = pass_str
            _mode = mode
            Authenticate()
        End Sub

        ''' <summary>
        ''' SMTP ポート番号です。
        ''' </summary>
        ''' <value>SMTP ポート番号</value>
        Public Property Port() As Integer
            Get
                Return _port
            End Get
            Set(ByVal Value As Integer)
                _port = Value
            End Set
        End Property

        ''' <summary>
        ''' ソケットハンドルです。
        ''' </summary>
        ''' <value>SMTP ソケットハンドル</value>
        Public ReadOnly Property Handle() As IntPtr
            Get
                Return _socket
            End Get
        End Property

        ''' <summary>
        ''' SMTP サーバ名です。
        ''' </summary>
        ''' <value>SMTP サーバ名</value>
        Public Property HostName() As String
            Get
                Return _host
            End Get
            Set(ByVal Value As String)
                _host = Value
            End Set
        End Property

        ''' <summary>
        ''' SMTP AUTH 用のユーザー名です。
        ''' </summary>
        ''' <value>SMTP AUTH ユーザー名</value>
        Public Property Id() As String
            Get
                Return _id
            End Get
            Set(ByVal Value As String)
                _id = Value
            End Set
        End Property

        ''' <summary>
        ''' SMTP AUTH 用のパスワードです。
        ''' </summary>
        ''' <value>SMTP AUTH パスワード</value>
        Public Property Password() As String
            Get
                Return _password
            End Get
            Set(ByVal Value As String)
                _password = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの宛先です。
        ''' </summary>
        ''' <value>メール 宛先</value>
        Public Property MailTo() As String
            Get
                Return _to
            End Get
            Set(ByVal Value As String)
                _to = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの CC です。
        ''' </summary>
        ''' <value>メール CC</value>
        Public Property Cc() As String
            Get
                Return _cc
            End Get
            Set(ByVal Value As String)
                _cc = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの BCC です。
        ''' </summary>
        ''' <value>メール BCC</value>
        Public Property Bcc() As String
            Get
                Return _bcc
            End Get
            Set(ByVal Value As String)
                _bcc = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの差出人です。
        ''' </summary>
        ''' <value>メール差出人</value>
        Public Property From() As String
            Get
                Return _from
            End Get
            Set(ByVal Value As String)
                _from = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの件名です。
        ''' </summary>
        ''' <value>メール件名</value>
        Public Property Subject() As String
            Get
                Return _subject
            End Get
            Set(ByVal Value As String)
                _subject = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの本文です。
        ''' </summary>
        ''' <value>メール本文</value>
        Public Property Body() As String
            Get
                Return _body
            End Get
            Set(ByVal Value As String)
                _body = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの添付ファイルです。
        ''' </summary>
        ''' <remarks>
        ''' 複数の添付ファイルを送信する場合、"," で区切ります。
        ''' <see cref="Options.SplitChar"/>で区切り文字を変更できます。
        ''' </remarks>
        ''' <value>添付ファイル</value>
        Public Property FileName() As String
            Get
                _filename = String.Join(Options.SplitChar, _filename_list)
                Return _filename
            End Get
            Set(ByVal Value As String)
                _filename = Value
                If _filename.Length > 0 Then
                    _filename_list = _filename.ToString().Split(Options.SplitChar)
                Else
                    _filename_list = New String() {}
                End If
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイル名の配列です。
        ''' </summary>
        ''' <value>添付ファイル名</value>
        Public Property FileNameList() As String()
            Get
                Return _filename_list
            End Get
            Set(ByVal Value As String())
                _filename_list = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの追加ヘッダです。
        ''' </summary>
        ''' <remarks>
        ''' 複数のヘッダを追加する場合、C# では '\r\n'、Visual Basic では vbCrLf
        ''' で連結してください。
        ''' </remarks>
        ''' <value>追加ヘッダ</value>
        Public Property Header() As String
            Get
                Return _header
            End Get
            Set(ByVal Value As String)
                _header = Value
            End Set
        End Property

        ''' <summary>
        ''' メール送信のオプション指定です。
        ''' </summary>
        ''' <value>送信オプション</value>
        ''' <remarks>
        ''' <para><see cref="AddDateField"/>送信日時フィールドを nMail.DLL 内で生成します。</para>
        ''' <para><see cref="AddMessageId"/>Message-ID フィールドを nMail.DLL 内で生成します。</para>
        ''' <para><see cref="SuspendAttachmentFile"/>添付ファイル送信で一時休止ありの一回目に指定します。</para>
        ''' <para><see cref="SuspendNext"/>添付ファイル送信で一時休止ありの二回目以降に指定します。</para>
        '''	<para><see cref="FileNameRfc2231"/>RFC2231 で添付ファイル名をエンコードします。</para>
        ''' <para><see cref="EncodeUtf8"/>UTF-8 でメールをエンコードします（さらにBASE64でエンコードされます）</para>
        ''' <para>C# の場合 |、VB.NET の場合 Or で複数の指定が可能です。ただし SuspendAttachmentFile と SuspendNext は同時に指定できません。</para>
        ''' </remarks>
        Public Property Flag() As Integer
            Get
                Return _flag
            End Get
            Set(ByVal Value As Integer)
                _flag = Value
            End Set
        End Property

        ''' <summary>
        ''' SMTP AUTH の種別です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="AuthNotUse"/> で SMTP AUTH は使用しません。
        ''' <see cref="AuthPlain"/> で PLAIN を使用します。
        ''' <see cref="AuthLogin"/> で LOGIN を使用します。
        ''' <see cref="AuthCramMd5"/> CRAM MD5 を使用します。
        '''  <see cref="AuthDigestMd5"/> DIGEST MD5 を使用します。
        ''' AuthNotUse, AuthOAuth2 以外は C# は | 、Visual Basic では or で複数設定可能です。
        ''' DIGEST MD5→CRAM MD5→LOGIN→PLAIN の順番で認証を試みます。
        '''	デフォルト値は AuthNotUse です。
        ''' </remarks>
        ''' <value>送信モード</value>
        Public Property AuthMode() As Integer
            Get
                Return _mode
            End Get
            Set(ByVal Value As Integer)
                _mode = Value
            End Set
        End Property

        ''' <summary>
        ''' メール送信時のエラー番号です。
        ''' </summary>
        ''' <value>エラー番号</value>
        Public ReadOnly Property ErrorCode() As Integer
            Get
                Return _err
            End Get
        End Property

        ''' <summary>
        ''' SSL 設定フラグです。
        ''' </summary>
        ''' <value>SSL 設定フラグ</value>
        Public Property SSL() As Integer
            Get
                Return _ssl
            End Get
            Set(ByVal Value As Integer)
                _ssl = Value
            End Set
        End Property
        ''' <summary>
        ''' SSL クライアント証明書名です。
        ''' </summary>
        ''' <remarks>
        ''' nothing の場合指定しません。
        ''' </remarks>
        ''' <value>SSL クライアント証明書名</value>
        Public Property CertName() As String
            Get
                Return _cert_name
            End Get
            Set(ByVal Value As String)
                _cert_name = Value
            End Set
        End Property
    End Class

    ''' <summary>
    ''' 添付ファイル展開クラス
    ''' </summary>
    Class Attachment
        Implements IDisposable
        ''' <summary>
        ''' ヘッダ領域のサイズです。
        ''' </summary>
        Protected Const HeaderSize As Integer = 32768
        ''' <summary>
        ''' パス文字列のサイズです。
        ''' </summary>
        Protected Const MaxPath As Integer = 32768
        ''' <summary>
        ''' 添付ファイル展開用バッファのサイズです。
        ''' </summary>
        Protected Const AttachmentTempSize As Integer = 2000

        ''' <summary>
        ''' 分割された添付ファイルの順番が正しくありません。
        ''' </summary>
        Public Const ErrorInvalidNo As Integer = -3
        ''' <summary>
        ''' 添付ファイルを作成できませんでした。
        ''' </summary>
        Public Const ErrorFileOpen As Integer = -5
        ''' <summary>
        ''' 添付ファイルの展開が終了していません。
        ''' </summary>
        Public Const ErrorPartial As Integer = -6
        ''' <summary>
        ''' 添付ファイルと同名のファイルがフォルダに存在します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="nMail.Options.AlreadyFile"/> に <see cref="nMail.Options.FileAlreadyError"/></para>
        ''' <para>を設定し、<see cref="Path"/>で指定したフォルダに添付ファイルと同じ名前のファイルが</para>
        ''' <para>ある場合にこのエラーが発生します。</para>
        ''' </remarks>
        Public Const ErrorFileAlready As Integer = -7
        ''' <summary>
        ''' メモリ確保エラーです。
        ''' </summary>
        Public Const ErrorMemory As Integer = -9
        ''' <summary>
        ''' その他のエラーです。
        ''' </summary>
        Public Const ErrorEtc As Integer = -10
        ''' <summary>
        ''' 添付ファイルは存在しません。
        ''' </summary>
        Public Const NoAttachmentFile As Integer = -1

        ''' <summary>
        ''' ヘッダデータのリスト
        ''' </summary>
        Protected _header_list As ArrayList
        ''' <summary>
        ''' 本文データのリスト
        ''' </summary>
        Protected _body_list As ArrayList

        ''' <summary>
        ''' ヘッダーサイズです。
        ''' </summary>
        Protected _header_size As Integer = -1
        ''' <summary>
        ''' エラー番号です。
        ''' </summary>
        Protected _err As Integer
        ''' <summary>
        ''' 添付ファイルを保存するパスです。
        ''' </summary>
        Protected _path As String = Nothing
        ''' <summary>
        ''' メールの件名です。
        ''' </summary>
        Protected _subject As StringBuilder
        ''' <summary>
        ''' メールの送信日時です。
        ''' </summary>
        Protected _date As StringBuilder
        ''' <summary>
        ''' メールの差出人です。
        ''' </summary>
        Protected _from As StringBuilder
        ''' <summary>
        ''' メールのヘッダです。
        ''' </summary>
        Protected _header As StringBuilder
        ''' <summary>
        ''' メールの本文です。
        ''' </summary>
        Protected _body As StringBuilder
        ''' <summary>
        ''' 展開した添付ファイル名です。
        ''' </summary>
        Protected _filename As StringBuilder
        ''' <summary>
        ''' 添付ファイル名のリストです。
        ''' </summary>
        Protected _filename_list As String() = Nothing
        ''' <summary>
        ''' 分割ファイルの ID です。
        ''' </summary>
        Protected _id As StringBuilder
        ''' <summary>
        ''' 展開を開始したかどうかのフラグです。
        ''' </summary>
        Private _attachment_flag As Boolean = False
        ''' <summary>
        ''' Dispose 処理を行ったかどうかのフラグです。
        ''' </summary>
        Private _disposed As Boolean = False
        ''' <summary>
        ''' HTML パートを保存したファイルの名前です。
        ''' </summary>
        Protected _html_file As StringBuilder
        ''' <summary>
        ''' ヘッダフィールド名です。
        ''' </summary>
        Protected _field_name As String
        ''' <summary>
        ''' ヘッダフィールド内容格納バッファです。
        ''' </summary>
        Protected _field As StringBuilder
        ''' <summary>
        ''' message/rfc822 パートを保存したファイルの名前です。
        ''' </summary>
        Protected _rfc822_file As StringBuilder

        <DllImport("nMail.DLL", EntryPoint:="NMailAttachmentFileFirst", CharSet:=CharSet.Auto)> _
        Protected Shared Function AttachmentFileFirst(ByVal Temp As IntPtr, ByVal Subject As StringBuilder, ByVal DateStr As StringBuilder, ByVal From As StringBuilder, ByVal Header As StringBuilder, ByVal Body As StringBuilder, ByVal Path As String, ByVal FileName As StringBuilder, ByVal FirstHeader As String, ByVal FirstBody As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailAttachmentFileNextVB", CharSet:=CharSet.Auto)> _
        Protected Shared Function AttachmentFileNextVB(ByVal Temp As IntPtr, ByVal Subject As StringBuilder, ByVal DateStr As StringBuilder, ByVal From As StringBuilder, ByVal Header As StringBuilder, ByVal Body As StringBuilder, ByVal Path As String, ByVal FileName As StringBuilder, ByVal NextHeader As String, ByVal NextBody As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailAttachmentFileClose")> _
        Protected Shared Function AttachmentFileClose(ByVal Temp As IntPtr) As Boolean
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailAttachmentFileStatus", CharSet:=CharSet.Auto)> _
        Protected Shared Function AttachmentFileStatus(ByVal Header As String, ByVal Id As StringBuilder, ByVal Size As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailGetHeaderField", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3GetHeaderField(ByVal Field As StringBuilder, ByVal Header As String, ByVal Name As String, ByVal Size As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailDecodeHeaderField", CharSet:=CharSet.Auto)> _
        Protected Shared Function Pop3DecodeHeaderField(ByVal Dst As StringBuilder, ByVal Src As String, ByVal Size As Integer) As Integer
        End Function

        ''' <summary>
        ''' ヘッダ格納用バッファのサイズを決定します。
        ''' </summary>
        Protected Sub SetHeaderSize()
            If _header_size < 0 Then
                _header_size = Options.HeaderMax
            End If
            If _header_size <= 0 Then
                _header_size = HeaderSize
                Options.HeaderMax = _header_size
            End If
        End Sub

        ''' <summary>
        ''' <c>Attachment</c>クラスの新規インスタンスを初期化します。
        ''' </summary>
        Public Sub New()
            _header_list = New ArrayList
            _body_list = New ArrayList
        End Sub

        ''' <summary>
        ''' 
        ''' </summary>
        Protected Overrides Sub Finalize()
            MyBase.Finalize()
            Dispose(False)
        End Sub

        ''' <summary>
        ''' <see cref="Attachment"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        Overridable Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        ''' <summary>
        ''' <see cref="Attachment"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        ''' <param name="disposing">
        ''' マネージリソースとアンマネージリソースの両方を解放する場合は<c>true</c>。
        ''' アンマネージリソースだけを解放する場合は<c>false</c>。
        ''' </param>
        Protected Overloads Sub Dispose(ByVal disposing As Boolean)
            If Not _disposed Then
                If disposing Then
                End If
                If _attachment_flag Then
                    AttachmentFileClose(IntPtr.Zero)
                    _attachment_flag = False
                End If
                _disposed = True
            End If
        End Sub

        Public Sub Close()
            If _attachment_flag Then
                AttachmentFileClose(IntPtr.Zero)
                _attachment_flag = False
            End If
        End Sub

        ''' <summary>
        ''' メール本文の合計サイズを取得します。
        ''' </summary>
        ''' <returns>メール本文の合計サイズ</returns>
        Protected Function GetBodySize() As Integer
            Dim size As Integer = 0
            Dim str As String
            Dim no As Integer

            For no = 0 To _header_list.Count - 1
                If no < _body_list.Count Then
                    str = CStr(_body_list(no))
                    size += str.Length
                End If
                str = CStr(_header_list(no))
                size += str.Length
            Next no
            Return size
        End Function

        ''' <summary>
        ''' 添付ファイルを展開して保存します。
        ''' </summary>
        '''	<see cref="Add"/>で元となる文字列（ヘッダ,本文)が追加されていません。
        Public Sub Save()
            Dim read_body As String
            Dim read_header As String
            Dim keep_id As String = ""
            Dim no As Integer
            Dim id_no As Integer = -1

            If Not _path Is Nothing Then
                If (_path <> "") And (Not Directory.Exists(_path)) Then
                    Throw New DirectoryNotFoundException(_path)
                End If
            End If

            SetHeaderSize()

            _subject = New StringBuilder(_header_size)
            _date = New StringBuilder(_header_size)
            _from = New StringBuilder(_header_size)
            _header = New StringBuilder(_header_size)
            _body = New StringBuilder(GetBodySize())
            Options.FileNameMax = MaxPath
            _filename = New StringBuilder(MaxPath)

            If (_header_list.Count <> _body_list.Count) And (_body_list.Count > 0) Then
                Throw New FormatException
            End If
            For no = 0 To _header_list.Count - 1
                If no < _body_list.Count Then
                    read_body = CStr(_body_list(no))
                Else
                    read_body = ""
                End If
                read_header = CStr(_header_list(no))
                If no = 0 Then
                    id_no = GetId(read_header)
                    If id_no > 1 Then
                        Throw New nMailException("Save", ErrorInvalidNo)
                    End If
                    keep_id = PartId
                    _attachment_flag = True
                    _err = AttachmentFileFirst(IntPtr.Zero, _subject, _date, _from, _header, _body, _path, _filename, read_header, read_body)
                Else
                    If (GetId(read_header) <> no + 1) Or (keep_id <> PartId) Then
                        Throw New nMailException("Save", ErrorInvalidNo)
                    End If
                    _err = AttachmentFileNextVB(IntPtr.Zero, _subject, _date, _from, _header, _body, _path, _filename, read_header, read_body)
                End If
                If (_err < 0) And (_err <> ErrorPartial) Then
                    Throw New nMailException("Save", _err)
                End If
            Next no
            If Options.SaveHtmlFile = Options.SaveHtmlFileOn Then
                _html_file = New StringBuilder(_header_size)
                Pop3GetHeaderField(_html_file, _header.ToString(), "X-NMAIL-HTML-FILE:", _header_size)
            End If
            If Options.SaveRfc822File <> Options.SaveRfc822FileOff Then
                _rfc822_file = New StringBuilder(_header_size)
                Pop3GetHeaderField(_rfc822_file, _header.ToString(), "X-NMAIL-RFC822-FILE:", _header_size)
            End If
            AttachmentFileClose(IntPtr.Zero)
            _attachment_flag = False
        End Sub

        ''' <summary>
        ''' 展開元となる分割ファイルデータを内部リストに追加します。
        ''' </summary>
        ''' <param name="header_body">ヘッダー＋本文の文字列</param>
        ''' <remarks>
        '''	ヘッダと本文の間には一行の空行が必要です。
        ''' </remarks>
        Public Sub Add(ByVal header_body As String)
            _header_list.Add(header_body)
        End Sub

        ''' <summary>
        ''' 展開元となる分割ファイルデータを内部リストに追加します。
        ''' </summary>
        ''' <param name="header">ヘッダーの文字列</param>
        ''' <param name="body">本文の文字列</param>
        Public Sub Add(ByVal header As String, ByVal body As String)
            _header_list.Add(header)
            _body_list.Add(body)
        End Sub

        ''' <summary>
        ''' 分割ファイルの ID を取得します。
        ''' </summary>
        ''' <param name="header">ヘッダーの文字列</param>
        ''' <returns><see cref="NoAttachmentFile"/>の場合分割されていない添付ファイル付きメールです。
        ''' 1 以上の場合、分割ファイルの番号となります。
        ''' </returns>
        Public Function GetId(ByVal header As String) As Integer
            _id = New StringBuilder(header.Length)
            Return AttachmentFileStatus(header, _id, header.Length)
        End Function

        ''' <summary>
        ''' メールヘッダから指定のフィールドの内容を取得します。
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <returns>フィールドの内容
        ''' </returns>
        Public Function GetHeaderField(ByVal field_name As String) As String
            _field_name = field_name
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Pop3GetHeaderField(_field, _header.ToString(), _field_name, _header_size)
            If _err < 0 Then
                Throw New nMailException("GetHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' メールヘッダから指定のフィールドの内容を取得します。
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <returns>フィールドの内容
        ''' </returns>
        Public Function GetHeaderField(ByVal field_name As String, ByVal header As String) As String
            _field_name = field_name
            _header = New StringBuilder(header)
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Pop3GetHeaderField(_field, _header.ToString(), _field_name, _header_size)
            If _err < 0 Then
                Throw New nMailException("GetHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' MIME ヘッダフィールドの文字列をデコードします
        ''' </summary>
        ''' <param name="field">フィールドの文字列</param>
        ''' <returns>デコードしたフィールド内容</returns>
        Public Function DecodeHeaderField(ByVal field As String) As String
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Pop3DecodeHeaderField(_field, field, _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' メールヘッダから指定のヘッダフィールドの内容を取得し、
        ''' MIME ヘッダフィールドのデコードを行って返します
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <returns>取得したデコード済みのフィールド内容</returns>
        Public Function GetDecodeHeaderField(ByVal field_name As String) As String
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            Dim src As String = GetHeaderField(field_name, _header.ToString())
            _err = Pop3DecodeHeaderField(_field, src, _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' メールヘッダから指定のヘッダフィールドの内容を取得し、
        ''' MIME ヘッダフィールドのデコードを行って返します
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <param name="header">ヘッダ</param>
        ''' <returns>取得したデコード済みのフィールド内容</returns>
        Public Function GetDecodeHeaderField(ByVal field_name As String, ByVal header As String) As String
            SetHeaderSize()
            _err = Pop3DecodeHeaderField(_field, GetHeaderField(field_name, header), _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' 件名
        ''' </summary>
        ''' <value>メール件名</value>
        Public ReadOnly Property Subject() As String
            Get
                Return _subject.ToString()
            End Get

        End Property
        ''' <summary>
        ''' メールの送信日時の文字列です。
        ''' </summary>
        ''' <value>メール送信日時文字列</value>
        Public ReadOnly Property DateString() As String
            Get
                Return _date.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの差出人です。
        ''' </summary>
        ''' <value>メール差出人</value>
        Public ReadOnly Property From() As String
            Get
                Return _from.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの本文です。
        ''' </summary>
        ''' <value>メール本文</value>
        Public ReadOnly Property Body() As String
            Get
                Return _body.ToString()
            End Get
        End Property

        ''' <summary>
        ''' 添付ファイルを保存するフォルダです。
        ''' </summary>
        ''' <remarks>
        ''' Nothing の場合保存しません。
        ''' </remarks>
        ''' <value>添付ファイル保存フォルダ</value>
        Public Property Path() As String
            Get
                Return _path
            End Get
            Set(ByVal Value As String)
                _path = Value
            End Set
        End Property

        ''' <summary>
        ''' 分割ファイルの ID です。
        ''' </summary>
        ''' <value>分割ファイル ID</value>
        Public ReadOnly Property PartId() As String
            Get
                Return _id.ToString()
            End Get
        End Property

        ''' <summary>
        ''' 添付ファイル名です。
        ''' </summary>
        ''' <remarks>
        ''' 複数の添付ファイルがある場合、"," で区切られて格納されます。
        ''' <see cref="Options.SplitChar"/>で区切り文字を変更できます。
        ''' </remarks>
        ''' <value>添付ファイル名</value>
        Public ReadOnly Property FileName() As String
            Get
                Return _filename.ToString()
            End Get
        End Property

        ''' <summary>
        ''' 添付ファイル名の配列です。
        ''' </summary>
        ''' <value>添付ファイル名</value>
        Public ReadOnly Property FileNameList() As String()
            Get
                If _filename.Length > 0 Then
                    _filename_list = _filename.ToString().Split(Options.SplitChar)
                Else
                    _filename_list = New String() {}
                End If
                Return _filename_list
            End Get
        End Property

        ''' <summary>
        ''' エラー番号
        ''' </summary>
        ''' <value>エラー番号</value>
        Public ReadOnly Property ErrorCode() As Integer
            Get
                Return _err
            End Get
        End Property

        ''' <summary>
        ''' HTML パートを保存したファイルの名前です。
        ''' </summary>
        ''' <value>ファイル名</value>
        Public ReadOnly Property HtmlFile() As String
            Get
                If _html_file Is Nothing Then
                    Return ""
                Else
                    Return _html_file.ToString()
                End If
            End Get
        End Property

        ''' <summary>
        ''' ヘッダのフィールド名です。
        ''' </summary>
        ''' <value>ヘッダのフィールド名</value>
        Public ReadOnly Property FieldName() As String
            Get
                Return _field_name
            End Get
        End Property

        ''' <summary>
        ''' ヘッダフィールドの内容です。
        ''' </summary>
        ''' <value>ヘッダフィールドの内容</value>
        Public ReadOnly Property Field() As String
            Get
                Return _field.ToString()
            End Get
        End Property

        ''' <summary>
        ''' message/rfc822 パートを保存したファイルの名前です。
        ''' </summary>
        ''' <value>ファイル名</value>
        Public ReadOnly Property Rfc822File() As String
            Get
                If _rfc822_file Is Nothing Then
                    Return ""
                Else
                    Return _rfc822_file.ToString()
                End If
            End Get
        End Property
    End Class

    Class Options
        ''' <summary>
        ''' 
        ''' </summary>
        Protected Const MessageSize As Integer = 32768

        ''' <summary>
        ''' オプション：タイムアウト
        ''' </summary>
        Protected Const OptionTimeout As Integer = 0
        ''' <summary>
        ''' オプション：ヘッダサイズ
        ''' </summary>
        Protected Const OptionHeaderMax As Integer = 1
        ''' <summary>
        ''' オプション：本文サイズ
        ''' </summary>
        Protected Const OptionBodyMax As Integer = 2
        ''' <summary>
        ''' オプション：上書きモード
        ''' </summary>
        Protected Const OptionAlreadyFile As Integer = 3
        ''' <summary>
        ''' オプション：デバックモード
        ''' </summary>
        Protected Const OptionDebugMode As Integer = 4
        ''' <summary>
        ''' オプション：接続時タイムアウト
        ''' </summary>
        Protected Const OptionConnectTimeout As Integer = 5
        ''' <summary>
        ''' オプション：区切り文字
        ''' </summary>
        Protected Const OptionSplitChar As Integer = 6
        ''' <summary>
        ''' オプション：一時休止サイズ
        ''' </summary>
        Protected Const OptionSuspendSize As Integer = 7
        ''' <summary>
        ''' オプション：Sleep 時間
        ''' </summary>
        Protected Const OptionSleepTime As Integer = 8
        ''' <summary>
        ''' オプション：フィールドサイズ
        ''' </summary>
        Protected Const OptionFieldMax As Integer = 9
        ''' <summary>
        ''' オプション：HTML パート保存
        ''' </summary>
        Protected Const OptionSaveHtmlFile As Integer = 10
        ''' <summary>
        ''' オプション：本文デコード
        ''' </summary>
        Protected Const OptionDecodeBody As Integer = 11
        ''' <summary>
        ''' オプション：ヘッダデコード
        ''' </summary>
        Protected Const OptionDecodeHeader As Integer = 12
        ''' <summary>
        ''' オプション：添付ファイル名格納バッファサイズ
        ''' </summary>
        Protected Const OptionFileNameMax As Integer = 13
        ''' <summary>
        ''' オプション：添付ファイル名に使用できない文字を置き換える文字
        ''' </summary>
        Protected Const OptionChangeChar As Integer = 14
        ''' <summary>
        ''' オプション：添付ファイル名を置き換える条件
        ''' </summary>
        Protected Const OptionChangeCharMode As Integer = 15
        ''' <summary>
        ''' オプション：message/rfc822 パート保存
        ''' </summary>
        Protected Const OptionSaveRfc822File As Integer = 16

        ''' <summary>
        ''' 同名ファイルを上書きします。
        ''' </summary>
        Public Const FileOverwrite As Integer = 0
        ''' <summary>
        ''' ファイル名の末尾(拡張子の前)に数字を追加して保存します。
        ''' </summary>
        Public Const FileRename As Integer = 1
        ''' <summary>
        ''' ファイルを作成せずエラーとします。
        ''' </summary>
        Public Const FileAlreadyError As Integer = 2

        ''' <summary>
        ''' エラーメッセージを取得します。
        ''' </summary>
        Public Const MessageError As Integer = 0
        ''' <summary>
        ''' デバッグ用のサーバとの交信文字列を取得します。
        ''' </summary>
        Public Const MessageDebug As Integer = 1

        ''' <summary>
        ''' デバックモードが有効です。
        ''' </summary>
        Public Const DebugStart As Integer = 1
        ''' <summary>
        ''' デバックモードが無効です。(初期値)
        ''' </summary>
        Public Const DebugEnd As Integer = 0

        ''' <summary>
        ''' 接続タイムアウトが有効です。
        ''' </summary>
        Public Const ConnectTimeoutOn As Integer = 1
        ''' <summary>
        ''' 接続タイムアウトが無効です。(初期値)
        ''' </summary>
        Public Const ConnectTimeoutOff As Integer = 0

        ''' <summary>
        ''' HTML パートをファイルに保存します。
        ''' </summary>
        Public Const SaveHtmlFileOn As Integer = 1
        ''' <summary>
        ''' HTML パートをファイルに保存しません。
        ''' </summary>
        Public Const SaveHtmlFileOff As Integer = 0
        ''' <summary>
        ''' 本文は全てデコードします。
        ''' </summary>
        Public Const DecodeBodyOn As Integer = 0
        ''' <summary>
        ''' 本文は全てデコードしません。
        ''' </summary>
        Public Const DecodeBodyAllOff As Integer = 1
        ''' <summary>
        ''' テキストパートの Content-Transfer-Encoding (Quoted-Printable と BASE64) のみデコードしません。
        ''' </summary>
        Public Const DecodeBodyTextOff As Integer = 2
        ''' <summary>
        ''' ヘッダは全てデコードします。
        ''' </summary>
        Public Const DecodeHeaderOn As Integer = 0
        ''' <summary>
        ''' ヘッダは全てデコードしませんが、行の連結は行います。
        ''' </summary>
        Public Const DecodeHeaderOff As Integer = 1
        ''' <summary>
        ''' ヘッダは全てデコードせず、行の連結も行いません。
        ''' </summary>
        Public Const DecodeHeaderAllOff As Integer = 2

        ''' <summary>
        ''' 使用不可な文字と区切り文字を置き換えます。(初期値)
        ''' </summary>
        Public Const ChangeSplitChar As Integer = 0
        ''' <summary>
        ''' 半角スペースを置き換えます。
        ''' </summary>
        Public Const ChangeHalfSpace As Integer = 1
        ''' <summary>
        ''' 全角スペースを置き換えます。
        ''' </summary>
        Public Const ChangeFullSpace As Integer = 2
        ''' <summary>
        ''' 半角・全角スペースを置き換えます。
        ''' </summary>
        Public Const ChangeAllSpace As Integer = 3
        ''' <summary>
        ''' 区切り文字を置き換えません。
        ''' </summary>
        Public Const ChangeNoSplitChar As Integer = 4

        ''' <summary>
        ''' message/rfc822 パートをまとめてファイルに保存します。
        ''' </summary>
        Public Const SaveRfc822FileAllOn As Integer = 2
        ''' <summary>
        ''' message/rfc822 パートのテキスト部分をファイルに保存します。
        ''' </summary>
        Public Const SaveRfc822FileBodyOn As Integer = 1
        ''' <summary>
        ''' message/rfc822 パートをファイルに保存しません。
        ''' </summary>
        Public Const SaveRfc822FileOff As Integer = 0

        <DllImport("nMail.DLL", EntryPoint:="NMailGetVersion")> _
        Public Shared Function GetVersion() As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailGetOption")> _
        Public Shared Function GetOption(ByVal opt As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailSetOption")> _
        Public Shared Function SetOption(ByVal opt As Integer, ByVal value As Integer) As Boolean
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailGetMessage", CharSet:=CharSet.Auto)> _
        Public Shared Sub GetMessage(ByVal Type As Integer, ByVal Message As StringBuilder, ByVal Size As Integer)
        End Sub

        <DllImport("nMail.DLL", EntryPoint:="NMailGetSuspendNumber", CharSet:=CharSet.Auto)> _
        Public Shared Function GetSuspendNumber(ByVal Path As String) As Integer
        End Function

        ''' <summary>
        ''' デバックモードを開始します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="EndDebug"/>を呼び出した後に <see cref="DebugMessage"/>
        ''' を参照することによってサーバとの交信文字列を取得できます。
        ''' </remarks>
        Public Shared Sub StartDebug()
            SetOption(OptionDebugMode, DebugStart)
        End Sub

        ''' <summary>
        ''' デバックモードを終了します。
        ''' </summary>
        ''' <remarks>
        ''' 呼び出し後に <see cref="DebugMessage"/> を参照することによってサーバ
        ''' との交信文字列を取得できます。
        ''' </remarks>
        Public Shared Sub EndDebug()
            SetOption(OptionDebugMode, DebugEnd)
        End Sub

        ''' <summary>
        ''' 接続時タイムアウト設定を有効にします。
        ''' </summary>
        Public Shared Sub EnableConnectTimeout()
            SetOption(OptionConnectTimeout, ConnectTimeoutOn)
        End Sub

        ''' <summary>
        ''' 接続時タイムアウト設定を無効にします。
        ''' </summary>
        Public Shared Sub DisableConnectTimeout()
            SetOption(OptionConnectTimeout, ConnectTimeoutOff)
        End Sub
        ''' <summary>
        ''' HTML パートをファイルに保存します。
        ''' </summary>
        Public Shared Sub EnableSaveHtmlFile()
            SetOption(OptionSaveHtmlFile, SaveHtmlFileOn)
        End Sub
        ''' <summary>
        ''' HTML パートをファイルに保存しません。
        ''' </summary>
        Public Shared Sub DisableSaveHtmlFile()
            SetOption(OptionSaveHtmlFile, SaveHtmlFileOff)
        End Sub
        ''' <summary>
        ''' 本文をデコードします。
        ''' </summary>
        Public Shared Sub EnableDecodeBody()
            SetOption(OptionDecodeBody, DecodeBodyOn)
        End Sub
        ''' <summary>
        ''' 本文をデコードしません。
        ''' </summary>
        Public Shared Sub DisableDecodeBodyAll()
            SetOption(OptionDecodeBody, DecodeBodyAllOff)
        End Sub
        ''' <summary>
        ''' テキストパートの Content-Transfer-Encoding (Quoted-Printable と BASE64) をデコードしません。
        ''' </summary>
        Public Shared Sub DisableDecodeBodyText()
            SetOption(OptionDecodeBody, DecodeBodyTextOff)
        End Sub
        ''' <summary>
        ''' ヘッダをデコードします。
        ''' </summary>
        Public Shared Sub EnableDecodeHeader()
            SetOption(OptionDecodeHeader, DecodeHeaderOn)
        End Sub
        ''' <summary>
        ''' ヘッダをデコードしませんが、行の連結は行います。
        ''' </summary>
        Public Shared Sub DisableDecodeHeader()
            SetOption(OptionDecodeHeader, DecodeHeaderOff)
        End Sub
        ''' <summary>
        ''' ヘッダをデコードせず、行の連結も行いません。
        ''' </summary>
        Public Shared Sub DisableDecodeHeaderAll()
            SetOption(OptionDecodeHeader, DecodeHeaderAllOff)
        End Sub
        ''' <summary>
        ''' message/rfc822 パートをまとめてファイルに保存します。
        ''' </summary>
        Public Shared Sub EnableSaveRfc822FileAll()
            SetOption(OptionSaveRfc822File, SaveRfc822FileAllOn)
        End Sub
        ''' <summary>
        ''' message/rfc822 パートのテキスト部分をファイルに保存します。
        ''' </summary>
        Public Shared Sub EnableSaveRfc822FileBody()
            SetOption(OptionSaveRfc822File, SaveRfc822FileBodyOn)
        End Sub
        ''' <summary>
        ''' message/rfc822 パートをファイルに保存しません。
        ''' </summary>
        Public Shared Sub DisableSaveRfc822File()
            SetOption(OptionSaveRfc822File, SaveRfc822FileOff)
        End Sub

        ''' <summary>
        ''' 指定されたファイルを添付したメールを送信する場合の休止回数を得る
        ''' </summary>
        ''' <param name="file_name">添付ファイル名</param>
        ''' <returns>指定されたファイルを添付したメールを送信する場合の休止回数を得る</returns>
        Public Shared Function SuspendCount(ByVal file_name As String) As Integer
            If Not File.Exists(file_name) Then
                Throw New FileNotFoundException
            End If
            Return GetSuspendNumber(file_name)
        End Function

        ''' <summary>
        ''' バージョンの数値です。
        ''' </summary>
        ''' <remarks>
        ''' nMail.DLL のバージョンの数値です。
        ''' Version 1.23 の場合 123 となります。
        ''' </remarks>
        ''' <value>バージョン数値</value>
        Public Shared ReadOnly Property VersionInt() As Integer
            Get
                Return GetVersion()
            End Get
        End Property

        ''' <summary>
        ''' バージョンの文字列です。
        ''' </summary>
        ''' <remarks>
        ''' nMail.DLL のバージョンの文字列です。
        ''' Version 1.23 の場合 "1.23" となります。
        ''' </remarks>
        ''' <value>バージョン文字列</value>
        Public Shared ReadOnly Property Version() As String
            Get
                Dim str As String
                Dim ver As Integer
                ver = GetVersion()
                str = String.Format("{0:d}.{1:d}", ver / 100, ver Mod 100)
                Return str
            End Get
        End Property

        ''' <summary>
        ''' エラーメッセージです。
        ''' </summary>
        ''' <remarks>
        ''' エラー発生時にサーバから返ってきたエラーメッセージです。
        ''' </remarks>
        ''' <value>エラーメッセージ</value>
        Public Shared ReadOnly Property ErrorMessage() As String
            Get
                Dim message As StringBuilder
                message = New StringBuilder(MessageSize)
                GetMessage(MessageError, message, MessageSize)
                Return message.ToString()
            End Get
        End Property

        ''' <summary>
        ''' デバック用文字列です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="StartDebug"/>を呼び出した後にメールの送受信処理を行い、
        ''' <see cref="EndDebug"/>を呼び出した後にこのプロパティを参照すること
        ''' によってサーバとの交信文字列を取得することができます。
        ''' </remarks>
        ''' <value>デバック用文字列</value>
        Public Shared ReadOnly Property DebugMessage() As String
            Get
                Dim message As StringBuilder
                message = New StringBuilder(MessageSize)
                GetMessage(MessageDebug, message, MessageSize)
                Return message.ToString()
            End Get
        End Property

        ''' <summary>
        ''' 応答タイムアウト値です。
        ''' </summary>
        ''' <remarks>
        ''' この設定値より長い時間サーバから応答が無い場合、
        ''' タイムアウトエラーとして処理を返します。
        ''' 単位は秒です。
        ''' 接続時のタイムアウトは通常は無効です。
        ''' 有効にしたい場合、<see cref="EnableConnectTimeout"/>
        ''' を呼び出してください。
        ''' </remarks>
        ''' <value>応答タイムアウト値</value>
        Public Shared Property Timeout() As Integer
            Get
                Return GetOption(OptionTimeout)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionTimeout, Value)
            End Set
        End Property

        ''' <summary>
        ''' ヘッダバッファサイズです。
        ''' </summary>
        ''' <remarks>
        ''' メール受信や添付ファイル展開時にヘッダデータを格納する
        ''' バッファのサイズです。
        ''' 基本的に<see cref="Pop3"/>クラスでメールの受信を行う場合、内部で
        ''' バッファサイズの設定を行いますので、このプロパティを
        ''' 使用する必要はありません。
        ''' </remarks>
        ''' <value>ヘッダバッファサイズ</value>
        Public Shared Property HeaderMax() As Integer
            Get
                Return GetOption(OptionHeaderMax)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionHeaderMax, Value)
            End Set
        End Property

        ''' <summary>
        ''' 本文バッファサイズです。
        ''' </summary>
        ''' <remarks>
        ''' メール受信や添付ファイル展開時にヘッダデータを格納する
        ''' 本文のサイズです。
        ''' 基本的に<see cref="Pop3"/>クラスでメールの受信を行う場合、内部で
        ''' メールサイズに応じたバッファサイズの指定を行いますので、
        ''' このプロパティを使用する必要はありません。
        ''' </remarks>
        ''' <value>本文バッファサイズ</value>
        Public Shared Property BodyMax() As Integer
            Get
                Return GetOption(OptionBodyMax)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionBodyMax, Value)
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイル保存時に同名ファイルがあった場合の処理方法です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="FileOverwrite"/>同名ファイルを上書きします。
        ''' <see cref="FileRename"/>ファイル名の末尾(拡張子の前)に数字を追加します。
        ''' <see cref="FileAlreadyError"/>ファイルを作成せずエラーとします。
        ''' </remarks>
        ''' <value>添付ファイル保存時の同名ファイル処理方法</value>
        Public Shared Property AlreadyFile() As Integer
            Get
                Return GetOption(OptionAlreadyFile)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionAlreadyFile, Value)
            End Set
        End Property

        ''' <summary>
        ''' デバックモード
        ''' </summary>
        ''' <remarks>
        ''' <see cref="DebugStart"/>デバックモードが有効です。
        ''' <see cref="DebugEnd"/>デバックモードが無効です。
        ''' </remarks>
        ''' <value>デバックモード</value>
        Public Shared Property DebugMode() As Integer
            Get
                Return GetOption(OptionDebugMode)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionDebugMode, Value)
            End Set
        End Property

        ''' <summary>
        ''' サーバ接続時のタイムアウト値です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="ConnectTimeoutOn"/>接続タイムアウトが有効です。
        ''' <see cref="ConnectTimeoutOff"/>接続タイムアウトが無効です。
        ''' </remarks>
        ''' <value>サーバ接続時のタイムアウト値</value>
        Public Shared Property ConnectTimeout() As Integer
            Get
                Return GetOption(OptionConnectTimeout)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionConnectTimeout, Value)
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイルの区切り文字です。
        ''' </summary>
        ''' <remarks>
        ''' 添付ファイルが複数ある場合の区切り文字です。
        '''	デフォルト値は , です。
        ''' </remarks>
        ''' <value>添付ファイル区切り文字</value>
        Public Shared Property SplitChar() As Char
            Get
                Return Chr(GetOption(OptionSplitChar))
            End Get
            Set(ByVal Value As Char)
                SetOption(OptionSplitChar, Val(Value))
            End Set
        End Property

        ''' <summary>
        ''' 送受信の際に一旦処理を戻すデータサイズです。
        ''' </summary>
        ''' <remarks>
        ''' 添付ファイルがある場合、ここで指定したサイズのデータを
        ''' 送受信すると、一旦処理を戻します。
        ''' </remarks>
        ''' <value>送受信の際に一旦処理を戻すデータサイズ</value>
        Public Shared Property SuspendSize() As Integer
            Get
                Return GetOption(OptionSuspendSize)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionSuspendSize, Value)
            End Set
        End Property

        ''' <summary>
        ''' サーバからの返答待ちの際に入れる Sleep() の時間です。
        ''' </summary>
        ''' <value>サーバからの返答待ちの際に入れる Sleep() の時間</value>
        Public Shared Property SleepTime() As Integer
            Get
                Return GetOption(OptionSleepTime)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionSleepTime, Value)
            End Set
        End Property

        ''' <summary>
        ''' フィールドバッファのサイズです。
        ''' </summary>
        ''' <value>フィールドバッファのサイズ</value>
        Public Shared Property FieldMax() As Integer
            Get
                Return GetOption(OptionFieldMax)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionFieldMax, Value)
            End Set
        End Property

        ''' <summary>
        ''' HTML メールの HTML パートをファイルに保存するかどうかの設定です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SaveHtmlFileOff"/>HTML パートをファイルに保存しない。(初期値)
        ''' <see cref="SaveHtmlFileOn"/>HTML パートをファイルに保存する。
        ''' Attachment クラスを使って HTML パートをファイルに保存する場合、
        ''' EnableSaveHtmlFile() を呼び出した後で <see cref="Pop3.GetMail"/> 
        ''' で読み出したメールデータを使用する必要があります。
        ''' </remarks>
        ''' <value>HTML パートをファイルに保存するかどうかの設定値</value>
        Public Shared Property SaveHtmlFile() As Integer
            Get
                Return GetOption(OptionSaveHtmlFile)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionSaveHtmlFile, Value)
            End Set
        End Property
        ''' <summary>
        ''' 本文のデコードの設定です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="DecodeBodyOn"/>全てデコードします。(初期値)
        ''' <see cref="DecodeBodyAllOff"/>全てデコードしません。本文のテキストも iso-2022-jp のままとなります。
        ''' <see cref="DecodeBodyTextOff"/>テキストパートの Content-Transfer-Encoding (Quoted-Printable と BASE64) のみデコードしません。
        ''' </remarks>
        ''' <value>本文をデコードするかどうかの設定値</value>
        Public Shared Property DecodeBody() As Integer
            Get
                Return GetOption(OptionDecodeBody)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionDecodeBody, Value)
            End Set
        End Property
        ''' <summary>
        ''' ヘッダのデコードの設定です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="DecodeHeaderOn"/>全てデコードします。(初期値)
        ''' <see cref="DecodeHeaderOff"/>全てデコードしませんが、行の連結は行います。
        ''' <see cref="DecodeHeaderAllOff"/>全てデコードせず、行の連結も行いません。
        ''' </remarks>
        ''' <value>ヘッダをデコードするかどうかの設定値</value>
        Public Shared Property DecodeHeader() As Integer
            Get
                Return GetOption(OptionDecodeHeader)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionDecodeHeader, Value)
            End Set
        End Property
        ''' <summary>
        ''' 添付ファイル名格納バッファサイズです。
        ''' </summary>
        ''' <remarks>
        ''' 添付ファイル名を格納するバッファのサイズです。
        ''' <see cref="Pop3"/>や<see cref="Imap4"/>クラスでメールの受信を行ったり、
        ''' <see cref="Attachment"/>クラスで添付ファイルの展開を行う場合、
        ''' 内部でバッファサイズの設定を行いますので、
        ''' このプロパティを使用する必要はありません。
        ''' </remarks>
        ''' <value>添付ファイル名格納バッファサイズ</value>
        Public Shared Property FileNameMax() As Integer
            Get
                Return GetOption(OptionFileNameMax)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionFileNameMax, Value)
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイル名に使用できない文字を置き換える文字
        ''' </summary>
        ''' <remarks>
        ''' 添付ファイル名に使用できない文字を置き換える文字です。
        '''	デフォルト値は _ です。
        ''' </remarks>
        ''' <value>置き換え文字</value>
        Public Shared Property ChangeChar() As Char
            Get
                Return Chr(GetOption(OptionChangeChar))
            End Get
            Set(ByVal Value As Char)
                SetOption(OptionChangeChar, Val(Value))
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイル名を置き換える条件
        ''' </summary>
        ''' <remarks>
        ''' 添付ファイル名を置き換える条件です。
        ''' デフォルト値は<see cref="ChangeSplitChar"/>で、
        ''' Windows でファイル名に使用できない文字と、区切り文字に
        ''' 使用している文字を置き換えます。
        ''' </remarks>
        ''' <value>置き換え条件</value>
        Public Shared Property ChangeCharMode() As Integer
            Get
                Return GetOption(OptionChangeCharMode)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionChangeCharMode, Value)
            End Set
        End Property

        ''' <summary>
        ''' message/rfc822 パートをファイルに保存するかどうかの設定です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SaveRfc822FileOff"/>message/rfc822 パートをファイルに保存しない。(初期値)
        ''' <see cref="SaveRfc822FileBodyOn"/>message/rfc822 パートのテキスト部分をファイルに保存する。
        ''' <see cref="SaveRfc822FileAllOn"/>message/rfc822 パートを全てファイルに保存する。
        ''' SaveRfc822FileAllOn で message/rfc822 パートを全てファイルに保存した場合、
        ''' Attachment クラスを使って添付ファイルを取り出す事ができます。
        ''' </remarks>
        ''' <value>message/rfc822 パートをファイルに保存するかどうかの設定値</value>
        Public Shared Property SaveRfc822File() As Integer
            Get
                Return GetOption(OptionSaveRfc822File)
            End Get
            Set(ByVal Value As Integer)
                SetOption(OptionSaveRfc822File, Value)
            End Set
        End Property
    End Class

    ''' <summary>
    ''' IMAP4rev1 メール受信クラス
    ''' </summary>
    Class Imap4
        Implements IDisposable
        ''' <summary>
        ''' ヘッダ領域のサイズです。
        ''' </summary>
        Protected Const HeaderSize As Integer = 32768
        ''' <summary>
        ''' パス文字列のサイズです。
        ''' </summary>
        Protected Const MaxPath As Integer = 32768
        ''' <summary>
        ''' ソケットエラーもしくは未接続状態です。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Connect"/>を呼び出さずに<see cref="GetMail"/>等を、</para>
        ''' <para>呼び出したり、なんらかの理由で接続が切断されるとこのエラーとなります。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorSocket As Integer = -1
        ''' <summary>
        ''' 認証エラーです。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Authenticate"/>呼び出しで認証に失敗した場合</para>
        ''' <para>このエラーとなります。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorAuthenticate As Integer = -2
        ''' <summary>
        ''' 番号で指定されたメールが存在しません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>で指定した番号のメールが存在しないとこのエラーとなります。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorInvalidNo As Integer = -3
        ''' <summary>
        ''' タイムアウトエラーです。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Options.Timeout"/>で指定した値より長い時間サーバから応答が</para>
        ''' <para>ない場合、このエラーが発生します。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorTimeout As Integer = -4
        ''' <summary>
        ''' 添付ファイルが開けません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Path"/>で指定したフォルダに添付ファイルが書き込めない</para>
        ''' <para>ない場合、このエラーが発生します。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorFileOpen As Integer = -5
        ''' <summary>
        ''' 添付ファイルと同名のファイルがフォルダに存在します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="nMail.Options.AlreadyFile"/> に <see cref="nMail.Options.FileAlreadyError"/></para>
        ''' <para>を設定し、<see cref="Path"/>で指定したフォルダに添付ファイルと同じ名前のファイルが</para>
        ''' <para>ある場合にこのエラーが発生します。</para>
        ''' <para><see cref="nMailException.ErrorCode"/>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorFileAlready As Integer = -7
        ''' <summary>
        ''' サーバが指定した認証形式に対応していません。
        ''' </summary>
        Public Const ErrorAuthenticateNoSupport As Integer = -8
        ''' <summary>
        ''' メモリ確保エラーです。
        ''' </summary>
        ''' <remarks>
        ''' 内部で文字コードを変換するためのメモリを確保できませんでした。
        ''' </remarks>
        Public Const ErrorMemory As Integer = -9
        ''' <summary>
        ''' その他のエラーです。
        ''' </summary>
        Public Const ErrorEtc As Integer = -10
        ''' <summary>
        ''' パラメータが正しくありません。
        ''' </summary>
        ''' <remarks>
        ''' パラメータが正しくありません。
        ''' </remarks>
        Public Const ErrorInvalidParameter As Integer = -11
        ''' <summary>
        ''' IMAP4 サーバ応答エラー NO
        ''' </summary>
        ''' <remarks>
        ''' IMAP4 サーバが NO を返しました。
        ''' </remarks>
        Public Const ErrorResponseNo As Integer = -12
        ''' <summary>
        ''' IMAP4 サーバ応答エラー BAD
        ''' </summary>
        ''' <remarks>
        ''' IMAP4 サーバが Bad を返しました。
        ''' </remarks>
        Public Const ErrorResponseBad As Integer = -13
        ''' <summary>
        ''' 名前空間が存在しません
        ''' </summary>
        Public Const ErrorNoNameSpace As Integer = -14
        ''' <summary>
        ''' 添付ファイル受信中でまだ残りがある状態です。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="Flag"/>に<see cref="SuspendAttachmentFile"/>または</para>
        ''' <para><see cref="SuspendNext"/>を指定し<see cref="GetMail"/></para>
        ''' <para>を呼び出した場合、まだメールの残りがある場合、<see cref="nMailException.ErrorCode"/></para>
        ''' <para>に設定されます。</para>
        ''' </remarks>
        Public Const ErrorSuspendAttachmentFile As Integer = -20
        ''' <summary>
        ''' 該当する項目がありません。
        ''' </summary>
        ''' <remarks>
        ''' 該当する項目は存在しません。
        ''' </remarks>
        Public Const ErrorNoResult As Integer = -21
        ''' <summary>
        ''' 認証で PLAIN を使用します。
        ''' </summary>
        Public Const AuthPlain As Integer = 1
        ''' <summary>
        ''' 認証で LOGIN を使用します。
        ''' </summary>
        Public Const AuthLogin As Integer = 2
        ''' <summary>
        ''' 認証で CRAM MD5 を使用します。
        ''' </summary>
        Public Const AuthCramMd5 As Integer = 4
        ''' <summary>
        ''' 認証で DIGEST MD5 を使用します。
        ''' </summary>
        Public Const AuthDigestMd5 As Integer = 8
        ''' <summary>
        ''' 認証で OAuth2 を使用します。
        ''' </summary>
        Public Const AuthOAuth2 As Integer = 16
        ''' <summary>
        ''' 実行成功
        ''' </summary>
        ''' <para>各種メソッドが成功を返した場合、<see cref="nMailException.ErrorCode"/>に設定される値です。</para>
        Public Const Success As Integer = 1
        ''' <summary>
        ''' 添付ファイル受信で一時休止ありの一回目に指定します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const SuspendAttachmentFile As Integer = 4
        ''' <summary>
        ''' 添付ファイル受信で一時休止ありの二回目以降に指定します。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMail"/>の前に、<see cref="Flag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const SuspendNext As Integer = 8
        ''' <summary>
        ''' メール追加時に日時フィールドを nMail.DLL 内で生成します。
        ''' </summary>
        Public Const AddDateField As Integer = 1
        ''' <summary>
        ''' メール追加時にMessage-ID フィールドを nMail.DLL 内で生成します。
        ''' </summary>
        Public Const AddMessageId As Integer = 2
        ''' <summary>
        ''' MIME パート保存で引数のパスでファイル名も指定します。
        ''' </summary>
        Private Const MimeSaveAsFile As Integer = &H800
        ''' <summary>
        ''' MIME パート取得で既読フラグを立てません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMimePart"/>の前に、<see cref="MimeFlag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const MimePeek As Integer = &H1000
        ''' <summary>
        ''' MIME パート取得でデコードしません。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="GetMimePart"/>の前に、<see cref="MimeFlag"/>に設定しておきます。</para>
        ''' </remarks>
        Public Const MimeNoDecode As Integer = &H2000
        ''' <summary>
        ''' MIME パート取得でヘッダのみ取得します。
        ''' </summary>
        Private Const MimeHeader As Integer = &H4000
        ''' <summary>
        ''' メール番号ではなく UID を使用します。
        ''' </summary>
        Public Const UseUidValue As Integer = &H8000
        ''' <summary>
        ''' メールボックスフラグ　選択できないメールボックスです。
        ''' </summary>
        Public Const MailBoxNoSelect As Integer = 1
        ''' <summary>
        ''' メールボックスフラグ　子メールボックスを作成できません。
        ''' </summary>
        Public Const MailBoxNoInferious As Integer = 2
        ''' <summary>
        ''' メールボックスフラグ　メッセージが追加されている可能性があります。
        ''' </summary>
        Public Const MailBoxMarked As Integer = 4
        ''' <summary>
        ''' メールボックスフラグ　メッセージが追加されていません。
        ''' </summary>
        Public Const MailBoxUnMarked As Integer = 8
        ''' <summary>
        ''' メールボックスフラグ　子メールボックスが存在します。
        ''' </summary>
        Public Const MailBoxChildren As Integer = 16
        ''' <summary>
        ''' メールボックスフラグ　子メールボックスが存在しません。
        ''' </summary>
        Public Const MailBoxNoChildren As Integer = 32
        ''' <summary>
        ''' メールメッセージフラグ　返信済みフラグ付きです。
        ''' </summary>
        Public Const MessageAnswerd As Integer = 1
        ''' <summary>
        ''' メールメッセージフラグ　消去マーク付きです。
        ''' </summary>
        Public Const MessageDeleted As Integer = 2
        ''' <summary>
        ''' メールメッセージフラグ　草稿フラグ付きです。
        ''' </summary>
        Public Const MessageDraft As Integer = 4
        ''' <summary>
        ''' メールメッセージフラグ　重要性フラグ付きです。
        ''' </summary>
        Public Const MessageFlagged As Integer = 8
        ''' <summary>
        ''' メールメッセージフラグ　到着フラグ付きです。
        ''' </summary>
        Public Const MessageRecent As Integer = 16
        ''' <summary>
        ''' メールメッセージフラグ　既読フラグ付きです。
        ''' </summary>
        Public Const MessageSeen As Integer = 32
        ''' <summary>
        ''' メール検索　返信済み
        ''' </summary>
        Public Const SearchAnswered As Integer = 1
        ''' <summary>
        ''' メール検索　返信済みでない
        ''' </summary>
        Public Const SearchUnAnswered As Integer = 2
        ''' <summary>
        ''' メール検索　消去マーク付き
        ''' </summary>
        Public Const SearchDeleted As Integer = 3
        ''' <summary>
        ''' メール検索　消去マークなし
        ''' </summary>
        Public Const SearchUnDeleted As Integer = 4
        ''' <summary>
        ''' メール検索　草稿フラグあり
        ''' </summary>
        Public Const SearchDraft As Integer = 5
        ''' <summary>
        ''' メール検索　草稿フラグなし
        ''' </summary>
        Public Const SearchUnDraft As Integer = 6
        ''' <summary>
        ''' メール検索　重要性フラグあり
        ''' </summary>
        Public Const SearchFlagged As Integer = 7
        ''' <summary>
        ''' メール検索　重要性フラグなし
        ''' </summary>
        Public Const SearchUnFlagged As Integer = 8
        ''' <summary>
        ''' メール検索　到着フラグあり
        ''' </summary>
        Public Const SearchRecent As Integer = 9
        ''' <summary>
        ''' メール検索　到着フラグなし
        ''' </summary>
        Public Const SearchUnRecent As Integer = 10
        ''' <summary>
        ''' メール検索　既読フラグあり
        ''' </summary>
        Public Const SearchSeen As Integer = 11
        ''' <summary>
        ''' メール検索　既読フラグなし
        ''' </summary>
        Public Const SearchUnSeen As Integer = 12
        ''' <summary>
        ''' メール検索　到着フラグありかつ既読フラグなし
        ''' </summary>
        Public Const SearchNew As Integer = 13
        ''' <summary>
        ''' メール検索　全てのメール
        ''' </summary>
        Public Const SearchAll As Integer = 14
        ''' <summary>
        ''' メール検索　指定されたキーワードあり
        ''' </summary>
        Public Const SearchKeyword As Integer = 15
        ''' <summary>
        ''' メール検索　指定されたキーワードなし
        ''' </summary>
        Public Const SearchUnKeyword As Integer = 16
        ''' <summary>
        ''' メール検索　From ヘッダに指定の文字列あり
        ''' </summary>
        Public Const SearchFrom As Integer = 17
        ''' <summary>
        ''' メール検索　To ヘッダに指定の文字列あり
        ''' </summary>
        Public Const SearchTo As Integer = 18
        ''' <summary>
        ''' メール検索　CC ヘッダに指定の文字列あり
        ''' </summary>
        Public Const SearchCc As Integer = 19
        ''' <summary>
        ''' メール検索　BCC ヘッダに指定の文字列あり
        ''' </summary>
        Public Const SearchBcc As Integer = 20
        ''' <summary>
        ''' メール検索　SUBJECT ヘッダに指定の文字列あり
        ''' </summary>
        Public Const SearchSubject As Integer = 21
        ''' <summary>
        ''' メール検索　DATE ヘッダが指定された年月日以前
        ''' </summary>
        Public Const SearchSentBefore As Integer = 22
        ''' <summary>
        ''' メール検索　DATE ヘッダが指定された年月日
        ''' </summary>
        Public Const SearchSentOn As Integer = 23
        ''' <summary>
        ''' メール検索　DATE ヘッダが指定された年月日以降
        ''' </summary>
        Public Const SearchSentSince As Integer = 24
        ''' <summary>
        ''' メール検索　指定された年月日以前に到着
        ''' </summary>
        Public Const SearchBefore As Integer = 25
        ''' <summary>
        ''' メール検索　指定された年月日に到着
        ''' </summary>
        Public Const SearchOn As Integer = 26
        ''' <summary>
        ''' メール検索　指定された年月日以降に到着
        ''' </summary>
        Public Const SearchSince As Integer = 27
        ''' <summary>
        ''' メール検索　指定されたヘッダフィールドに文字列を含む 検索文字列に"ヘッダフィールド 文字列"と指定してください
        ''' </summary>
        Public Const SearchHeader As Integer = 28
        ''' <summary>
        ''' メール検索　本文に文字列を含む
        ''' </summary>
        Public Const SearchBody As Integer = 29
        ''' <summary>
        ''' メール検索　ヘッダおよび本文に文字列を含む
        ''' </summary>
        Public Const SearchText As Integer = 30
        ''' <summary>
        ''' メール検索　指定サイズより大きなメール
        ''' </summary>
        Public Const SearchLager As Integer = 31
        ''' <summary>
        ''' メール検索　指定サイズより小さなメール
        ''' </summary>
        Public Const SearchSmaller As Integer = 32
        ''' <summary>
        ''' メール検索　指定 UID のメール
        ''' </summary>
        Public Const SearchUid As Integer = 33
        ''' <summary>
        ''' メール検索　検索文字列を直接指定
        ''' </summary>
        Public Const SearchCommand As Integer = &H100
        ''' <summary>
        ''' メール検索　検索条件 NOT
        ''' </summary>
        Public Const SearchNot As Integer = &H200
        ''' <summary>
        ''' メール検索　検索条件 OR
        ''' </summary>
        Public Const SearchOr As Integer = &H400
        ''' <summary>
        ''' メール検索　検索条件 AND
        ''' </summary>
        Public Const SearchAnd As Integer = &H800
        ''' <summary>
        ''' メール検索　検索条件ワーク初期化
        ''' </summary>
        Public Const SearchFirst As Integer = &H1000
        ''' <summary>
        ''' メール検索　検索コマンド発行後すぐに戻る
        ''' </summary>
        Public Const SearchNoWait As Integer = &H2000
        ''' <summary>
        ''' メール検索　検索結果チェック
        ''' </summary>
        Public Const SearchCheck As Integer = &H4000
        ''' <summary>
        ''' 個人名前空間
        ''' </summary>
        Public Const NameSpacePersonal As Integer = 0
        ''' <summary>
        ''' 他人名前空間
        ''' </summary>
        Public Const NameSpaceOther As Integer = 1
        ''' <summary>
        ''' 共有名前空間
        ''' </summary>
        Public Const NameSpaceShared As Integer = 2
        ''' <summary>
        ''' 名前空間数
        ''' </summary>
        Public Const NameSpaceMax As Integer = 3
        ''' <summary>
        ''' 個人名前空間　数取得
        ''' </summary>
        Public Const NameSpacePersonalCount As Integer = &H1000
        ''' <summary>
        ''' 他人名前空間　数取得
        ''' </summary>
        Public Const NameSpaceOtherCount As Integer = &H2000
        ''' <summary>
        ''' 共有名前空間　数取得
        ''' </summary>
        Public Const NameSpaceSharedCount As Integer = &H3000
        ''' <summary>
        ''' 個人名前空間　個別取得
        ''' </summary>
        Public Const NameSpacePersonalNo As Integer = &H100
        ''' <summary>
        ''' 他人名前空間　個別取得
        ''' </summary>
        Public Const NameSpaceOtherNo As Integer = &H200
        ''' <summary>
        ''' 共有名前空間　個別取得
        ''' </summary>
        Public Const NameSpaceSharedNo As Integer = &H300
        ''' <summary>
        ''' メールメッセージフラグを追加します。
        ''' </summary>
        Private Const AddMessage As Integer = 1
        ''' <summary>
        ''' メールメッセージフラグを削除します。
        ''' </summary>
        Private Const DeleteMessage As Integer = 2
        ''' <summary>
        ''' メールメッセージフラグを置き換えます。
        ''' </summary>
        Private Const ReplaceMessage As Integer = 3
        ''' <summary>
        ''' メールボックスの総メッセージ数を取得します。
        ''' </summary>
        Private Const MailBoxMessage As Integer = 1
        ''' <summary>
        ''' メールボックスの新着メッセージ数を取得します。
        ''' </summary>
        Private Const MailBoxRecent As Integer = 2
        ''' <summary>
        ''' メールボックスの新しいメッセージの UID を取得します。
        ''' </summary>
        Private Const MailBoxNextUid As Integer = 3
        ''' <summary>
        ''' メールボックスの UID Validity 値を取得します。
        ''' </summary>
        Private Const MailBoxUidValidity As Integer = 4
        ''' <summary>
        ''' メールボックスの未読メッセージ数を取得します。
        ''' </summary>
        Private Const MailBoxUnSeen As Integer = 5
        ''' <summary>
        ''' ボディ構造 番号文字列
        ''' </summary>
        Private Const ContentPart As Integer = 0
        ''' <summary>
        ''' ボディ構造 Content-Type タイプ
        ''' </summary>
        Private Const ContentType As Integer = 1
        ''' <summary>
        ''' ボディ構造 Content-Type サブタイプ
        ''' </summary>
        Private Const ContentSubType As Integer = 2
        ''' <summary>
        ''' ボディ構造 Content-Id
        ''' </summary>
        Private Const ContentId As Integer = 3
        ''' <summary>
        ''' ボディ構造 Content-Description
        ''' </summary>
        Private Const ContentDescription As Integer = 4
        ''' <summary>
        ''' ボディ構造 Content-Transfer-Encoding
        ''' </summary>
        Private Const ContentTransferEncoding As Integer = 5
        ''' <summary>
        ''' ボディ構造 ファイル名
        ''' </summary>
        Private Const ContentFileName As Integer = 6
        ''' <summary>
        ''' ボディ構造 Content-Type タイプ＆サブタイプ
        ''' </summary>
        Private Const ContentTypeAndSubType As Integer = 7
        ''' <summary>
        ''' ボディ構造 ボディサイズ
        ''' </summary>
        Private Const ContentSize As Integer = 8
        ''' <summary>
        ''' ボディ構造 ボディ行数
        ''' </summary>
        Private Const ContentLine As Integer = 9
        ''' <summary>
        ''' ボディ構造 Content-Type パラメータ数
        ''' </summary>
        Private Const ContentParameterCount As Integer = 10
        ''' <summary>
        ''' ボディ構造 Content-Type パラメータ
        ''' </summary>
        Private Const ContentParameter As Integer = 11
        ''' <summary>
        ''' SMTP 日時文字列
        ''' </summary>
        Private Const MakeDateSmtp As Integer = &H0
        ''' <summary>
        ''' IMAP4 日時文字列
        ''' </summary>
        Private Const MakeDateImap4 As Integer = &H10000
        ''' <summary>
        ''' 現在日時
        ''' </summary>
        Private Const MakeDateNow As Integer = &H20000
        ''' <summary>
        ''' タイムゾーン指定 ＋
        ''' </summary>
        Private Const MakeDateTimeZonePlus As Integer = &H40000
        ''' <summary>
        ''' タイムゾーン指定 ー
        ''' </summary>
        Private Const MakeDateTimeZoneMinus As Integer = &H80000
        ''' <summary>
        ''' SMTP日時文字列(RFC2822)を取得します。例: "Fri, 9 Jul 2009 15:10:30 +0900
        ''' </summary>
        Private Const DateTimeSmtp As Integer = &H0
        ''' <summary>
        ''' IMAP4日付文字列(RFC2060)を取得します。検索用 例: "09-Jul-2009"
        ''' </summary>
        Private Const DateImap4 As Integer = &H8000
        ''' <summary>
        ''' IMAP4日時文字列(RFC2060)を取得します。Append用 例: "09-Jul-2009 15:10:30"
        ''' </summary>
        Private Const DateTimeImap4 As Integer = &H8000
        ''' <summary>
        ''' 日時文字列のバッファサイズです。
        ''' </summary>
        Private Const DateStringSize As Integer = 34
        ''' <summary>
        ''' SSLv3 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const SSL3 As Integer = &H1000
        ''' <summary>
        ''' TSLv1 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1 As Integer = &H2000
        ''' <summary>
        ''' STARTTLS を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const STARTTLS As Integer = &H4000
        ''' <summary>
        ''' TSLv1.2 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1_2 As Integer = &H10000
        ''' <summary>
        ''' TSLv1.3 を使用します。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const TLS1_3 As Integer = &H20000
        ''' <summary>
        ''' サーバ証明書が期限切れでもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const IgnoreNotTimeValid As Integer = &H800
        ''' <summary>
        ''' ルート証明書が無効でもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const AllowUnknownCA As Integer = &H400
        ''' <summary>
        ''' Common Name が一致しなくてもエラーにしません。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="SSL"/>で指定します。
        ''' </remarks>
        Public Const IgnoreInvalidName As Integer = &H40
        ''' <summary>
        ''' IMAP4 の標準ポート番号です
        ''' </summary>
        Public Const StandardPortNo As Integer = 143
        ''' <summary>
        ''' IMAP4 over SSL のポート番号です
        ''' </summary>
        Public Const StandardSslPortNo As Integer = 993

        Public Const INFINITE As UInt32 = &HFFFFFFFFL

        ''' <summary>
        ''' IMAP4 ポート番号です。
        ''' </summary>
        Protected _port As Integer = 143
        ''' <summary>
        ''' ソケットハンドルです。
        ''' </summary>
        Protected _socket As IntPtr = IntPtr.op_Explicit(ErrorSocket)
        ''' <summary>
        ''' メール数です。
        ''' </summary>
        Protected _count As Integer = -1
        ''' <summary>
        ''' メールサイズです。
        ''' </summary>
        Protected _size As Integer = -1
        ''' <summary>
        ''' ヘッダーサイズです。
        ''' </summary>
        Protected _header_size As Integer = -1
        ''' <summary>
        ''' 本文のサイズです。
        ''' </summary>
        Protected _body_size As Integer = -1
        ''' <summary>
        ''' メール受信時の設定用フラグです。
        ''' </summary>
        Protected _flag As Integer = 0
        ''' <summary>
        ''' メールメッセージのフラグです。
        ''' </summary>
        Protected _message_flag As Integer = 0
        ''' <summary>
        ''' メールを指定する際に UID を使用します。
        ''' </summary>
        Protected _useuid_flag As Boolean = False
        ''' <summary>
        ''' MIME パート取得もしくは保存の際の設定フラグです。
        ''' </summary>
        Protected _mime_flag As Integer = 0
        ''' <summary>
        ''' メールを指定する際に UID を使用します。
        ''' </summary>
        Protected _useuid As Integer = 0
        ''' <summary>
        ''' エラー番号です。
        ''' </summary>
        Protected _err As Integer = 0
        ''' <summary>
        ''' IMAP4 認証形式
        ''' </summary>
        Protected _mode As Integer = AuthLogin
        ''' <summary>
        ''' IMAP4 サーバ名です。
        ''' </summary>
        Protected _host As String = ""
        ''' <summary>
        ''' IMAP4 ユーザー名です。
        ''' </summary>
        Protected _id As String = ""
        ''' <summary>
        ''' IMAP4 パスワードです。
        ''' </summary>
        Protected _password As String = ""
        ''' <summary>
        ''' メールボックス名です。
        ''' </summary>
        Protected _mailbox As String = ""
        ''' <summary>
        ''' 添付ファイル保存用のパスです。
        ''' </summary>
        Protected _path As String = Nothing
        ''' <summary>
        ''' ヘッダフィールド名です。
        ''' </summary>
        Protected _field_name As String = ""
        ''' <summary>
        ''' 本文格納バッファです。
        ''' </summary>
        Protected _body As StringBuilder = Nothing
        ''' <summary>
        ''' 件名格納バッファです。
        ''' </summary>
        Protected _subject As StringBuilder = Nothing
        ''' <summary>
        ''' 日付文字列保存バッファです。
        ''' </summary>
        Protected _date As StringBuilder = Nothing
        ''' <summary>
        ''' 差出人格納バッファです。
        ''' </summary>
        Protected _from As StringBuilder = Nothing
        ''' <summary>
        ''' ヘッダ格納バッファです。
        ''' </summary>
        Protected _header As StringBuilder = Nothing
        ''' <summary>
        ''' 添付ファイル名格納バッファです。
        ''' </summary>
        Protected _filename As StringBuilder = Nothing
        ''' <summary>
        ''' 添付ファイル名のリストです。
        ''' </summary>
        Protected _filename_list As String() = Nothing
        ''' <summary>
        ''' ヘッダフィールド内容格納バッファです。
        ''' </summary>
        Protected _field As StringBuilder = Nothing
        ''' <summary>
        ''' UID です。
        ''' </summary>
        Protected _uid As Integer = 0
        ''' <summary>
        ''' Dispose 処理を行ったかどうかのフラグです。
        ''' </summary>
        Private _disposed As Boolean = False
        ''' <summary>
        ''' HTML パートを保存したファイルの名前です。
        ''' </summary>
        Protected _html_file As StringBuilder = Nothing
        ''' <summary>
        ''' SSL 設定フラグです。
        ''' </summary>
        Protected _ssl As Integer = 0
        ''' <summary>
        ''' SSL クライアント証明書名です。
        ''' </summary>
        Protected _cert_name As String = Nothing
        ''' <summary>
        ''' message/rfc822 パートを保存したファイルの名前です。
        ''' </summary>
        Protected _rfc822_file As StringBuilder = Nothing
        ''' <summary>
        ''' IMAP4 IDLE イベントハンドルです。
        ''' </summary>
        Protected _event As IntPtr = IntPtr.Zero

        ''' <summary>
        ''' メールボックス情報です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="GetMailBoxList"/>もしくは<see cref="GetMailBoxListSubscribe"/>の結果が格納される構造体です。
        ''' </remarks>
        Public Structure MailBoxStatus
            ''' <summary>
            ''' メールボックスフラグです。
            ''' </summary>
            ''' <remarks>
            ''' <para><see cref="MailBoxNoSelect"/>選択できないメールボックスです</para>
            ''' <para><see cref="MailBoxNoInferious"/>子メールボックスを作成できません</para>
            ''' <para><see cref="MailBoxMarked"/>メッセージが追加されている可能性があります</para>
            ''' <para><see cref="MailBoxUnMarked"/>メッセージが追加されていません</para>
            ''' <para><see cref="MailBoxChildren"/>子メールボックスが存在します</para>
            ''' <para><see cref="MailBoxNoChildren"/>子メールボックスが存在しません</para>
            ''' </remarks>
            Public Flag As Integer
            ''' <summary>
            ''' メールボックス名です。
            ''' </summary>
            Public Name As String
            ''' <summary>
            ''' メールボックス区切り文字です。
            ''' </summary>
            Public Separate As Char
        End Structure
        ''' <summary>
        ''' メールボックス情報リストです。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="GetMailBoxList"/>もしくは<see cref="GetMailBoxListSubscribe"/>実行後に結果が格納されます。
        ''' </remarks>
        Protected _mailbox_list As MailBoxStatus() = Nothing
        ''' <summary>
        ''' MIME 構造 Content-Type フィールドのパラメータ情報です。
        ''' </summary>
        ''' <remarks>
        ''' MIME 構造 Content-Type フィールドのパラメータ情報です。
        ''' MIME 構造情報 <see cref="MimeStructureStatus"/> に含まれます。
        ''' </remarks>
        Public Structure MimeParameterStatus
            ''' <summary>
            ''' パラメータ名称です。
            ''' </summary>
            Public Name As String
            ''' <summary>
            ''' パラメータの値です。
            ''' </summary>
            Public Value As String
        End Structure
        ''' <summary>
        ''' MIME 構造情報です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="GetMimeStructure"/>の結果が格納される構造体です。
        ''' </remarks>
        Public Structure MimeStructureStatus
            ''' <summary>
            ''' MIME パート番号です。
            ''' </summary>
            ''' <remarks>
            ''' <see cref="GetMimePart"/>や<see cref="SaveMimePart"/>の part_no で指定する値です。
            ''' </remarks>
            Public PartNo As Integer
            ''' <summary>
            ''' MIME 構造を表す文字列です。
            ''' </summary>
            Public Part As String
            ''' <summary>
            ''' Content-Type フィールドのタイプです。
            ''' </summary>
            Public Type As String
            ''' <summary>
            ''' Content-Type フィールドのサブタイプです。
            ''' </summary>
            Public SubType As String
            ''' <summary>
            ''' Contetn-ID フィールドの値です。
            ''' </summary>
            Public Id As String
            ''' <summary>
            ''' Content-Description フィールドの値です。
            ''' </summary>
            Public Description As String
            ''' <summary>
            ''' Content-Transfer-Encoding フィールドの値です。
            ''' </summary>
            Public Encoding As String
            ''' <summary>
            ''' 添付ファイル名です。(デコード済み)
            ''' </summary>
            Public FileName As String
            ''' <summary>
            ''' MIME パートのサイズです。
            ''' </summary>
            Public Size As Integer
            ''' <summary>
            ''' MIME パートの行数です。タイプが text の場合のみ正しい値が入ります。
            ''' </summary>
            Public Line As Integer
            ''' <summary>
            ''' Content-Type のパラメータリストです。
            ''' </summary>
            Public Parameter As MimeParameterStatus()
        End Structure
        ''' <summary>
        ''' MIME 構造情報リストです。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="GetMimeStructure"/>実行後に結果が格納されます。
        ''' </remarks>
        Protected _mime_list As MimeStructureStatus() = Nothing
        ''' <summary>
        ''' 検索結果のリストです。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="Search"/>実行後に結果が格納されます。
        ''' </remarks>
        Protected _search_list As Integer() = Nothing
        ''' <summary>
        ''' 最初の検索かどうかのフラグです。
        ''' </summary>
        Protected _search_first_flag As Boolean = True
        ''' <summary>
        ''' 名前空間情報です。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="GetNameSpace"/>の結果が格納される構造体です。
        ''' </remarks>
        Public Structure NameSpaceStatus
            ''' <summary>
            ''' 名前空間の名称です。
            ''' </summary>
            Public Name As String
            ''' <summary>
            ''' 名前空間の区切り文字です。
            ''' </summary>
            Public Separate As Char
        End Structure
        ''' <summary>
        ''' 名前空間情報リストです。
        ''' </summary>
        ''' <remarks>
        ''' <see cref="GetNameSpace"/>実行後に結果が格納されます。
        ''' </remarks>
        Protected _namespace_list As NameSpaceStatus()() = New NameSpaceStatus(NameSpaceMax)() {}
        ''' <summary>
        ''' IDLE イベントハンドラ
        ''' </summary>
        Public Event IdleEvent As EventHandler

        Private _thread As Thread
        Protected _thread_event_flag As Boolean = False


        ''' <summary>
        ''' <c>Imap4</c>クラスの新規インスタンスを初期化します。
        ''' </summary>
        Public Sub New()
            Init()
        End Sub

        ''' <summary>
        ''' <c>Imap4</c>クラスの新規インスタンスを初期化します。
        ''' <param name="host">POP3 サーバー名</param>
        ''' </summary>
        Public Sub New(ByVal host As String)
            Init()
            _host = host
        End Sub

        Protected Overrides Sub Finalize()
            MyBase.Finalize()
            Dispose(False)
        End Sub

        ''' <summary>
        ''' <see cref="Imap4"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        Overridable Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        ''' <summary>
        ''' <see cref="Imap4"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        ''' <param name="disposing">
        ''' マネージリソースとアンマネージリソースの両方を解放する場合は<c>true</c>。
        ''' アンマネージリソースだけを解放する場合は<c>false</c>。
        ''' </param>
        Protected Overloads Sub Dispose(ByVal disposing As Boolean)
            If Not _disposed Then
                If disposing Then
                End If
                If Not _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                    _thread_event_flag = False
                    Imap4Close(_socket)
                    _socket = IntPtr.op_Explicit(ErrorSocket)
                End If
                _disposed = True
            End If
        End Sub

        ''' <summary>
        ''' 初期化処理です。
        ''' </summary>
        Protected Sub Init()
        End Sub

        <DllImport("nMail.DLL", EntryPoint:="NMailGetSuspendNumber", CharSet:=CharSet.Auto)> _
        Public Shared Function GetSuspendNumber(ByVal Path As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4ConnectPortNo", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4ConnectPortNo(ByVal Host As String, ByVal Port As Integer) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4ConnectSsl", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4ConnectSsl(ByVal Host As String, ByVal Port As Integer, ByVal Flag As Integer, ByVal Name As String) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4Close")> _
        Protected Shared Function Imap4Close(ByVal Socket As IntPtr) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4Authenticate", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4Authenticate(ByVal Socket As IntPtr, ByVal Id As String, ByVal Pass As String, ByVal Mode As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4SelectMailBox", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4SelectMailBox(ByVal Socket As IntPtr, ByVal MailBox As String, ByVal ReadOnlyFlag As Boolean) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMailStatus", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetMailStatus(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal Subject As StringBuilder, ByVal DateString As StringBuilder, ByVal From As StringBuilder, ByVal Header As StringBuilder, ByRef MessageFlag As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMailSize")> _
        Protected Shared Function Imap4GetMailSize(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMail", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetMail(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal Subject As StringBuilder, ByVal DateString As StringBuilder, ByVal From As StringBuilder, ByVal Header As StringBuilder, ByVal Body As StringBuilder, ByVal Path As String, ByVal FileName As StringBuilder, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMailBoxList", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetMailBoxList(ByVal Socket As IntPtr, ByVal Refer As String, ByVal MailBox As String, ByVal SubscribeFlag As Boolean) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMailBoxListStatus", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetMailBoxListStatus(ByVal Socket As IntPtr, ByVal No As Integer, ByRef MailBoxFlag As Integer, ByVal Separate As StringBuilder, ByVal MailBox As StringBuilder, ByVal Size As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4DeleteMail")> _
        Protected Shared Function Imap4DeleteMail(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4ChangeMessageFlag")> _
        Protected Shared Function Imap4ChangeMessageFlag(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal MessageFlag As Integer, ByVal Command As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4ExpungeMail")> _
        Protected Shared Function Imap4ExpungeMail(ByVal Socket As IntPtr) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4CloseMailBox")> _
        Protected Shared Function Imap4CloseMailBox(ByVal Socket As IntPtr) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4CreateMailBox", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4CreateMailBox(ByVal Socket As IntPtr, ByVal MailBox As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4DeleteMailBox", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4DeleteMailBox(ByVal Socket As IntPtr, ByVal MailBox As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4RenameMailBox", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4RenameMailBox(ByVal Socket As IntPtr, ByVal OldMailBox As String, ByVal NewMailBox As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4SubscribeMailBox", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4SubscribeMailBox(ByVal Socket As IntPtr, ByVal MailBox As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4UnsubscribeMailBox", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4UnsubscribeMailBox(ByVal Socket As IntPtr, ByVal MailBox As String) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMailBoxStatus", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetMailBoxStatus(ByVal Socket As IntPtr, ByVal MailBox As String, ByVal type As Integer, ByRef Data As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4CopyMail", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4CopyMail(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal MailBox As String, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetUid", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetUid(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByRef Uid As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4SearchMail", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4SearchMail(ByVal Socket As IntPtr, ByVal Type As Integer, ByVal Text As String, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetSearchMailResult", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetSearchMailResult(ByVal Socket As IntPtr, ByVal No As Integer, ByRef MailNo As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4AppendMail", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4AppendMail(ByVal Socket As IntPtr, ByVal MailBox As String, ByVal Header As String, ByVal Body As String, ByVal Path As String, ByVal MessageFlag As Integer, ByVal DateString As String, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailMakeDateString", CharSet:=CharSet.Auto)> _
        Protected Shared Function MakeDateString(ByVal DateString As StringBuilder, ByVal Year As Integer, ByVal Month As Integer, ByVal Day As Integer, ByVal Hour As Integer, ByVal Minute As Integer, ByVal Second As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetNameSpace")> _
        Protected Shared Function Imap4GetNameSpace(ByVal Socket As IntPtr) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetNameSpaceStatus", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetNameSpaceStatus(ByVal Socket As IntPtr, ByVal Type As Integer, ByVal Separate As StringBuilder, ByVal Name As StringBuilder, ByVal Size As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMimeStructure")> _
        Protected Shared Function Imap4GetMimeStructure(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMimeStructureStatus", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetMimeStructureStatus(ByVal Socket As IntPtr, ByVal Type As Integer, ByVal PartNo As Integer, ByVal SubNo As Integer, ByVal Name As StringBuilder, ByVal Value As StringBuilder, ByVal Size As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetMimePart", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetMimePart(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal PartNo As Integer, ByVal Body As StringBuilder, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4SaveMimePart", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4SaveMimePart(ByVal Socket As IntPtr, ByVal MailNo As Integer, ByVal PartNo As Integer, ByVal Path As String, ByVal FileName As StringBuilder, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4NoOperation")> _
        Protected Shared Function Imap4NoOperation(ByVal Socket As IntPtr) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailGetHeaderField", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4GetHeaderField(ByVal Field As StringBuilder, ByVal Header As String, ByVal Name As String, ByVal Size As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailDecodeHeaderField", CharSet:=CharSet.Auto)> _
        Protected Shared Function Imap4DecodeHeaderField(ByVal Destination As StringBuilder, ByVal Source As String, ByVal Size As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4StartIdle")> _
        Protected Shared Function Imap4StartIdle(ByVal Socket As IntPtr, ByVal Wnd As IntPtr, ByVal Message As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4GetIdleEvent")> _
        Protected Shared Function Imap4GetIdleEvent(ByVal Socket As IntPtr) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailImap4EndIdle")> _
        Protected Shared Function Imap4EndIdle(ByVal Socket As IntPtr) As Integer
        End Function

        <DllImport("kernel32.dll", SetLastError:=True)> _
        Protected Shared Function WaitForSingleObject(ByVal hHandle As IntPtr, ByVal dwMilliseconds As UInt32) As UInt32
        End Function

        ''' <summary>
        ''' ヘッダ格納用バッファのサイズを決定します。
        ''' </summary>
        Protected Sub SetHeaderSize()
            If _header_size < 0 Then
                _header_size = Options.HeaderMax
            End If
            If _header_size <= 0 Then
                _header_size = HeaderSize
                Options.HeaderMax = _header_size
            End If
        End Sub
        ''' <summary>
        ''' サーバに接続中か判定する
        ''' </summary>
        ''' <returns>true でサーバに接続中</returns>
        Public Function IsConnected() As Boolean
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Return False
            Else
                Return True
            End If
        End Function
        ''' <summary>
        ''' IMAP4 サーバに接続します。
        ''' </summary>
        ''' <remarks>
        ''' IMAP4 サーバに接続します。
        ''' </remarks>
        '''	<exception cref="ArgumentOutOfRangeException">
        '''	ポート番号が正しくありません。
        ''' </exception>
        '''	<exception cref="nMailException">
        '''	IMAP4 サーバーとの接続に失敗しました。
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Connect()
            If (_port < 0) Or (_port > 65536) Then
                Throw New ArgumentOutOfRangeException
            End If
            _socket = Imap4ConnectSsl(_host, _port, _ssl, _cert_name)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                _err = ErrorSocket
                _socket = IntPtr.op_Explicit(ErrorSocket)
                Throw New nMailException("Connect", _err)
            End If
        End Sub
        ''' <summary>
        ''' IMAP4 サーバに接続します。
        ''' </summary>
        ''' <param name="host_name">IMAP4 サーバー名</param>
        ''' <remarks>
        ''' サーバ名を指定して IMAP4 サーバに接続します。
        ''' </remarks>
        '''	<exception cref="ArgumentOutOfRangeException">
        '''	ポート番号が正しくありません。
        ''' </exception>
        '''	<exception cref="nMailException">
        '''	IMAP4 サーバとの接続に失敗しました。
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Connect(ByVal host_name As String)
            _host = host_name
            Connect()
        End Sub
        ''' <summary>
        ''' IMAP4 サーバに接続します。
        ''' </summary>
        ''' <param name="host_name">IMAP4 サーバ名</param>
        ''' <param name="port_no">ポート番号</param>
        ''' <remarks>
        ''' サーバ名とポート番号を指定して IMAP4 サーバに接続します。
        ''' </remarks>
        '''	<exception cref="ArgumentOutOfRangeException">
        '''	ポート番号が正しくありません。
        ''' </exception>
        '''	<exception cref="nMailException">
        '''	IMAP4 サーバとの接続に失敗しました。
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Connect(ByVal host_name As String, ByVal port_no As Integer)
            _host = host_name
            _port = port_no
            Connect()
        End Sub
        ''' <summary>
        ''' IMAP4 サーバに接続します。
        ''' </summary>
        ''' <param name="port_no">ポート番号</param>
        ''' <remarks>
        ''' ポート番号を指定して IMAP4 サーバに接続します。
        ''' </remarks>
        '''	<exception cref="ArgumentOutOfRangeException">
        '''	ポート番号が正しくありません。
        ''' </exception>
        '''	<exception cref="nMailException">
        '''	IMAP4 サーバとの接続に失敗しました。
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Connect(ByVal port_no As Integer)
            _port = port_no
            Connect()
        End Sub
        ''' <summary>
        ''' IMAP4 サーバとの接続を終了します。
        ''' </summary>
        Public Sub Close()
            If Not _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                _thread_event_flag = False
                Imap4Close(_socket)
            End If
            _socket = IntPtr.op_Explicit(ErrorSocket)
        End Sub
        ''' <summary>
        ''' IMAP4 サーバ認証を行います。
        ''' </summary>
        ''' <remarks>
        ''' ID とパスワードを指定して IMAP4 サーバ認証を行います。
        ''' </remarks>
        ''' <param name="id_str">IMAP4 ユーザー ID</param>
        ''' <param name="pass_str">IMAP4 パスワード</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="FormatException">
        '''	ID もしくはパスワードに文字列が入っていません。
        ''' </exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Authenticate(ByVal id_str As String, ByVal pass_str As String)
            If (id_str = "") Or (pass_str = "") Then
                Throw New FormatException
            End If
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _id = id_str
            _password = pass_str
            _body_size = -1
            _count = Imap4Authenticate(_socket, _id, _password, _mode)
            If _count < 0 Then
                _err = _count
                Throw New nMailException("Authenticate: " + Options.ErrorMessage, _err)
            End If
        End Sub
        ''' <summary>
        ''' IMAP4 サーバ認証を行います。
        ''' </summary>
        ''' <remarks>
        ''' ID、パスワードおよび認証形式を指定して IMAP4 サーバ認証を行います。
        ''' </remarks>
        ''' <param name="id_str">IMAP4 ユーザー ID</param>
        ''' <param name="pass_str">IMAP4 パスワード</param>
        ''' <param name="mode">認証形式
        ''' <para>認証形式の設定可能な値は下記の通りです。</para>
        ''' <para><see cref="AuthLogin"/> で LOGIN を使用します。</para>
        ''' <para><see cref="AuthPlain"/> で PLAIN を使用します。</para>
        ''' <para><see cref="AuthCramMd5"/> CRAM MD5 を使用します。</para>
        ''' <para><see cref="AuthDigestMd5"/> DIGEST MD5 を使用します。</para>
        ''' <para>C# は | 、VB.NET では Or で複数指定可能です。</para>
        ''' <para>DIGEST MD5→CRAM MD5→PLAIN→LOGIN の優先順位で認証を試みます。</para>
        ''' </param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="FormatException">
        '''	ID もしくはパスワードに文字列が入っていません。
        ''' </exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Authenticate(ByVal id_str As String, ByVal pass_str As String, ByVal mode As Integer)
            _mode = mode
            Authenticate(id_str, pass_str)
        End Sub

        ''' <summary>
        ''' 購読済みメールボックスの一覧を取得します。
        ''' </summary>
        ''' <param name="refer">階層位置です。</param>
        ''' <param name="mailbox">ワイルドカードです。"*" で全て、"%" で同じ階層のメールボックスを検索します。</param>
        ''' <remarks>
        ''' 購読済みメールボックスの一覧を取得します。一覧は<see cref="GetMailBoxList"/> で取得できます。。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub GetMailBoxListSubscribe(ByVal refer As String, ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4GetMailBoxList(_socket, refer, mailbox, True)
            If _err < 0 Then
                _mailbox_list = New MailBoxStatus() {}
                Throw New nMailException("GetMailBoxListSubscribe: " + Options.ErrorMessage, _err)
            Else
                Dim no As Integer
                SetHeaderSize()
                _mailbox_list = New MailBoxStatus(_err - 1) {}
                For no = 0 To _err - 1
                    Dim separate As StringBuilder = New StringBuilder(_header_size)
                    Dim name As StringBuilder = New StringBuilder(_header_size)
                    Imap4GetMailBoxListStatus(_socket, no, _mailbox_list(no).Flag, separate, name, _header_size)
                    _mailbox_list(no).Name = name.ToString()
                    _mailbox_list(no).Separate = separate(0)
                Next no
            End If
        End Sub
        ''' <summary>
        ''' メールボックスの一覧を取得します。
        ''' </summary>
        ''' <remarks>
        ''' メールボックスの一覧を取得します。一覧は<see cref="GetMailBoxList"/> で取得できます。
        ''' </remarks>
        ''' <param name="refer">階層位置です。</param>
        ''' <param name="mailbox">ワイルドカードです。"*" で全て、"%" で同じ階層のメールボックスを検索します。</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub GetMailBoxList(ByVal refer As String, ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4GetMailBoxList(_socket, refer, mailbox, False)
            If _err < 0 Then
                _mailbox_list = New MailBoxStatus() {}
                Throw New nMailException("GetMailBoxList: " + Options.ErrorMessage, _err)
            Else
                Dim no As Integer
                SetHeaderSize()
                _mailbox_list = New MailBoxStatus(_err - 1) {}
                For no = 0 To _err - 1
                    Dim separate As StringBuilder = New StringBuilder(_header_size)
                    Dim name As StringBuilder = New StringBuilder(_header_size)
                    Imap4GetMailBoxListStatus(_socket, no, _mailbox_list(no).Flag, separate, name, _header_size)
                    _mailbox_list(no).Name = name.ToString()
                    _mailbox_list(no).Separate = separate(0)
                Next no
            End If
        End Sub
        ''' <summary>
        ''' メールボックスのメッセージ総数を取得します。
        ''' </summary>
        ''' <remarks>
        ''' <paramref name="mailbox"/>パラメータでメッセージ総数を取得したいメールボックス名を指定します。
        ''' </remarks>
        ''' <param name="mailbox">メッセージ総数を取得したいメールボックス名です。</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>メッセージ総数</returns>
        Public Function GetMailBoxMessageCount(ByVal mailbox As String) As Integer
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            Dim data As Integer = 0
            _err = Imap4GetMailBoxStatus(_socket, mailbox, MailBoxMessage, data)
            If _err < 0 Then
                Throw New nMailException("GetMailBoxMessageCount: " + Options.ErrorMessage, _err)
            End If
            Return data
        End Function
        ''' <summary>
        ''' メールボックスの新着メッセージ数を取得します。
        ''' </summary>
        ''' <remarks>
        ''' <paramref name="mailbox"/>パラメータで新着メッセージ数を取得したいメールボックス名を指定します。
        ''' </remarks>
        ''' <param name="mailbox">新着メッセージ数を取得したいメールボックス名です。</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>新着メッセージ数</returns>
        Public Function GetMailBoxRecentCount(ByVal mailbox As String) As Integer
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            Dim data As Integer = 0
            _err = Imap4GetMailBoxStatus(_socket, mailbox, MailBoxRecent, data)
            If _err < 0 Then
                Throw New nMailException("GetMailBoxRecentCount: " + Options.ErrorMessage, _err)
            End If
            Return data
        End Function
        ''' <summary>
        ''' メールボックスの新しいメッセージの UID を取得します。
        ''' </summary>
        ''' <remarks>
        ''' <paramref name="mailbox"/>パラメータで新しいメッセージの UID 値を取得したいメールボックス名を指定します。
        ''' </remarks>
        ''' <param name="mailbox">新しいメッセージの UID 値を取得したいメールボックス名です。</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>新しいメッセージの UID</returns>
        Public Function GetMailBoxNextUid(ByVal mailbox As String) As Integer
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            Dim data As Integer = 0
            _err = Imap4GetMailBoxStatus(_socket, mailbox, MailBoxNextUid, data)
            If _err < 0 Then
                Throw New nMailException("GetMailBoxNextUid: " + Options.ErrorMessage, _err)
            End If
            Return data
        End Function
        ''' <summary>
        ''' メールボックスの UID Validity 値を取得します。
        ''' </summary>
        ''' <remarks>
        ''' <paramref name="mailbox"/>パラメータで UID Validity 値を取得したいメールボックス名を指定します。
        ''' </remarks>
        ''' <param name="mailbox">UID Validity 値を取得したいメールボックス名です。</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>メールボックスの UID Validity</returns>
        Public Function GetMailBoxUidValidity(ByVal mailbox As String) As Integer
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            Dim data As Integer = 0
            _err = Imap4GetMailBoxStatus(_socket, mailbox, MailBoxUidValidity, data)
            If _err < 0 Then
                Throw New nMailException("GetMailBoxUidValidity: " + Options.ErrorMessage, _err)
            End If
            Return data
        End Function
        ''' <summary>
        ''' メールボックスの未読メッセージ数を取得します。
        ''' </summary>
        ''' <remarks>
        ''' <paramref name="mailbox"/>パラメータで未読メッセージ数を取得したいメールボックス名を指定します。
        ''' </remarks>
        ''' <param name="mailbox">未読メッセージ数を取得したいメールボックス名です。</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>未読メッセージ数</returns>
        Public Function GetMailBoxUnSeen(ByVal mailbox As String) As Integer
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            Dim data As Integer = 0
            _err = Imap4GetMailBoxStatus(_socket, mailbox, MailBoxUnSeen, data)
            If _err < 0 Then
                Throw New nMailException("GetMailBoxUnSeen: " + Options.ErrorMessage, _err)
            End If
            Return data
        End Function

        ''' <summary>
        ''' メールボックスを選択します。
        ''' </summary>
        ''' <remarks>
        ''' <paramref name="mailbox"/>パラメータで選択したいメールボックス名を指定します。
        ''' </remarks>
        ''' <param name="mailbox">選択するメールボックス名です。</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub SelectMailBox(ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _mailbox = mailbox
            _err = Imap4SelectMailBox(_socket, _mailbox, False)
            If _err < 0 Then
                Throw New nMailException("SelectMailBox: " + Options.ErrorMessage, _err)
            Else
                _count = _err
            End If
        End Sub
        ''' <summary>
        ''' メールボックスを読み出し専用で選択します。
        ''' </summary>
        ''' <remarks>
        ''' <paramref name="mailbox"/>パラメータで読み出し専用で選択したいメールボックス名を指定します。
        ''' </remarks>
        ''' <param name="mailbox">選択するメールボックス名です。</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub SelectMailBoxReadOnly(ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _mailbox = mailbox
            _err = Imap4SelectMailBox(_socket, _mailbox, True)
            If _err < 0 Then
                Throw New nMailException("SelectMailBoxReadOnly: " + Options.ErrorMessage, _err)
            Else
                _count = _err
            End If
        End Sub

        ''' <summary>
        ''' メールのステータスを取得します。
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <remarks>
        ''' <paramref name="no"/>パラメータでステータスを取得したいメール番号を指定します。
        ''' <para>件名は<see cref="Subject"/>で取得できます。</para>
        ''' <para>日付文字列は<see cref="DateString"/>で取得できます。</para>
        ''' <para>差出人は<see cref="From"/>で取得できます。</para>
        ''' <para>ヘッダは<see cref="Header"/>で取得できます。</para>
        ''' <para>メッセージフラグは<see cref="MessageFlag"/>で取得できます。</para>
        ''' <para>ステータス取得失敗の場合のエラー番号は<see cref="nMailException.ErrorCode"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub GetStatus(ByVal no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            SetHeaderSize()
            _subject = New StringBuilder(_header_size)
            _date = New StringBuilder(_header_size)
            _from = New StringBuilder(_header_size)
            _header = New StringBuilder(_header_size)
            _err = Imap4GetMailStatus(_socket, no, _subject, _date, _from, _header, _message_flag, _useuid)
            If _err < 0 Then
                Throw New nMailException("GetStatus: " + Options.ErrorMessage, _err)
            Else
                _size = _err
                _body_size = _size * 2
            End If
        End Sub
        ''' <summary>
        ''' メールのサイズを取得します。
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <remarks>
        ''' <paramref name="no"/>パラメータでメールサイズを取得したいメール番号を指定します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>メールサイズ</returns>
        Public Function GetSize(ByVal no As Integer) As Integer
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _size = Imap4GetMailSize(_socket, no, _useuid)
            If _size < 0 Then
                _err = _size
                Throw New nMailException("GetSize: " + Options.ErrorMessage, _err)
            Else
                _body_size = _size * 2
            End If
            Return _size
        End Function

        ''' <summary>
        ''' メールを取得します。
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <remarks>
        ''' <paramref name="no"/>パラメータでメールを取得したいメール番号を指定します。
        ''' <para>添付ファイルを保存したい場合、<see cref="Path"/>に保存したいフォルダを指定しておきます。</para>
        ''' <para>拡張機能を使用したい場合、<see cref="Flag"/>で設定しておきます。</para>
        ''' <para>件名は<see cref="Subject"/>で取得できます。</para>
        ''' <para>日付文字列は<see cref="DateString"/>で取得できます。</para>
        ''' <para>差出人は<see cref="From"/>で取得できます。</para>
        ''' <para>ヘッダは<see cref="Header"/>で取得できます。</para>
        ''' <para>メールサイズは<see cref="Size"/>で取得できます。</para>
        ''' <para>添付ファイル名は<see cref="FileName"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="DirectoryNotFoundException">
        '''	<see cref="Path"/>で指定したフォルダが存在しません。
        ''' </exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub GetMail(ByVal no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            If Not _path Is Nothing Then
                If (_path <> "") And (Not Directory.Exists(_path)) Then
                    Throw New DirectoryNotFoundException(_path)
                End If
            End If
            If (_flag And SuspendNext) <> 0 Then
                _err = Imap4GetMail(_socket, no, _subject, _date, _from, _header, _body, _path, _filename, _flag Or _useuid)
            Else
                SetHeaderSize()
                _subject = New StringBuilder(_header_size)
                _date = New StringBuilder(_header_size)
                _from = New StringBuilder(_header_size)
                _header = New StringBuilder(_header_size)
                Options.FileNameMax = MaxPath
                _filename = New StringBuilder(MaxPath)
                If _body_size < 0 Then
                    GetSize(no)
                End If
                If _body_size > 0 Then
                    _body = New StringBuilder(_body_size)
                    If _flag <> 0 Then
                        _err = Imap4GetMail(_socket, no, _subject, _date, _from, _header, _body, _path, _filename, _flag Or _useuid)
                    Else
                        _err = Imap4GetMail(_socket, no, _subject, _date, _from, _header, _body, _path, _filename, _flag Or _useuid)
                    End If
                End If
                If _err <> ErrorSuspendAttachmentFile Then
                    _body_size = -1
                    If _filename.Length > 0 Then
                        _filename_list = _filename.ToString().Split(Options.SplitChar)
                    Else
                        _filename_list = Nothing
                    End If
                    If Options.SaveHtmlFile = Options.SaveHtmlFileOn Then
                        GetHeaderField("X-NMAIL-HTML-FILE:")
                        _html_file = _field
                    End If
                    If Options.SaveRfc822File <> Options.SaveRfc822FileOff Then
                        GetHeaderField("X-NMAIL-RFC822-FILE:")
                        _rfc822_file = _field
                    End If
                End If
                If (_err < 0) And (_err <> ErrorSuspendAttachmentFile) Then
                    Throw New nMailException("GetMail: " + Options.ErrorMessage, _err)
                End If
            End If
        End Sub
        ''' <summary>
        ''' メールの削除マークを付加します。
        '''	実際の削除は<see cref="Expunge"/>メソッドを呼び出した際に行われます。
        ''' </summary>
        ''' <param name="no">削除マークを付加するメール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Delete(ByVal no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4DeleteMail(_socket, no, _useuid)
            If _err < 0 Then
                Throw New nMailException("Delete: " + Options.ErrorMessage, _err)
            End If
        End Sub
        ''' <summary>
        ''' 削除マークのついているメールを削除します。
        ''' </summary>
        ''' <remarks>
        ''' <para>削除マークのついているメールを削除します。</para>
        ''' <para>メール削除失敗の場合のエラー番号は<see cref="nMailException.ErrorCode"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Expunge()
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4ExpungeMail(_socket)
            If _err < 0 Then
                Throw New nMailException("Expunge: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールボックスの選択を終了します。
        ''' </summary>
        ''' <remarks>
        ''' <para>メールボックスの選択を終了します。</para>
        ''' <para>メールボックスの選択終了失敗の場合のエラー番号は<see cref="nMailException.ErrorCode"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub CloseMailBox()
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4CloseMailBox(_socket)
            If _err < 0 Then
                Throw New nMailException("CloseMailBox: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールメッセージフラグを付加します。
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <param name="message_flag">メッセージフラグ
        ''' <para><see cref="MessageAnswerd"/>返信済みフラグ</para>
        ''' <para><see cref="MessageDeleted"/>消去マーク</para>
        ''' <para><see cref="MessageDraft"/>草稿フラグ</para>
        ''' <para><see cref="MessageFlagged"/>重要性フラグ</para>
        ''' <para><see cref="MessageRecent"/>到着フラグ</para>
        ''' <para><see cref="MessageSeen"/>既読フラグ</para>
        ''' <para>C# は | 、VB.NET では Or で複数指定可能です。</para>
        '''	</param>
        ''' <remarks>
        ''' 指定したメッセージフラグを付加します。指定していないフラグの状態はそのままです。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub AddMessageFlag(ByVal no As Integer, ByVal message_flag As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4ChangeMessageFlag(_socket, no, message_flag, AddMessage, _useuid)
            If _err < 0 Then
                Throw New nMailException("AddMessageFlag: " + Options.ErrorMessage, _err)
            End If
        End Sub
        ''' <summary>
        ''' メールメッセージフラグを削除します。
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <param name="message_flag">メッセージフラグ
        ''' <para><see cref="MessageAnswerd"/>返信済みフラグ</para>
        ''' <para><see cref="MessageDeleted"/>消去マーク</para>
        ''' <para><see cref="MessageDraft"/>草稿フラグ</para>
        ''' <para><see cref="MessageFlagged"/>重要性フラグ</para>
        ''' <para><see cref="MessageRecent"/>到着フラグ</para>
        ''' <para><see cref="MessageSeen"/>既読フラグ</para>
        ''' <para>C# は | 、VB.NET では Or で複数指定可能です。</para>
        '''	</param>
        ''' <remarks>
        ''' 指定したメッセージフラグを削除します。指定していないフラグの状態はそのままです。
        ''' <para>メールメッセージフラグ付加失敗の場合のエラー番号は<see cref="nMailException.ErrorCode"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub DeleteMessageFlag(ByVal no As Integer, ByVal message_flag As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4ChangeMessageFlag(_socket, no, message_flag, DeleteMessage, _useuid)
            If _err < 0 Then
                Throw New nMailException("DeleteMessageFlag: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールメッセージフラグを置き換えます。
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <param name="message_flag">メッセージフラグ
        ''' <para><see cref="MessageAnswerd"/>返信済みフラグ</para>
        ''' <para><see cref="MessageDeleted"/>消去マーク</para>
        ''' <para><see cref="MessageDraft"/>草稿フラグ</para>
        ''' <para><see cref="MessageFlagged"/>重要性フラグ</para>
        ''' <para><see cref="MessageRecent"/>到着フラグ</para>
        ''' <para><see cref="MessageSeen"/>既読フラグ</para>
        ''' <para>C# は | 、VB.NET では Or で複数指定可能です。</para>
        '''	</param>
        ''' <remarks>
        ''' 指定したメッセージフラグで置き換えます。
        ''' <para>メールメッセージフラグ置き換え失敗の場合のエラー番号は<see cref="nMailException.ErrorCode"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub ReplaceMessageFlag(ByVal no As Integer, ByVal message_flag As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4ChangeMessageFlag(_socket, no, message_flag, ReplaceMessage, _useuid)
            If _err < 0 Then
                Throw New nMailException("ReplaceMessageFlag: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' 添付ファイルの存在チェックを行います。
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <remarks>
        '''	分割されているメールについては一度受信後、Attachment クラスで結合してください。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <returns>true で添付ファイルが存在</returns>
        Public Function GetAttachmentFileStatus(ByVal no As Integer) As Boolean
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            SetHeaderSize()
            _err = Imap4GetMimeStructure(_socket, no, _useuid)
            If _err < 0 Then
                Throw New nMailException("GetAttachmentFileStatus: " + Options.ErrorMessage, _err)
            Else
                If _err > 1 Then
                    Return True
                Else
                    Return False
                End If
            End If
        End Function

        ''' <summary>
        ''' メールの UID を取得します。
        ''' </summary>
        ''' <param name="no">メール番号</param>
        ''' <remarks>
        ''' <para>取得した UID は返値もしくは <see cref="Uid"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>メールの UID</returns>
        Public Function GetUid(ByVal no As Integer) As Integer
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            SetHeaderSize()
            _err = Imap4GetUid(_socket, no, _uid)
            If _err < 0 Then
                Throw New nMailException("GetUid: " + Options.ErrorMessage, _err)
            End If
            Return _uid
        End Function
        ''' <summary>
        ''' メールヘッダから指定のフィールドの内容を取得します。
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <returns>フィールドの内容</returns>
        ''' <remarks>
        ''' IMAP4 サーバとの接続とは無関係に使用できます。
        ''' <para>ヘッダは、<see cref="Header"/>で設定しておきます。
        ''' <see cref="GetMail"/>で受信した直後に呼び出した場合、
        ''' 受信したメールのヘッダを使用します。</para>
        ''' <para>取得したフィールド内容は<see cref="Field"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Function GetHeaderField(ByVal field_name As String) As String
            _field_name = field_name
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Imap4GetHeaderField(_field, _header.ToString(), _field_name, _header_size)
            If _err < 0 Then
                Throw New nMailException("GetHeaderField", _err)
            End If
            Return _field.ToString()
        End Function
        ''' <summary>
        ''' メールヘッダから指定のフィールドの内容を取得します。
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <param name="header">ヘッダ</param>
        ''' <returns>フィールドの内容</returns>
        Public Function GetHeaderField(ByVal field_name As String, ByVal header As String) As String
            _field_name = field_name
            _header = New StringBuilder(header)
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Imap4GetHeaderField(_field, _header.ToString(), _field_name, _header_size)
            If _err < 0 Then
                Throw New nMailException("GetHeaderField", _err)
            End If
            Return _field.ToString()
        End Function
        ''' <summary>
        ''' MIME ヘッダフィールドの文字列をデコードします
        ''' </summary>
        ''' <param name="field">フィールドの文字列</param>
        ''' <returns>デコードしたフィールド内容</returns>
        Public Function DecodeHeaderField(ByVal field As String) As String
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            _err = Imap4DecodeHeaderField(_field, field, _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function
        ''' <summary>
        ''' メールヘッダから指定のヘッダフィールドの内容を取得し、
        ''' MIME ヘッダフィールドのデコードを行って返します
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <returns>取得したデコード済みのフィールド内容</returns>
        Public Function GetDecodeHeaderField(ByVal field_name As String) As String
            SetHeaderSize()
            _field = New StringBuilder(_header_size)
            Dim src As String = GetHeaderField(field_name, _header.ToString())
            _err = Imap4DecodeHeaderField(_field, src, _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function
        ''' <summary>
        ''' メールヘッダから指定のヘッダフィールドの内容を取得し、
        ''' MIME ヘッダフィールドのデコードを行って返します
        ''' </summary>
        ''' <param name="field_name">フィールド名</param>
        ''' <param name="header">ヘッダ</param>
        ''' <returns>取得したデコード済みのフィールド内容</returns>
        Public Function GetDecodeHeaderField(ByVal field_name As String, ByVal header As String) As String
            SetHeaderSize()
            _err = Imap4DecodeHeaderField(_field, GetHeaderField(field_name, header), _header_size)
            If _err < 0 Then
                Throw New nMailException("DecodeHeaderField", _err)
            End If
            Return _field.ToString()
        End Function

        ''' <summary>
        ''' メールボックスを作成します。
        ''' </summary>
        ''' <param name="mailbox">作成するメールボックス名</param>
        ''' <remarks>
        ''' メールボックスを作成します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub CreateMailBox(ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4CreateMailBox(_socket, mailbox)
            If _err < 0 Then
                Throw New nMailException("CreateMailBox: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールボックスを削除します。
        ''' </summary>
        ''' <remarks>
        ''' メールボックスを削除します。
        ''' </remarks>
        ''' <param name="mailbox">削除するメールボックス名</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub DeleteMailBox(ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4DeleteMailBox(_socket, mailbox)
            If _err < 0 Then
                Throw New nMailException("DeleteMailBox: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールボックス名を変更します。
        ''' </summary>
        ''' <param name="old_name">変更する前のメールボックス名</param>
        ''' <param name="new_name">変更後のメールボックス名</param>
        ''' <remarks>
        ''' メールボックス名を変更します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub RenameMailBox(ByVal old_name As String, ByVal new_name As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4RenameMailBox(_socket, old_name, new_name)
            If _err < 0 Then
                Throw New nMailException("RenameMailBox: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールボックスを購読します。
        ''' </summary>
        ''' <param name="mailbox">購読するメールボックス名</param>
        ''' <remarks>
        ''' メールボックスを購読します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub SubscribeMailBox(ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4SubscribeMailBox(_socket, mailbox)
            If _err < 0 Then
                Throw New nMailException("SubscribeMailBox: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールボックスの購読を解除します。
        ''' </summary>
        ''' <param name="mailbox">購読解除するメールボックス名</param>
        ''' <remarks>
        ''' メールボックスの購読を解除します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub UnsubscribeMailBox(ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4UnsubscribeMailBox(_socket, mailbox)
            If _err < 0 Then
                Throw New nMailException("UnsubscribeMailBox: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールをコピーします。
        ''' </summary>
        ''' <param name="no">コピーするメール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <param name="mailbox">コピー先のメールボックス名</param>
        ''' <remarks>
        ''' 現在選択されているメールボックスのメールを指定のメールボックスにコピーします。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Copy(ByVal no As Integer, ByVal mailbox As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4CopyMail(_socket, no, mailbox, _useuid)
            If _err < 0 Then
                Throw New nMailException("Copy: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' MIME 構造を取得します。
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <remarks>
        ''' <para>MIME 構造は<see cref="GetMimeStructureStatusList"/>で取得できます。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub GetMimeStructure(ByVal no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4GetMimeStructure(_socket, no, _flag Or _useuid)
            If _err < 0 Then
                _mime_list = New MimeStructureStatus() {}
                Throw New nMailException("GetMimeStructure: " + Options.ErrorMessage, _err)
            Else
                Dim part_no As Integer
                Dim param_no As Integer
                Dim param_count As Integer
                SetHeaderSize()
                _mime_list = New MimeStructureStatus(_err - 1) {}
                For part_no = 0 To _err - 1
                    _mime_list(part_no).PartNo = part_no
                    Dim name As StringBuilder = New StringBuilder(_header_size)
                    Dim value As StringBuilder = New StringBuilder(_header_size)
                    Imap4GetMimeStructureStatus(_socket, ContentTypeAndSubType, part_no, 0, name, value, _header_size)
                    _mime_list(part_no).Type = name.ToString()
                    _mime_list(part_no).SubType = value.ToString()
                    Imap4GetMimeStructureStatus(_socket, ContentPart, part_no, 0, name, Nothing, _header_size)
                    _mime_list(part_no).Part = name.ToString()
                    Imap4GetMimeStructureStatus(_socket, ContentId, part_no, 0, name, Nothing, _header_size)
                    _mime_list(part_no).Id = name.ToString()
                    Imap4GetMimeStructureStatus(_socket, ContentDescription, part_no, 0, name, Nothing, _header_size)
                    _mime_list(part_no).Description = name.ToString()
                    Imap4GetMimeStructureStatus(_socket, ContentTransferEncoding, part_no, 0, name, Nothing, _header_size)
                    _mime_list(part_no).Encoding = name.ToString()
                    Imap4GetMimeStructureStatus(_socket, ContentFileName, part_no, 0, name, Nothing, _header_size)
                    _mime_list(part_no).FileName = name.ToString()
                    _mime_list(part_no).Size = Imap4GetMimeStructureStatus(_socket, ContentSize, part_no, 0, name, Nothing, _header_size)
                    If _mime_list(part_no).Size < 0 Then
                        _mime_list(part_no).Size = 0
                    End If
                    _mime_list(part_no).Line = Imap4GetMimeStructureStatus(_socket, ContentLine, part_no, 0, name, Nothing, _header_size)
                    If _mime_list(part_no).Line < 0 Then
                        _mime_list(part_no).Line = 0
                    End If
                    param_count = Imap4GetMimeStructureStatus(_socket, ContentParameterCount, part_no, 0, name, Nothing, _header_size)
                    If param_count < 0 Then
                        param_count = 0
                    End If
                    _mime_list(part_no).Parameter = New MimeParameterStatus(param_count - 1) {}
                    For param_no = 0 To param_count - 1
                        Imap4GetMimeStructureStatus(_socket, ContentParameter, part_no, param_no, name, value, _header_size)
                        _mime_list(part_no).Parameter(param_no).Name = name.ToString()
                        _mime_list(part_no).Parameter(param_no).Value = value.ToString()
                    Next param_no
                Next part_no
            End If
        End Sub

        ''' <summary>
        ''' MIME パートを取得
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <param name="part_no">MIME パート番号</param>
        ''' <remarks>
        ''' <para>既読フラグを立てない場合、デコードしない場合は、<see cref="MimeFlag"/>で設定しておきます。</para>
        ''' <para>取得したパート本文は<see cref="Body"/>で取得できます。</para>
        ''' <para>サンプルは <see cref="GetMimeStructure"/>を参照してください。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub GetMimePart(ByVal no As Integer, ByVal part_no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            Dim size As Integer = _mime_list(part_no).Size
            If size < 0 Then
                GetSize(no)
                size = _size
            End If
            _body = New StringBuilder(size * 2)
            _err = Imap4GetMimePart(_socket, no, part_no, _body, _mime_flag Or _useuid)
            If _err < 0 Then
                Throw New nMailException("GetMimePart: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' MIME パートヘッダを取得
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <param name="part_no">MIME パート番号</param>
        ''' <remarks>
        ''' <para>既読フラグを立てない場合、デコードしない場合は、<see cref="MimeFlag"/>で設定しておきます。</para>
        ''' <para>取得したパートヘッダは<see cref="Header"/>で取得できます。</para>
        ''' <para>サンプルは <see cref="GetMimeStructure"/>を参照してください。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub GetMimePartHeader(ByVal no As Integer, ByVal part_no As Integer)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            Dim size As Integer = _mime_list(part_no).Size
            If size < 0 Then
                GetSize(no)
                size = _size
            End If
            _body = New StringBuilder(size * 2)
            _err = Imap4GetMimePart(_socket, no, part_no, _header, MimeHeader Or _mime_flag Or _useuid)
            If _err < 0 Then
                Throw New nMailException("GetMimePartHeader: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' MIME パートを保存
        ''' </summary>
        ''' <param name="no">メール番号(<see cref="UseUid"/>が true の場合 UID)</param>
        ''' <param name="part_no">MIME パート番号</param>
        ''' <param name="path">保存するファイル名</param>
        ''' <remarks>
        ''' <para>既読フラグを立てない場合、デコードしない場合は、<see cref="MimeFlag"/>で設定しておきます。</para>
        ''' <para>保存したファイル名は<see cref="FileName"/>で取得できます。</para>
        ''' <para>サンプルは <see cref="GetMimeStructure"/>を参照してください。</para>
        ''' <para>Content-Type のタイプが "multipart" の MIME パートを指定した場合、エラーになりますのでご注意下さい。</para>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub SaveMimePart(ByVal no As Integer, ByVal part_no As Integer, ByVal path As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            Options.FileNameMax = MaxPath
            _filename = New StringBuilder(MaxPath)
            _err = Imap4SaveMimePart(_socket, no, part_no, path, _filename, MimeSaveAsFile Or _mime_flag Or _useuid)
            If _err < 0 Then
                Throw New nMailException("SaveMimePart: " + Options.ErrorMessage, _err)
            End If
        End Sub

        ''' <summary>
        ''' メールの検索実行(文字列有)
        ''' </summary>
        ''' <param name="type">検索条件
        ''' <para>検索条件の設定可能な値は下記の通りです。</para>
        ''' <para><see cref="SearchKeyword"/>指定されたキーワードあり</para>
        ''' <para><see cref="SearchUnKeyword"/>指定されたキーワードなし</para>
        ''' <para><see cref="SearchFrom"/>From ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchTo"/>To ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchCc"/>CC ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchBcc"/>BCC ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchSubject"/>SUBJECT ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchSentBefore"/>DATE ヘッダが指定された日付以前</para>
        ''' <para><see cref="SearchSentOn"/>DATE ヘッダが指定された日付</para>
        ''' <para><see cref="SearchSentSince"/>DATE ヘッダが指定された日付以降</para>
        ''' <para><see cref="SearchBefore"/>指定された日付以前に到着</para>
        ''' <para><see cref="SearchOn"/>指定された日付に到着</para>
        ''' <para><see cref="SearchSince"/>指定された日付以降に到着</para>
        ''' <para><see cref="SearchHeader"/>指定されたヘッダフィールドに文字列を含む 検索文字列に"ヘッダフィールド 文字列"と指定してください</para>
        ''' <para><see cref="SearchBody"/>本文に文字列を含む</para>
        ''' <para><see cref="SearchText"/>ヘッダおよび本文に文字列を含む</para>
        ''' <para><see cref="SearchLager"/>指定サイズより大きなメール サイズは文字列に変換してください</para>
        ''' <para><see cref="SearchSmaller"/>指定サイズより小さなメール サイズは文字列に変換してください</para>
        ''' <para><see cref="SearchUid"/>指定 UID のメール</para>
        ''' <para><see cref="SearchCommand"/>検索文字列を直接指定</para>
        ''' <para><see cref="SearchNot"/>検索条件 NOT (上記の検索条件と同時に(C# では | 、VB.NET では Or)指定する必要があります)</para>
        ''' </param>
        ''' <param name="text">検索文字列</param>
        ''' <remarks>
        '''	検索結果は <see cref="GetSearchMailResultList"/> で取得できます。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Search(ByVal type As Integer, ByVal text As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            If _search_first_flag Then
                type = type Or SearchFirst
                _search_first_flag = False
            End If
            _err = Imap4SearchMail(_socket, type, text, _useuid)
            _search_first_flag = True
            If _err < 0 Then
                _search_list = New Integer() {}
                Throw New nMailException("Search: " + Options.ErrorMessage, _err)
            Else
                Dim no As Integer
                _search_list = New Integer(_err - 1) {}
                For no = 0 To _err - 1
                    Imap4GetSearchMailResult(_socket, no, _search_list(no))
                Next no
            End If
        End Sub
        ''' <summary>
        ''' メールの検索実行(文字列無)
        ''' </summary>
        ''' <param name="type">検索条件
        ''' <para>検索条件の設定可能な値は下記の通りです。</para>
        ''' <para><see cref="SearchAnswered"/>返信済み</para>
        ''' <para><see cref="SearchUnAnswered"/>返信済みでない</para>
        ''' <para><see cref="SearchDeleted"/>消去マークあり</para>
        ''' <para><see cref="SearchUnDeleted"/>消去マークなし</para>
        ''' <para><see cref="SearchDraft"/>草稿フラグあり</para>
        ''' <para><see cref="SearchUnDraft"/>草稿フラグなし</para>
        ''' <para><see cref="SearchFlagged"/>重要性フラグあり</para>
        ''' <para><see cref="SearchUnFlagged"/>重要性フラグなし</para>
        ''' <para><see cref="SearchRecent"/>到着フラグあり</para>
        ''' <para><see cref="SearchUnRecent"/>到着フラグなし</para>
        ''' <para><see cref="SearchSeen"/>既読フラグあり</para>
        ''' <para><see cref="SearchUnSeen"/>既読フラグなし</para>
        ''' <para><see cref="SearchNew"/>到着フラグありかつ既読フラグなし</para>
        ''' <para><see cref="SearchAll"/>全てのメール</para>
        ''' <para><see cref="SearchNot"/>検索条件 NOT (上記の検索条件と同時に(C# では | 、VB.NET では Or)指定する必要があります)</para>
        ''' </param>
        ''' <remarks>
        '''	検索結果は <see cref="GetSearchMailResultList"/> で取得できます。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub Search(ByVal type As Integer)
            Search(type, Nothing)
        End Sub

        ''' <summary>
        ''' メールの検索 AND (文字列有)
        ''' </summary>
        ''' <param name="type">検索条件
        ''' <para>検索条件の設定可能な値は下記の通りです。</para>
        ''' <para><see cref="SearchKeyword"/>指定されたキーワードあり</para>
        ''' <para><see cref="SearchUnKeyword"/>指定されたキーワードなし</para>
        ''' <para><see cref="SearchFrom"/>From ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchTo"/>To ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchCc"/>CC ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchBcc"/>BCC ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchSubject"/>SUBJECT ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchSentBefore"/>DATE ヘッダが指定された日付以前</para>
        ''' <para><see cref="SearchSentOn"/>DATE ヘッダが指定された日付</para>
        ''' <para><see cref="SearchSentSince"/>DATE ヘッダが指定された日付以降</para>
        ''' <para><see cref="SearchBefore"/>指定された日付以前に到着</para>
        ''' <para><see cref="SearchOn"/>指定された日付に到着</para>
        ''' <para><see cref="SearchSince"/>指定された日付以降に到着</para>
        ''' <para><see cref="SearchHeader"/>指定されたヘッダフィールドに文字列を含む 検索文字列に"ヘッダフィールド 文字列"と指定してください</para>
        ''' <para><see cref="SearchBody"/>本文に文字列を含む</para>
        ''' <para><see cref="SearchText"/>ヘッダおよび本文に文字列を含む</para>
        ''' <para><see cref="SearchLager"/>指定サイズより大きなメール サイズは文字列に変換してください</para>
        ''' <para><see cref="SearchSmaller"/>指定サイズより小さなメール サイズは文字列に変換してください</para>
        ''' <para><see cref="SearchUid"/>指定 UID のメール</para>
        ''' <para><see cref="SearchCommand"/>検索文字列を直接指定</para>
        ''' <para><see cref="SearchNot"/>検索条件 NOT (上記の検索条件と同時に(C# では | 、VB.NET では Or)指定する必要があります)</para>
        ''' </param>
        ''' <param name="text">検索文字列</param>
        ''' <remarks>
        '''	AND で検索条件を指定します。<see cref="Search"/>で検索を実行します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub AddSearchAnd(ByVal type As Integer, ByVal text As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            If _search_first_flag Then
                type = type Or SearchFirst
                _search_first_flag = False
            End If
            _err = Imap4SearchMail(_socket, type Or SearchAnd, text, _useuid)
            If _err < 0 Then
                Throw New nMailException("Search: " + Options.ErrorMessage, _err)
            End If
        End Sub
        ''' <summary>
        ''' メールの検索 AND (文字列無)
        ''' </summary>
        ''' <param name="type">検索条件
        ''' <para>検索条件の設定可能な値は下記の通りです。</para>
        ''' <para><see cref="SearchAnswered"/>返信済み</para>
        ''' <para><see cref="SearchUnAnswered"/>返信済みでない</para>
        ''' <para><see cref="SearchDeleted"/>消去マークあり</para>
        ''' <para><see cref="SearchUnDeleted"/>消去マークなし</para>
        ''' <para><see cref="SearchDraft"/>草稿フラグあり</para>
        ''' <para><see cref="SearchUnDraft"/>草稿フラグなし</para>
        ''' <para><see cref="SearchFlagged"/>重要性フラグあり</para>
        ''' <para><see cref="SearchUnFlagged"/>重要性フラグなし</para>
        ''' <para><see cref="SearchRecent"/>到着フラグあり</para>
        ''' <para><see cref="SearchUnRecent"/>到着フラグなし</para>
        ''' <para><see cref="SearchSeen"/>既読フラグあり</para>
        ''' <para><see cref="SearchUnSeen"/>既読フラグなし</para>
        ''' <para><see cref="SearchNew"/>到着フラグありかつ既読フラグなし</para>
        ''' <para><see cref="SearchAll"/>全てのメール</para>
        ''' <para><see cref="SearchNot"/>検索条件 NOT (上記の検索条件と同時に(C# では | 、VB.NET では Or)指定する必要があります)</para>
        ''' </param>
        ''' <remarks>
        '''	AND で検索条件を指定します。<see cref="Search"/>で検索を実行します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub AddSearchAnd(ByVal type As Integer)
            AddSearchAnd(type, Nothing)
        End Sub
        ''' <summary>
        ''' メールの検索 OR (文字列有)
        ''' </summary>
        ''' <param name="type">検索条件
        ''' <para>検索条件の設定可能な値は下記の通りです。</para>
        ''' <para><see cref="SearchKeyword"/>指定されたキーワードあり</para>
        ''' <para><see cref="SearchUnKeyword"/>指定されたキーワードなし</para>
        ''' <para><see cref="SearchFrom"/>From ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchTo"/>To ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchCc"/>CC ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchBcc"/>BCC ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchSubject"/>SUBJECT ヘッダに指定の文字列あり</para>
        ''' <para><see cref="SearchSentBefore"/>DATE ヘッダが指定された日付以前</para>
        ''' <para><see cref="SearchSentOn"/>DATE ヘッダが指定された日付</para>
        ''' <para><see cref="SearchSentSince"/>DATE ヘッダが指定された日付以降</para>
        ''' <para><see cref="SearchBefore"/>指定された日付以前に到着</para>
        ''' <para><see cref="SearchOn"/>指定された日付に到着</para>
        ''' <para><see cref="SearchSince"/>指定された日付以降に到着</para>
        ''' <para><see cref="SearchHeader"/>指定されたヘッダフィールドに文字列を含む 検索文字列に"ヘッダフィールド 文字列"と指定してください</para>
        ''' <para><see cref="SearchBody"/>本文に文字列を含む</para>
        ''' <para><see cref="SearchText"/>ヘッダおよび本文に文字列を含む</para>
        ''' <para><see cref="SearchLager"/>指定サイズより大きなメール サイズは文字列に変換してください</para>
        ''' <para><see cref="SearchSmaller"/>指定サイズより小さなメール サイズは文字列に変換してください</para>
        ''' <para><see cref="SearchUid"/>指定 UID のメール</para>
        ''' <para><see cref="SearchCommand"/>検索文字列を直接指定</para>
        ''' <para><see cref="SearchNot"/>検索条件 NOT (上記の検索条件と同時に(C# では | 、VB.NET では Or)指定する必要があります)</para>
        ''' </param>
        ''' <param name="text">検索文字列</param>
        ''' <remarks>
        '''	OR で検索条件を指定します。<see cref="Search"/>で検索を実行します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub AddSearchOr(ByVal type As Integer, ByVal text As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            If _search_first_flag Then
                type = type Or SearchFirst
                _search_first_flag = False
            End If
            _err = Imap4SearchMail(_socket, type Or SearchOr, text, _useuid)
            If _err < 0 Then
                Throw New nMailException("Search: " + Options.ErrorMessage, _err)
            End If
        End Sub
        ''' <summary>
        ''' メールの検索 OR (文字列無)
        ''' </summary>
        ''' <param name="type">検索条件
        ''' <para>検索条件の設定可能な値は下記の通りです。</para>
        ''' <para><see cref="SearchAnswered"/>返信済み</para>
        ''' <para><see cref="SearchUnAnswered"/>返信済みでない</para>
        ''' <para><see cref="SearchDeleted"/>消去マークあり</para>
        ''' <para><see cref="SearchUnDeleted"/>消去マークなし</para>
        ''' <para><see cref="SearchDraft"/>草稿フラグあり</para>
        ''' <para><see cref="SearchUnDraft"/>草稿フラグなし</para>
        ''' <para><see cref="SearchFlagged"/>重要性フラグあり</para>
        ''' <para><see cref="SearchUnFlagged"/>重要性フラグなし</para>
        ''' <para><see cref="SearchRecent"/>到着フラグあり</para>
        ''' <para><see cref="SearchUnRecent"/>到着フラグなし</para>
        ''' <para><see cref="SearchSeen"/>既読フラグあり</para>
        ''' <para><see cref="SearchUnSeen"/>既読フラグなし</para>
        ''' <para><see cref="SearchNew"/>到着フラグありかつ既読フラグなし</para>
        ''' <para><see cref="SearchAll"/>全てのメール</para>
        ''' <para><see cref="SearchNot"/>検索条件 NOT (上記の検索条件と同時に(C# では | 、VB.NET では Or)指定する必要があります)</para>
        ''' </param>
        ''' <remarks>
        '''	OR で検索条件を指定します。<see cref="Search"/>で検索を実行します。
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub AddSearchOr(ByVal type As Integer)
            AddSearchOr(type, Nothing)
        End Sub

        ''' <summary>
        ''' メールボックスにメールをアップロードします。
        ''' </summary>
        ''' <param name="mailbox">アップロードするメールボックス</param>
        ''' <param name="header">メールヘッダ
        ''' <para>Date,Message-ID,Mime-Version,Content-Type,Content-Transfer-Encode フィールド</para>
        ''' <para>は自動的に付加されます。Date フィールドには現在日時が設定されます。</para>
        ''' <para>Date および Message-ID フィールドは引数 header に記述があればそちらが優先されます。</para>
        ''' </param>
        ''' <param name="body">メール本文</param>
        ''' <param name="message_flag">メッセージフラグ
        ''' <para><see cref="MessageAnswerd"/>返信済みフラグ</para>
        ''' <para><see cref="MessageDeleted"/>消去マーク</para>
        ''' <para><see cref="MessageDraft"/>草稿フラグ</para>
        ''' <para><see cref="MessageFlagged"/>重要性フラグ</para>
        ''' <para><see cref="MessageRecent"/>到着フラグ</para>
        ''' <para><see cref="MessageSeen"/>既読フラグ</para>
        ''' <para>C# は | 、VB.NET では Or で複数指定可能です。</para>
        ''' </param>
        ''' <param name="path">添付ファイル名</param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub AppendMail(ByVal mailbox As String, ByVal header As String, ByVal body As String, ByVal message_flag As Integer, ByVal path As String)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4AppendMail(_socket, mailbox, header, body, path, message_flag, Nothing, AddDateField Or AddMessageId)
            If _err < 0 Then
                Throw New nMailException("AppendMail: " + Options.ErrorMessage, _err)
            End If
        End Sub
        ''' <summary>
        ''' メールボックスにメールをアップロードします。
        ''' </summary>
        ''' <param name="mailbox">アップロードするメールボックス</param>
        ''' <param name="header">メールヘッダ
        ''' <para>Date,Message-ID,Mime-Version,Content-Type,Content-Transfer-Encode フィールド</para>
        ''' <para>は自動的に付加されます。Date フィールドには現在日時が設定されます。</para>
        ''' <para>Date および Message-ID フィールドは引数 header に記述があればそちらが優先されます。</para>
        ''' </param>
        ''' <param name="body">メール本文</param>
        ''' <param name="message_flag">メッセージフラグ
        ''' <para><see cref="MessageAnswerd"/>返信済みフラグ</para>
        ''' <para><see cref="MessageDeleted"/>消去マーク</para>
        ''' <para><see cref="MessageDraft"/>草稿フラグ</para>
        ''' <para><see cref="MessageFlagged"/>重要性フラグ</para>
        ''' <para><see cref="MessageRecent"/>到着フラグ</para>
        ''' <para><see cref="MessageSeen"/>既読フラグ</para>
        ''' <para>C# は | 、VB.NET では Or で複数指定可能です。</para>
        ''' </param>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub AppendMail(ByVal mailbox As String, ByVal header As String, ByVal body As String, ByVal message_flag As Integer)
            AppendMail(mailbox, header, body, message_flag, Nothing)
        End Sub

        Private Sub SetNameSpaceList(ByRef list As NameSpaceStatus(), ByVal command1 As Integer, ByVal command2 As Integer)
            Dim count As Integer
            Dim no As Integer
            Dim separate As StringBuilder = New StringBuilder(_header_size)
            Dim name As StringBuilder = New StringBuilder(_header_size)

            count = Imap4GetNameSpaceStatus(_socket, command1, Nothing, Nothing, 0)
            list = New NameSpaceStatus(count - 1) {}
            For no = 0 To count - 1
                If Imap4GetNameSpaceStatus(_socket, command2 Or no, separate, name, _header_size) = Success Then
                    list(no).Name = name.ToString()
                    list(no).Separate = separate(0)
                End If
            Next no
        End Sub

        ''' <summary>
        ''' 名前空間を取得します。
        ''' </summary>
        ''' <exception cref="InvalidOperationException">
        '''	接続状態ではありません。(<see cref="Connect"/>が成功していないか、呼び出されていません。
        '''	</exception>
        '''	<exception cref="nMailException">
        '''	サーバとの交信中にエラーが発生しました。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        Public Sub GetNameSpace()
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4GetNameSpace(_socket)
            If _err < 0 Then
                Throw New nMailException("GetNameSpace: " + Options.ErrorMessage, _err)
            Else
                Dim count As Integer
                Dim no As Integer
                Dim name_no As Integer
                Dim c1 As Integer() = {NameSpacePersonalCount, NameSpaceOtherCount, NameSpaceSharedCount}
                Dim c2 As Integer() = {NameSpacePersonalNo, NameSpaceOtherNo, NameSpaceSharedNo}

                SetHeaderSize()
                For name_no = NameSpacePersonal To NameSpaceShared
                    count = Imap4GetNameSpaceStatus(_socket, c1(name_no), Nothing, Nothing, 0)
                    _namespace_list(name_no) = New NameSpaceStatus(count - 1) {}
                    For no = 0 To count - 1
                        Dim separate As StringBuilder = New StringBuilder(_header_size)
                        Dim name As StringBuilder = New StringBuilder(_header_size)
                        If Imap4GetNameSpaceStatus(_socket, c2(name_no) Or no, separate, name, _header_size) = Success Then
                            _namespace_list(name_no)(no).Name = name.ToString()
                            _namespace_list(name_no)(no).Separate = separate(0)
                        End If
                    Next no
                Next name_no
            End If
        End Sub

        ''' <summary>
        ''' 検索用日付指定文字列を作成します。
        ''' </summary>
        ''' <remarks>
        ''' 日付指定文字列を作成します。
        ''' <para>検索用 例: "09-Jul-2009"</para>
        ''' </remarks>
        ''' <returns>作成した日付指定文字列</returns>
        Public Function MakeSearchDateString(ByVal tm As DateTime) As String
            Dim _datestring As StringBuilder = New StringBuilder(DateStringSize)
            MakeDateString(_datestring, tm.Year, tm.Month, tm.Day, tm.Hour, tm.Minute, tm.Second, DateImap4)
            Return _datestring.ToString()
        End Function
        ''' <summary>
        ''' AppenMail用日時指定文字列を作成します。
        ''' </summary>
        ''' <remarks>
        ''' 日時指定文字列を作成します。
        ''' <para>AppendMail用 例: "09-Jul-2009 15:10:30"</para>
        ''' <para>※今のところ AppendMail でアップロードする際のサーバが内部的に持つ日時指定には</para>
        ''' <para>　Imap4 クラスのメソッドでは対応していません。</para>
        ''' <para>　Date ヘッダフィールドの値は <see cref="MakeFieldDateString"/> で作成して付加することができます。</para>
        ''' </remarks>
        ''' <returns>作成した日時指定文字列</returns>
        Public Function MakeAppendDateString(ByVal tm As DateTime) As String
            Dim _datestring As StringBuilder = New StringBuilder(DateStringSize)
            MakeDateString(_datestring, tm.Year, tm.Month, tm.Day, tm.Hour, tm.Minute, tm.Second, DateTimeImap4)
            Return _datestring.ToString()
        End Function
        ''' <summary>
        ''' Date ヘッダフィールド用日時指定文字列を作成します。
        ''' </summary>
        ''' <remarks>
        ''' 日時指定文字列を作成します。
        ''' <para>Date ヘッダフィールド用 例: "Thu, 9 Jul 2009 15:10:30 +09:00"</para>
        ''' <para><see cref="AppendMail"/> で指定の日時の Date ヘッダフィールドを付加したい場合に使用します。</para>
        ''' </remarks>
        ''' <returns>作成した日時指定文字列</returns>
        Public Function MakeFieldDateString(ByVal tm As DateTime) As String
            Dim _datestring As StringBuilder = New StringBuilder(DateStringSize)
            MakeDateString(_datestring, tm.Year, tm.Month, tm.Day, tm.Hour, tm.Minute, tm.Second, DateTimeSmtp)
            Return _datestring.ToString()
        End Function
        ''' <summary>
        ''' なにも実行しません
        ''' </summary>
        ''' <remarks>
        ''' サーバとの接続タイムアウト防止等に使用します。
        ''' </remarks>
        Public Sub NoOperation()
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4NoOperation(_socket)
            If _err < 0 Then
                Throw New nMailException("NoOperation: " + Options.ErrorMessage, _err)
            End If
        End Sub

        Public Overridable Sub OnIdleEvent(e As EventArgs)
            RaiseEvent IdleEvent(Me, e)
        End Sub

        Private Sub IdleWaitThread()
            WaitForSingleObject(_event, INFINITE)
            If _thread_event_flag Then
                OnIdleEvent(EventArgs.Empty)
            End If
        End Sub

        ''' <summary>
        ''' IDLE 開始
        ''' </summary>
        ''' <remarks>
        ''' IMAP4 IDLE を開始します。
        ''' </remarks>
        Public Sub StartIdle()
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4StartIdle(_socket, IntPtr.Zero, 0)
            If _err < 0 Then
                Throw New nMailException("StartIdle: " + Options.ErrorMessage, _err)
            End If
            _event = Imap4GetIdleEvent(_socket)
            If Not _event.Equals(IntPtr.Zero) Then
                Dim thread_flag As Boolean = False
                If _thread Is Nothing Then
                    thread_flag = True
                ElseIf Not _thread.IsAlive Then
                    thread_flag = True
                End If
                If thread_flag Then
                    _thread_event_flag = True
                    _thread = New Thread(New ThreadStart(AddressOf IdleWaitThread))
                    _thread.Start()
                End If
            End If
        End Sub
        ''' <summary>
        ''' IDLE 終了
        ''' </summary>
        ''' <remarks>
        ''' IMAP4 IDLE を終了します。
        ''' </remarks>
        Public Sub EndIdle()
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            _err = Imap4EndIdle(_socket)
            If _err < 0 Then
                Throw New nMailException("EndIdle: " + Options.ErrorMessage, _err)
            End If
        End Sub
        ''' <summary>
        ''' 添付ファイル名の配列を取得します。
        ''' </summary>
        ''' <returns>添付ファイル名の配列</returns>
        Public Function GetFileNameList() As String()
            If _filename_list Is Nothing Then
                Return New String() {}
            Else
                Return CType(_filename_list.Clone(), String())
            End If
        End Function
        ''' <summary>
        ''' メールボックス情報の配列を取得します。
        ''' </summary>
        ''' <returns>メールボックス情報の配列</returns>
        Public Function GetMailBoxStatusList() As MailBoxStatus()
            Return CType(_mailbox_list.Clone(), MailBoxStatus())
        End Function
        ''' <summary>
        ''' MIME 構造情報の配列を取得します。
        ''' </summary>
        ''' <returns>MIME 構造情報の配列</returns>
        Public Function GetMimeStructureStatusList() As MimeStructureStatus()
            Return CType(_mime_list.Clone(), MimeStructureStatus())
        End Function
        ''' <summary>
        ''' 検索結果情報の配列を取得します。
        ''' </summary>
        ''' <returns>検索結果の配列</returns>
        Public Function GetSearchMailResultList() As Integer()
            Return CType(_search_list.Clone(), Integer())
        End Function
        ''' <summary>
        ''' 個人名前空間情報の配列を取得します。
        ''' </summary>
        ''' <remarks>
        '''	<para><see cref="GetNameSpace"/>実行後に呼び出してください。</para>
        ''' </remarks>
        ''' <returns>名前空間情報の配列</returns>
        Public Function GetNameSpacePersonalStatusList() As NameSpaceStatus()
            Return CType(_namespace_list(NameSpacePersonal).Clone(), NameSpaceStatus())
        End Function
        ''' <summary>
        ''' 他人名前空間情報の配列を取得します。
        ''' </summary>
        ''' <remarks>
        '''	<para><see cref="GetNameSpace"/>実行後に呼び出してください。</para>
        ''' </remarks>
        ''' <returns>名前空間情報の配列</returns>
        Public Function GetNameSpaceOtherStatusList() As NameSpaceStatus()
            Return CType(_namespace_list(NameSpaceOther).Clone(), NameSpaceStatus())
        End Function
        ''' <summary>
        ''' 共有名前空間情報の配列を取得します。
        ''' </summary>
        ''' <remarks>
        '''	<para><see cref="GetNameSpace"/>実行後に呼び出してください。</para>
        ''' </remarks>
        ''' <returns>名前空間情報の配列</returns>
        Public Function GetNameSpaceSharedStatusList() As NameSpaceStatus()
            Return CType(_namespace_list(NameSpaceShared).Clone(), NameSpaceStatus())
        End Function

        ''' <summary>
        ''' IMAP4 ポート番号です。
        ''' </summary>
        ''' <value>IMAP4 ポート番号</value>
        Public Property Port() As Integer
            Get
                Return _port
            End Get
            Set(ByVal Value As Integer)
                _port = Value
            End Set
        End Property

        ''' <summary>
        ''' ソケットハンドルです。
        ''' </summary>
        ''' <value>SMTP ソケットハンドル</value>
        Public ReadOnly Property Handle() As IntPtr
            Get
                Return _socket
            End Get
        End Property

        ''' <summary>
        ''' メールボックスにあるメール数です。
        ''' </summary>
        ''' <value>現在選択されているメールボックスにあるメール数</value>
        Public ReadOnly Property Count() As Integer
            Get
                Return _count
            End Get
        End Property

        ''' <summary>
        ''' メールのサイズです。
        ''' </summary>
        ''' <value>メールのサイズ</value>
        Public ReadOnly Property Size() As Integer
            Get
                Return _size
            End Get
        End Property

        ''' <summary>
        ''' IMAP4 サーバ名です。
        ''' </summary>
        ''' <value>IMAP4 サーバ名</value>
        Public Property HostName() As String
            Get
                Return _host
            End Get
            Set(ByVal Value As String)
                _host = Value
            End Set
        End Property

        ''' <summary>
        ''' IMAP4 ユーザー名です。
        ''' </summary>
        ''' <value>IMAP4 ユーザー名</value>
        Public Property Id() As String
            Get
                Return _id
            End Get
            Set(ByVal Value As String)
                _id = Value
            End Set
        End Property

        ''' <summary>
        ''' IMAP4 パスワードです。
        ''' </summary>
        ''' <value>IMAP4 パスワード</value>
        Public Property Password() As String
            Get
                Return _password
            End Get
            Set(ByVal Value As String)
                _password = Value
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイルを保存するフォルダです。
        ''' </summary>
        ''' <remarks>
        ''' Nothing (VB.Net は Nothing) の場合保存しません。
        ''' </remarks>
        ''' <value>添付ファイル保存フォルダ</value>
        Public Property Path() As String
            Get
                Return _path
            End Get
            Set(ByVal Value As String)
                _path = Value
            End Set
        End Property

        ''' <summary>
        ''' メールの本文です。
        ''' </summary>
        ''' <value>メール本文</value>
        Public ReadOnly Property Body() As String
            Get
                Return _body.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの件名です。
        ''' </summary>
        ''' <value>メールの件名</value>
        Public ReadOnly Property Subject() As String
            Get
                Return _subject.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの送信日時の文字列です。
        ''' </summary>
        ''' <value>メール送信日時文字列</value>
        Public ReadOnly Property DateString() As String
            Get
                Return _date.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの差出人です。
        ''' </summary>
        ''' <value>メールの差出人</value>
        Public ReadOnly Property From() As String
            Get
                Return _from.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールのヘッダです。
        ''' </summary>
        ''' <value>メールのヘッダ</value>
        Public Property Header() As String
            Get
                Return _header.ToString()
            End Get
            Set(ByVal Value As String)
                _header = New StringBuilder(Value)
            End Set
        End Property

        ''' <summary>
        ''' 添付ファイル名です。
        ''' </summary>
        ''' <remarks>
        ''' 複数の添付ファイルがある場合、"," で区切られて格納されます。
        ''' <see cref="Options.SplitChar"/>で区切り文字を変更できます。
        ''' </remarks>
        ''' <value>添付ファイル名</value>
        Public ReadOnly Property FileName() As String
            Get
                Return _filename.ToString()
            End Get
        End Property

        ''' <summary>
        ''' 添付ファイル名の配列です。
        ''' </summary>
        '''	<remarks>
        ''' このプロパティは互換性のために残してあります。
        '''	<see cref="GetFileNameList"/>で配列を取得して使用するようにしてください。
        '''	</remarks>
        ''' <value>添付ファイル名の配列</value>
        Public ReadOnly Property FileNameList() As String()
            Get
                Return _filename_list
            End Get
        End Property

        ''' <summary>
        ''' メールボックス情報の配列です。
        ''' </summary>
        '''	<remarks>
        '''	<see cref="GetMailBoxStatusList"/>で配列を取得して使用するのを推薦します。
        '''	</remarks>
        ''' <value>メールボックス情報の配列</value>
        Public ReadOnly Property MailBoxStatusList() As MailBoxStatus()
            Get
                Return _mailbox_list
            End Get
        End Property

        ''' <summary>
        ''' MIME 構造情報の配列です。
        ''' </summary>
        '''	<remarks>
        '''	<see cref="GetMimeStructureStatusList"/>で配列を取得して使用するのを推薦します。
        '''	</remarks>
        ''' <value>MIME 構造情報の配列</value>
        Public ReadOnly Property MimeStructureStatusList() As MimeStructureStatus()
            Get
                Return _mime_list
            End Get
        End Property

        ''' <summary>
        ''' 個人名前空間情報の配列です。
        ''' </summary>
        '''	<remarks>
        '''	<see cref="GetNameSpacePersonalStatusList"/>で配列を取得して使用するのを推薦します。
        '''	</remarks>
        ''' <value>個人名前空間情報の配列</value>
        Public ReadOnly Property NameSpacePersonalStatusList() As NameSpaceStatus()
            Get
                Return _namespace_list(NameSpacePersonal)
            End Get
        End Property
        ''' <summary>
        ''' 他人名前空間情報の配列です。
        ''' </summary>
        '''	<remarks>
        '''	<see cref="GetNameSpaceOtherStatusList"/>で配列を取得して使用するのを推薦します。
        '''	</remarks>
        ''' <value>他人名前空間情報の配列</value>
        Public ReadOnly Property NameSpaceOtherStatusList() As NameSpaceStatus()
            Get
                Return _namespace_list(NameSpaceOther)
            End Get
        End Property
        ''' <summary>
        ''' 共有名前空間情報の配列です。
        ''' </summary>
        '''	<remarks>
        '''	<see cref="GetNameSpaceSharedStatusList"/>で配列を取得して使用するのを推薦します。
        '''	</remarks>
        ''' <value>共有名前空間情報の配列</value>
        Public ReadOnly Property NameSpaceSharedStatusList() As NameSpaceStatus()
            Get
                Return _namespace_list(NameSpaceShared)
            End Get
        End Property

        ''' <summary>
        ''' 検索結果情報の配列を取得します。
        ''' </summary>
        '''	<remarks>
        '''	<see cref="GetSearchMailResultList"/>で配列を取得して使用するのを推薦します。
        '''	</remarks>
        ''' <returns>検索結果の配列</returns>
        Public ReadOnly Property SearchMailResultList() As Integer()
            Get
                Return _search_list
            End Get
        End Property

        ''' <summary>
        ''' ヘッダのフィールド名です。
        ''' </summary>
        ''' <value>ヘッダのフィールド名</value>
        Public ReadOnly Property FieldName() As String
            Get
                Return _field_name
            End Get
        End Property

        ''' <summary>
        ''' ヘッダフィールドの内容です。
        ''' </summary>
        ''' <value>ヘッダフィールドの内容</value>
        Public ReadOnly Property Field() As String
            Get
                Return _field.ToString()
            End Get
        End Property

        ''' <summary>
        ''' メールの UID です。
        ''' </summary>
        ''' <value>メール UID</value>
        Public ReadOnly Property Uid() As Integer
            Get
                Return _uid
            End Get
        End Property

        ''' <summary>
        ''' IMAP4 認証方法です。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="AuthLogin"/> で LOGIN を使用します。</para>
        ''' <para><see cref="AuthPlain"/> で PLAIN を使用します。</para>
        ''' <para><see cref="AuthCramMd5"/> CRAM MD5 を使用します。</para>
        ''' <para><see cref="AuthDigestMd5"/> DIGEST MD5 を使用します。</para>
        ''' <para>C# は | 、Visual Basic では or で複数設定可能です。</para>
        ''' <para>DIGEST MD5->CRAM MD5→PLAIN→LOGIN の順番で認証を試みます。</para>
        '''	<para>デフォルト値は AuthLogin です。</para>
        ''' </remarks>
        ''' <value>IMAP4 の認証方法</value>
        Public Property AuthMode() As Integer
            Get
                Return _mode
            End Get
            Set(ByVal Value As Integer)
                _mode = Value
            End Set
        End Property

        ''' <summary>
        ''' メール拡張機能指定フラグです。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="SuspendAttachmentFile"/>添付ファイル受信で一時休止ありの一回目に指定します。</para>
        ''' <para><see cref="SuspendNext"/>添付ファイル受信で一時休止ありの二回目以降に指定します。</para>
        ''' </remarks>
        Public Property Flag() As Integer
            Get
                Return _flag
            End Get
            Set(ByVal Value As Integer)
                _flag = Value
            End Set
        End Property

        ''' <summary>
        ''' MIME パート取得もしくは保存時の設定フラグです。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="MimePeek"/>既読フラグを立てません。</para>
        ''' <para><see cref="MimeNoDecode"/>デコードしません。</para>
        ''' </remarks>
        Public Property MimeFlag() As Integer
            Get
                Return _mime_flag
            End Get
            Set(ByVal Value As Integer)
                _mime_flag = Value
            End Set
        End Property

        ''' <summary>
        ''' メールメッセージのフラグです。
        ''' </summary>
        ''' <remarks>
        ''' <para><see cref="MessageAnswerd"/>返信済みフラグが付いています。</para>
        ''' <para><see cref="MessageDeleted"/>消去マークが付いています。</para>
        ''' <para><see cref="MessageDraft"/>草稿フラグが付いています。</para>
        ''' <para><see cref="MessageFlagged"/>重要性フラグが付いています。</para>
        ''' <para><see cref="MessageRecent"/>到着フラグが付いています。</para>
        ''' <para><see cref="MessageSeen"/>既読フラグが付いています。</para>
        ''' </remarks>
        Public ReadOnly Property MessageFlag() As Integer
            Get
                Return _message_flag
            End Get
        End Property

        ''' <summary>
        ''' メールを指定する際に UID を使用するかどうかのフラグです。
        ''' </summary>
        Public Property UseUid() As Boolean
            Get
                Return _useuid_flag
            End Get
            Set(ByVal Value As Boolean)
                _useuid_flag = Value
                If _useuid_flag Then
                    _useuid = UseUidValue
                Else
                    _useuid = 0
                End If
            End Set
        End Property
        ''' <summary>
        ''' エラー番号です。
        ''' </summary>
        ''' <value>エラー番号</value>
        Public ReadOnly Property ErrorCode() As Integer
            Get
                Return _err
            End Get
        End Property

        ''' <summary>
        ''' HTML パートを保存したファイルの名前です。
        ''' </summary>
        ''' <value>ファイル名</value>
        Public ReadOnly Property HtmlFile() As String
            Get
                If _html_file Is Nothing Then
                    Return ""
                Else
                    Return _html_file.ToString()
                End If
            End Get
        End Property

        ''' <summary>
        ''' SSL 設定フラグです。
        ''' </summary>
        ''' <value>SSL 設定フラグ</value>
        Public Property SSL() As Integer
            Get
                Return _ssl
            End Get
            Set(ByVal Value As Integer)
                _ssl = Value
            End Set
        End Property
        ''' <summary>
        ''' SSL クライアント証明書名です。
        ''' </summary>
        ''' <remarks>
        ''' Nothing の場合指定しません。
        ''' </remarks>
        ''' <value>SSL クライアント証明書名</value>
        Public Property CertName() As String
            Get
                Return _cert_name
            End Get
            Set(ByVal Value As String)
                _cert_name = Value
            End Set
        End Property

        ''' <summary>
        ''' message/rfc822 パートを保存したファイルの名前です。
        ''' </summary>
        ''' <value>ファイル名</value>
        Public ReadOnly Property Rfc822File() As String
            Get
                If _rfc822_file Is Nothing Then
                    Return ""
                Else
                    Return _rfc822_file.ToString()
                End If
            End Get
        End Property
    End Class

    Class OAuth2
        Implements IDisposable
	''' <summary>
        '''文字列取得用のバッファサイズです。
        ''' </summary>
        Protected Const MaxBuffer As Integer = 32768
        ''' <summary>
        ''' ソケットエラーもしくは未接続状態です。値は -1 です。
        ''' </summary>
        Public Const ErrorSocket As Integer = -1
        ''' <summary>
        ''' メモリ確保エラーです。値は -9 です。
        ''' </summary>
        ''' <remarks>
        ''' 内部で文字コードを変換するためのメモリを確保できませんでした。
        ''' </remarks>
        Public Const ErrorMemory As Integer = -9
        ''' <summary>
        ''' その他のエラーです。値は -10 です。
        ''' </summary>
        Public Const ErrorEtc As Integer = -10
        ''' <summary>
        ''' 認可コードがまだ取得されていません。
        ''' </summary>
        Public Const ErrorNoCode As Integer = -40
        ''' <summary>
        ''' 認可コード取得時のエラーです。
        ''' </summary>
        Public Const ErrorGetCode As Integer = -41
        ''' <summary>
        ''' トークンが取得できません。
        ''' </summary>
        Public Const ErrorNoToken As Integer = -42
        ''' <summary>
        ''' ステートが異なります。
        ''' </summary>
        Public Const ErrorDifferentState As Integer = -49
        ''' <summary>
        ''' JSON 文字列にキーに対応する値が存在しません。
        ''' </summary>
        Public Const ErrorNoJsonValue As Integer = -50
        ''' <summary>
        ''' HTTP OK
        ''' </summary>
        Public Const HttpOK As Integer = 200
        ''' <summary>
        ''' リクエスト不正エラーが発生しました。
        ''' </summary>
        Public Const ErrorBadRequest As Integer = -400
        ''' <summary>
        ''' 実行に成功しました。値は 1 です。
        ''' </summary>
        ''' <para>各種メソッドが成功を返した場合、<see cref="nMailException.ErrorCode"/>に設定される値です。</para>
        Public Const Success As Integer = 1
        ''' <summary>
        ''' code_challenge_method=plain とします。
        ''' </summary>
        Public Const CodeChallengePlain As Integer = 1
        ''' <summary>
        ''' クライアントID、クライアントシークレットをヘッダーに記述します。
        ''' </summary>
        Public Const HeaderClientId As Integer = 2
        ''' <summary>
        ''' キー refresh_token の値文字列を返します。
        ''' </summary>
        Public Const RefreshTokenValue As Integer = 16
        ''' <summary>
        ''' キー access_token の値文字列を返します。
        ''' </summary>
        Public Const AccessTokenValue As Integer = 32
        ''' <summary>
        ''' JSON で取得した文字列のエスケープ文字をデコードします。
        ''' </summary>
        Public Const JsonDecodeEscape As Integer = 128
        ''' <summary>
        ''' POST データを x-www-form-urlencoded 形式でエンコードします。
        ''' </summary>
        Public Const PostXWwwFormUrlEncode As Integer = 512
        ''' <summary>
        ''' 付加したヘッダの Authorization: Basic 以降を Base64 エンコードします。
        ''' </summary>
        Public Const Base64AuthorizationBasic As Integer = 1024
        ''' <summary>
        ''' ランダム文字列を英数字のみとします。
        ''' </summary>
        Public Const RandomAlphanumeric As Integer = 1
        ''' <summary>
        ''' HTTP ヘッダーを取得します。
        ''' </summary>
        Public Const MessageHttpHeader As Integer = 2
        ''' <summary>
        ''' GET を実行します。
        ''' </summary>
        Public Const HttpMethodGet As Integer = 4096
        ''' <summary>
        ''' PUT を実行します。
        ''' </summary>
        Public Const HttpMethodPut As Integer = 8192
        ''' <summary>
        ''' DELETE を実行します。
        ''' </summary>
        Public Const HttpMethodDelete As Integer = 16384
        ''' <summary>
        ''' 
        ''' </summary>
        Protected Const MessageSize As Integer = 32768

        Private Const INFINITE As UInt32 = &HFFFFFFFFL

        ''' <summary>
        ''' ソケットハンドルです。
        ''' </summary>
        Protected _socket As IntPtr = IntPtr.op_Explicit(ErrorSocket)
        ''' <summary>
        ''' 認可コード取得用の URI です。
        ''' </summary>
        Protected _auth_uri As String = ""
        ''' <summary>
        ''' トークン取得用の URI です。
        ''' </summary>
        Protected _token_uri As String = ""
        ''' <summary>
        ''' クライアント ID です。
        ''' </summary>
        Protected _client_id As String = ""
        ''' <summary>
        ''' クライアントシークレットです。
        ''' </summary>
        Protected _client_secret As String = ""
        ''' <summary>
        ''' リダイレクト URI です。
        ''' </summary>
        Protected _redirect_uri As String = ""
        ''' <summary>
        ''' スコープです。
        ''' </summary>
        Protected _scope As String = ""
        ''' <summary>
        ''' 認可コード取得成功時のサーバー応答文字列です。
        ''' </summary>
        Protected _response_ok As String = ""
        ''' <summary>
        ''' 認可コード取得エラー時のサーバー応答文字列です。
        ''' </summary>
        Protected _response_error As String = ""
        ''' <summary>
        ''' 認可コード取得時のパラメータです。
        ''' </summary>
        Protected _auth_param As String = ""
        ''' <summary>
        ''' リフレッシュトークン取得時のパラメータです。
        ''' </summary>
        Protected _refresh_token_param As String = ""
        ''' <summary>
        ''' アクセストークン取得時のパラメータです。
        ''' </summary>
        Protected _access_token_param As String = ""
        ''' <summary>
        ''' リフレッシュトークン取得時の追加ヘッダーです。
        ''' </summary>
        Protected _refresh_header As String = ""
        ''' <summary>
        ''' アクセストークン取得時の追加ヘッダーです。
        ''' </summary>
        Protected _access_header As String = ""
        ''' <summary>
        ''' POST/GET/PUT/DELETE 時の追加ヘッダーです。
        ''' </summary>
        Protected _api_header As String = ""
        ''' <summary>
        ''' POST/GET/PUT/DELETE 時のフラグです。
        ''' </summary>
        Protected _api_flag As Integer = 0
        ''' <summary>
        ''' 認可コードです。
        ''' </summary>
        Protected _auth_code As String = ""
        ''' <summary>
        ''' リフレッシュトークンです。
        ''' </summary>
        Protected _refresh_token As String = ""
        ''' <summary>
        ''' アクセストークンです。
        ''' </summary>
        Protected _access_token As String = ""
        ''' <summary>
        ''' 応答文字列です。
        ''' </summary>
        Protected _response_string As String = ""
        ''' <summary>
        ''' 認可時ステート値です。
        ''' </summary>
        Protected _auth_state As String = ""
        ''' <summary>
        ''' 認可時 code_verifier です。
        ''' </summary>
        Protected _code_verifier As String = ""
        ''' <summary>
        ''' ステート取得値です。
        ''' </summary>
        Protected _state As String = ""
        ''' <summary>
        ''' ステート有効フラグです。
        ''' </summary>
        Protected _state_enable As Boolean = False
        ''' <summary>
        ''' ステートデータ長です。
        ''' </summary>
        Protected _state_length As Integer = 16
        ''' <summary>
        ''' PKCE 有効フラグです。
        ''' </summary>
        Protected _pkce_enable As Boolean = False
        ''' <summary>
        ''' code_verifier データ長です。
        ''' </summary>
        Protected _code_verifier_length As Integer = 64
        ''' <summary>
        ''' 認可コード取得用イベントハンドルです。
        ''' </summary>
        Protected _event As IntPtr = IntPtr.Zero
        ''' <summary>
        ''' エラー番号です。
        ''' </summary>
        Protected _err As Integer = 0
        ''' <summary>
        ''' Dispose 処理を行ったかどうかのフラグです。
        ''' </summary>
        Private _disposed As Boolean = False
        ''' <summary>
        ''' 認可コード取得エラー
        ''' </summary>
        Private _auth_code_error As Boolean = False

        ''' <summary>
        ''' IDLE イベントハンドラ
        ''' </summary>
        Public Event AuthorizeEvent As EventHandler

        Private _thread As Thread
        Protected _thread_event_flag As Boolean = False

        ''' <summary>
        ''' <c>OAuth2</c>クラスの新規インスタンスを初期化します。
        ''' </summary>
        Public Sub New()
            Init()
        End Sub
        ''' <summary>
        ''' <c>OAuth2</c>クラスの新規インスタンスを初期化します。
        ''' </summary>
        Public Sub New(ByVal auth_uri As String, ByVal token_uri As String)
            Init()
            _auth_uri = auth_uri
            _token_uri = token_uri
        End Sub

        Protected Overrides Sub Finalize()
            MyBase.Finalize()
            Dispose(False)
        End Sub

        ''' <summary>
        ''' <see cref="OAuth2"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        Overridable Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        ''' <summary>
        ''' <see cref="OAuth2"/>によって使用されているすべてのリソースを解放します。
        ''' </summary>
        ''' <param name="disposing">
        ''' マネージリソースとアンマネージリソースの両方を解放する場合は<c>true</c>。
        ''' アンマネージリソースだけを解放する場合は<c>false</c>。
        ''' </param>
        Protected Overloads Sub Dispose(ByVal disposing As Boolean)
            If Not _disposed Then
                If disposing Then
                End If
                If Not _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                    _thread_event_flag = False
                    EndAuthorize()
                End If
                _disposed = True
            End If
        End Sub

        ''' <summary>
        ''' 初期化処理です。
        ''' </summary>
        Protected Sub Init()
        End Sub

        <DllImport("nMail.DLL", EntryPoint:="NMailOAuth2StartRedirectServer", CharSet:=CharSet.Auto)>
        Protected Shared Function OAuth2StartRedirectServer(ByVal RedirectUri As String, ByVal ResponseOK As String, ByVal ResponseError As String, ByVal Wnd As Integer, ByVal Message As Integer, ByVal Flag As Integer) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailOAuth2RequestAuthorize", CharSet:=CharSet.Auto)>
        Protected Shared Function OAuth2RequestAuthorize(ByVal AuthUri As String, ByVal ClientId As String, ByVal RedirectUri As String, ByVal Scope As String, ByVal State As String, ByVal Verifier As String, ByVal Param As String, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailOAuth2GetAuthorizeCode", CharSet:=CharSet.Auto)>
        Protected Shared Function OAuth2GetAuthorizeCode(ByVal Socket As IntPtr, ByVal Code As StringBuilder, ByVal CodeLength As Integer, ByVal State As StringBuilder, ByVal StateLength As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailOAuth2GetAuthorizeEvent")>
        Protected Shared Function OAuth2GetAuthorizeEvent(ByVal Socket As IntPtr) As IntPtr
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailOAuth2EndRedirectServer")>
        Protected Shared Function OAuth2EndRedirectServer(ByVal Socket As IntPtr) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailOAuth2GetRefreshToken", CharSet:=CharSet.Auto)>
        Protected Shared Function OAuth2GetRefreshToken(ByVal RequestUri As String, ByVal ClientId As String, ByVal ClientSecret As String, ByVal RedirectUri As String, ByVal Code As String, ByVal Verifier As String, ByVal Param As String, ByVal Header As String, ByVal Json As StringBuilder, ByVal Length As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailOAuth2GetAccessToken", CharSet:=CharSet.Auto)>
        Protected Shared Function OAuth2GetAccessToken(ByVal RequestUri As String, ByVal ClientId As String, ByVal ClientSecret As String, ByVal RefreshToken As String, ByVal Param As String, ByVal Header As String, ByVal Json As StringBuilder, ByVal Length As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailJsonGetValue", CharSet:=CharSet.Auto)>
        Protected Shared Function JsonGetValue(ByVal Json As String, ByVal Key As String, ByVal Value As StringBuilder, ByVal Length As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailMakeRandomString", CharSet:=CharSet.Auto)>
        Protected Shared Function MakeRandomString(ByVal Value As StringBuilder, ByVal Length As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailHttpGetPost", CharSet:=CharSet.Auto)>
        Protected Shared Function HttpGetPost(ByVal PostUri As String, ByVal PostData As String, ByVal Header As String, ByVal Json As StringBuilder, ByVal Length As Integer, ByVal Flag As Integer) As Integer
        End Function

        <DllImport("nMail.DLL", EntryPoint:="NMailGetMessage", CharSet:=CharSet.Auto)> _
        Public Shared Sub GetMessage(ByVal Type As Integer, ByVal Message As StringBuilder, ByVal Size As Integer)
        End Sub

        <DllImport("kernel32.dll", SetLastError:=True)>
        Protected Shared Function WaitForSingleObject(ByVal hHandle As IntPtr, ByVal dwMilliseconds As UInt32) As UInt32
        End Function

        Public Overridable Sub OnAuthorizeEvent(ByVal e As EventArgs)
            RaiseEvent AuthorizeEvent(Me, e)
        End Sub

        Private Sub AuthorizeWaitThread()
            WaitForSingleObject(_event, INFINITE)
            If _thread_event_flag Then
                Dim code As StringBuilder
                Dim state As StringBuilder
                Dim err As Integer
                code = New StringBuilder(MaxBuffer)
                state = New StringBuilder(MaxBuffer)
                err = OAuth2GetAuthorizeCode(_socket, code, MaxBuffer, state, MaxBuffer)
                If (err = Success) Or (err = ErrorGetCode) Then
                    _auth_code = code.ToString()
                    _state = state.ToString()
                    _auth_code_error = False
                    If err = ErrorGetCode Then
                        _auth_code_error = True
                    End If
                End If
                OnAuthorizeEvent(EventArgs.Empty)
            End If
        End Sub

        ''' <summary>
        ''' 認可コード取得を開始します。
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        ''' ローカルサーバー処理を開始できません。
        ''' </exception>
        ''' <exception cref="FormatException">
        ''' 必要な設定項目に文字列が入っていません。
        ''' </exception>
        Public Sub StartAuthorize()
            _auth_code_error = False
            If (_auth_uri = "") Or (_client_id = "") Or (_client_secret = "") Or (_redirect_uri = "") Then
                Throw New FormatException
            End If
            _socket = OAuth2StartRedirectServer(_redirect_uri, _response_ok, _response_error, 0, 0, 0)
            If _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                Throw New InvalidOperationException
            End If
            If _state_enable Then
                Dim state As StringBuilder
                If _state_length <= 0 Then
                    Throw New FormatException
                End If
                state = New StringBuilder(_state_length + 1)
                MakeRandomString(state, _state_length, 0)
                _auth_state = state.ToString()
            Else
                _auth_state = ""
            End If
            If _pkce_enable Then
                If (_code_verifier_length < 43) Or (_code_verifier_length > 128) Then
                    Throw New FormatException
                End If
                Dim code As StringBuilder
                code = New StringBuilder(_code_verifier_length + 1)
                MakeRandomString(code, _code_verifier_length, 0)
                _code_verifier = code.ToString()
            Else
                _code_verifier = ""
            End If
            OAuth2RequestAuthorize(_auth_uri, _client_id, _redirect_uri, _scope, _auth_state, _code_verifier, _auth_param, 0)
            _event = OAuth2GetAuthorizeEvent(_socket)
            If Not _event.Equals(IntPtr.Zero) Then
                Dim thread_flag As Boolean = False
                If _thread Is Nothing Then
                    thread_flag = True
                ElseIf Not _thread.IsAlive Then
                    thread_flag = True
                End If
                If thread_flag Then
                    _thread_event_flag = True
                    _thread = New Thread(New ThreadStart(AddressOf AuthorizeWaitThread))
                    _thread.Start()
                End If
            End If
        End Sub
        ''' <summary>
        ''' 認可コード取得を終了します。
        ''' </summary>
        Public Sub EndAuthorize()
            If Not _socket.Equals(IntPtr.op_Explicit(ErrorSocket)) Then
                OAuth2EndRedirectServer(_socket)
            End If
            _socket = IntPtr.op_Explicit(ErrorSocket)
        End Sub

        ''' <summary>
        ''' リフレッシュトークンを取得します。
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        ''' サーバーからエラーが返りました。
        ''' </exception>
        ''' <exception cref="FormatException">
        ''' 必要な設定項目に文字列が入っていません。
        ''' </exception>
        ''' <exception cref="nMailException">
        ''' ステートが異なるか、リフレッシュトークンが取得できません。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>リフレッシュトークン</returns>
        Public Function GetRefreshToken() As String
            If _auth_code_error Then
                Throw New nMailException(_auth_code + " " + _state, ErrorGetCode)
            End If
            If (_token_uri = "") Or (_auth_code = "") Or (_client_id = "") Or (_client_secret = "") Or (_redirect_uri = "") Then
                Throw New FormatException
            End If
            If (_auth_state <> "") And (_auth_state <> _state) Then
                Throw New nMailException("Different state", ErrorDifferentState)
            End If
            Dim json As StringBuilder
            json = New StringBuilder(MaxBuffer)
            _err = OAuth2GetRefreshToken(_token_uri, _client_id, _client_secret, _redirect_uri, _auth_code, _code_verifier, _refresh_token_param, _refresh_header, json, MaxBuffer, 0)
            If _err = Success Then
                Dim token As StringBuilder
                token = New StringBuilder(MaxBuffer)
                _err = JsonGetValue(json.ToString(), "refresh_token", token, MaxBuffer, 0)
                If _err <> Success Then
                    Throw New nMailException("No RefreshToken", ErrorNoToken)
                End If
                _refresh_token = token.ToString()
                _err = JsonGetValue(json.ToString(), "access_token", token, MaxBuffer, 0)
                If _err = Success Then
                    _access_token = token.ToString()
                End If
            Else
                Throw New InvalidOperationException()
            End If
            Return _refresh_token
        End Function

        ''' <summary>
        ''' アクセストークンを取得します。
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <exception cref="InvalidOperationException">
        ''' サーバーからエラーが返りました。
        ''' </exception>
        ''' <exception cref="FormatException">
        ''' 必要な設定項目に文字列が入っていません。
        ''' </exception>
        ''' <exception cref="nMailException">
        ''' アクセストークンが取得できません。
        ''' <see cref="nMailException.Message"/>にエラーメッセージ、
        ''' <see cref="nMailException.ErrorCode"/>にエラーコードが入ります。
        ''' </exception>
        ''' <returns>アクセストークン</returns>
        Public Function GetAccessToken() As String
            If (_token_uri = "") Or (_client_id = "") Or (_client_secret = "") Or (_refresh_token = "") Then
                Throw New FormatException()
            End If
            Dim json As StringBuilder
            json = New StringBuilder(MaxBuffer)
            _err = OAuth2GetAccessToken(_token_uri, _client_id, _client_secret, _refresh_token, _access_token_param, _access_header, json, MaxBuffer, 0)
            If _err = Success Then
                Dim token As StringBuilder
                token = New StringBuilder(MaxBuffer)
                _err = JsonGetValue(json.ToString(), "access_token", token, MaxBuffer, 0)
                If _err <> Success Then
                    Throw New nMailException("No AccessToken", ErrorNoToken)
                End If
                _access_token = token.ToString()
            Else
                Throw New InvalidOperationException()
            End If
            Return _access_token
        End Function

        ''' <summary>
        ''' アクセストークンを取得します。
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <param name="refresh_token">リフレッシュトークン</param>
        ''' <exception cref="InvalidOperationException">
        ''' サーバーからエラーが返りました。
        ''' </exception>
        ''' <exception cref="FormatException">
        ''' 必要な設定項目に文字列が入っていません。
        ''' </exception>
        ''' <returns>アクセストークン</returns>
        Public Function GetAccessToken(ByVal refresh_token As String) As String
            _refresh_token = refresh_token
            Return GetAccessToken()
        End Function

        ''' <summary>
        ''' HTTP POST を実行します。
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <param name="uri">URI</param>
        ''' <param name="post_data">POST するデータ</param>
        ''' <exception cref="InvalidOperationException">
        ''' サーバーからエラーが返りました。
        ''' </exception>
        ''' <exception cref="FormatException">
        ''' 必要な設定項目に文字列が入っていません。
        ''' </exception>
        ''' <returns>応答文字列</returns>
        Public Function HttpPost(ByVal uri As String, ByVal post_data As String) As String
            If uri = "" Then
                Throw New FormatException()
            End If
            _response_string = ""
            Dim json As StringBuilder
            json = New StringBuilder(MaxBuffer)
            _err = HttpGetPost(uri, post_data, _api_header, json, MaxBuffer, _api_flag)
            If _err >= HttpOK Then
                _response_string = json.ToString()
            Else
                Throw New InvalidOperationException()
            End If
            Return _response_string
        End Function

        ''' <summary>
        ''' HTTP GET を実行します。
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <param name="uri">URI</param>
        ''' <param name="get_param">URI に付加するパラメータ</param>
        ''' <exception cref="InvalidOperationException">
        ''' サーバーからエラーが返りました。
        ''' </exception>
        ''' <exception cref="FormatException">
        ''' 必要な設定項目に文字列が入っていません。
        ''' </exception>
        ''' <returns>応答文字列</returns>
        Public Function HttpDelete(ByVal uri As String, ByVal get_param As String) As String
            If uri = "" Then
                Throw New FormatException()
            End If
            _response_string = ""
            Dim json As StringBuilder
            json = New StringBuilder(MaxBuffer)
            _err = HttpGetPost(uri, get_param, _api_header, json, MaxBuffer, _api_flag Or HttpMethodGet)
            If _err >= HttpOK Then
                _response_string = json.ToString()
            Else
                Throw New InvalidOperationException()
            End If
            Return _response_string
        End Function

        ''' <summary>
        ''' HTTP PUT を実行します。
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <param name="uri">URI</param>
        ''' <param name="put_data">PUT するデータ</param>
        ''' <exception cref="InvalidOperationException">
        ''' サーバーからエラーが返りました。
        ''' </exception>
        ''' <exception cref="FormatException">
        ''' 必要な設定項目に文字列が入っていません。
        ''' </exception>
        ''' <returns>応答文字列</returns>
        Public Function HttpPut(ByVal uri As String, ByVal put_data As String) As String
            If uri = "" Then
                Throw New FormatException()
            End If
            _response_string = ""
            Dim json As StringBuilder
            json = New StringBuilder(MaxBuffer)
            _err = HttpGetPost(uri, put_data, _api_header, json, MaxBuffer, _api_flag Or HttpMethodPut)
            If _err >= HttpOK Then
                _response_string = json.ToString()
            Else
                Throw New InvalidOperationException()
            End If
            Return _response_string
	End Function

        ''' <summary>
        ''' HTTP DELETE を実行します。
        ''' </summary>
        ''' <remarks>
        ''' </remarks>
        ''' <param name="uri">URI</param>
        ''' <param name="delete_param">URI に付加するパラメータ</param>
        ''' <exception cref="InvalidOperationException">
        ''' サーバーからエラーが返りました。
        ''' </exception>
        ''' <exception cref="FormatException">
        ''' 必要な設定項目に文字列が入っていません。
        ''' </exception>
        ''' <returns>応答文字列</returns>
        Public Function HttpGet(ByVal uri As String, ByVal delete_param As String) As String
            If uri = "" Then
                Throw New FormatException()
            End If
            _response_string = ""
            Dim json As StringBuilder
            json = New StringBuilder(MaxBuffer)
            _err = HttpGetPost(uri, delete_param, _api_header, json, MaxBuffer, _api_flag Or HttpMethodDelete)
            If _err >= HttpOK Then
                _response_string = json.ToString()
            Else
                Throw New InvalidOperationException()
            End If
            Return _response_string
        End Function

        ''' <summary>
        ''' 認可コード取得用 URI です。
        ''' </summary>
        Public Property AuthUri() As String
            Get
                Return _auth_uri
            End Get
            Set(ByVal value As String)
                _auth_uri = value
            End Set
        End Property
        ''' <summary>
        ''' トークン取得用 URI です。
        ''' </summary>
        Public Property TokenUri() As String
            Get
                Return _token_uri
            End Get
            Set(ByVal value As String)
                _token_uri = value
            End Set
        End Property
        ''' <summary>
        ''' クライアント ID です。
        ''' </summary>
        Public Property ClientId() As String
            Get
                Return _client_id
            End Get
            Set(ByVal value As String)
                _client_id = value
            End Set
        End Property
        ''' <summary>
        ''' クライアントシークレットです。
        ''' </summary>
        Public Property ClientSecret() As String
            Get
                Return _client_secret
            End Get
            Set(ByVal value As String)
                _client_secret = value
            End Set
        End Property
        ''' <summary>
        ''' リダイレクト URI(コールバック URI)です。
        ''' </summary>
        Public Property RedirectUri() As String
            Get
                Return _redirect_uri
            End Get
            Set(ByVal value As String)
                _redirect_uri = value
            End Set
        End Property
        ''' <summary>
        ''' スコープ(アクセス権の範囲)です。
        ''' </summary>
        Public Property Scope() As String
            Get
                Return _scope
            End Get
            Set(ByVal value As String)
                _scope = value
            End Set
        End Property
        ''' <summary>
        ''' 認可コード取得成功時のサーバー応答文字列です。
        ''' </summary>
        Public Property ResponseOk() As String
            Get
                Return _response_ok
            End Get
            Set(ByVal value As String)
                _response_ok = value
            End Set
        End Property
        ''' <summary>
        ''' 認可コード取得エラー時のサーバー応答文字列です。
        ''' </summary>
        Public Property ResponseError() As String
            Get
                Return _response_error
            End Get
            Set(ByVal value As String)
                _response_error = value
            End Set
        End Property
        ''' <summary>
        ''' 認可コード取得時のパラメータです。
        ''' </summary>
        Public Property AuthParameter() As String
            Get
                Return _auth_param
            End Get
            Set(ByVal value As String)
                _auth_param = value
            End Set
        End Property
        ''' <summary>
        ''' リフレッシュトークン取得時のパラメータです。
        ''' </summary>
        Public Property RefreshTokenParameter() As String
            Get
                Return _refresh_token_param
            End Get
            Set(ByVal value As String)
                _refresh_token_param = value
            End Set
        End Property
        ''' <summary>
        ''' アクセストークン取得時のパラメータです。
        ''' </summary>
        Public Property AccessTokenParameter() As String
            Get
                Return _access_token_param
            End Get
            Set(ByVal value As String)
                _access_token_param = value
            End Set
        End Property
        ''' <summary>
        ''' リフレッシュトークン取得時の追加ヘッダーです。
        ''' </summary>
        Public Property RefreshTokenHeader() As String
            Get
                Return _refresh_header
            End Get
            Set(ByVal value As String)
                _refresh_header = value
            End Set
        End Property
        ''' <summary>
        ''' アクセストークン取得時の追加ヘッダーです。
        ''' </summary>
        Public Property AccessTokenHeader() As String
            Get
                Return _access_header
            End Get
            Set(ByVal value As String)
                _access_header = value
            End Set
        End Property
        ''' <summary>
        ''' POST/GET/PUT/DELETE 時の追加ヘッダーです。
        ''' </summary>
        Public Property ApiHeader() As String
            Get
                Return _api_header
            End Get
            Set(ByVal value As String)
                _api_header = value
            End Set
        End Property
        ''' <summary>
        ''' POST/GET/PUT/DELETE 時のフラグです。
        ''' </summary>
        Public Property ApiFlag() As Integer
            Get
                Return _api_flag
            End Get
            Set(ByVal value As Integer)
                _api_flag = value
            End Set
        End Property
        ''' <summary>
        ''' ステート有効フラグです。
        ''' </summary>
        Public Property StateEnable() As Boolean
            Get
                Return _state_enable
            End Get
            Set(ByVal value As Boolean)
                _state_enable = value
            End Set
        End Property
        ''' <summary>
        ''' ステート文字列長です。
        ''' </summary>
        Public Property StateLength() As Integer
            Get
                Return _state_length
            End Get
            Set(ByVal value As Integer)
                _state_length = value
            End Set
        End Property
        ''' <summary>
        ''' PKCE 有効フラグです。
        ''' </summary>
        Public Property PkceEnable() As Boolean
            Get
                Return _pkce_enable
            End Get
            Set(ByVal value As Boolean)
                _pkce_enable = value
            End Set
        End Property
        ''' <summary>
        ''' PKCE code_verifier 文字列長です。
        ''' </summary>
        Public Property CodeVerifierLength() As Integer
            Get
                Return _code_verifier_length
            End Get
            Set(ByVal value As Integer)
                _code_verifier_length = value
            End Set
        End Property
        ''' <summary>
        ''' リフレッシュトークンです。
        ''' </summary>
        Public Property RefreshToken() As String
            Get
                Return _refresh_token
            End Get
            Set(ByVal value As String)
                _refresh_token = Value
            End Set
        End Property
        ''' <summary>
        ''' アクセストークンです。
        ''' </summary>
        Public Property AccessToken() As String
            Get
                Return _access_token
            End Get
            Set(ByVal value As String)
                _access_token = Value
            End Set
        End Property
        ''' <summary>
        ''' 応答文字列です。
        ''' </summary>
        Public Property Response() As String
            Get
                Return _response_string
            End Get
            Set(ByVal value As String)
                _response_string = Value
            End Set
        End Property
        ''' <summary>
        ''' HTTP 応答ヘッダーです。
        ''' </summary>
        Public Shared ReadOnly Property ResponseHeader() As String
            Get
                Dim message As StringBuilder
                message = New StringBuilder(MessageSize)
                GetMessage(MessageHttpHeader, message, MessageSize)
                Return message.ToString()
            End Get
        End Property
        ''' <summary>
        ''' エラー番号です。
        ''' </summary>
        ''' <value>エラー番号</value>
        Public ReadOnly Property ErrorCode() As Integer
            Get
                Return _err
            End Get
        End Property
    End Class
End Namespace

