works/libs/Smdn.Net.Imap4/doc/index.wiki.txt

current previous
279,7 279,6
 
接続・認証時の動作は、[[接続と認証>#login]]で解説したとおりIMAP URLに記述されるスキーム・ホスト名・ポート・認証方式・ユーザ名に基づいて決まります。 ImapClientクラスではIMAP URLは用いず、ホスト・ポート・認証方式・ユーザ名等を個々に指定することもできます。
接続・認証時の動作は、[[接続と認証>#login]]で解説したとおりIMAP URLに記述されるスキーム・ホスト名・ポート・認証方式・ユーザ名に基づいて決まります。 ImapClientクラスではIMAP URLは用いず、ホスト・ポート・認証方式・ユーザ名等を個々に指定することもできます。
 

        

        
 
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#ImapClient.certs]]が必要になります。
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#ImapClient.certs]]が必要になります。
+
#tabpage(C#)
 
#code(cs,ImapClient){{
#code(cs,ImapClient){{
 
/*
/*
 
 * ホスト"imap.example.net"のIMAPSデフォルトポート(993)にSSL/TLSを用いて接続。
 * ホスト"imap.example.net"のIMAPSデフォルトポート(993)にSSL/TLSを用いて接続。
337,65 336,6
 

        

        
 
client6.Connect("pass");
client6.Connect("pass");
 
}}
}}
+
#tabpage(VB)
+
#code(vb,ImapClient){{
+
'
+
' ホスト"imap.example.net"のIMAPSデフォルトポート(993)にSSL/TLSを用いて接続。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式は対応しているものを順に試行。
+
'
+
Dim client1 As New ImapClient(New Uri("imaps://user@imap.example.net/"))
+

         
+
client1.Connect("pass")
+

         
+
'
+
' ホスト"imap.example.net"のポート10143に接続、可能ならSSL/TLSにアップグレード。
+
' ユーザ名に"user"を使用、パスワードはNetworkCredentialから取得。 認証方式はCRAM-MD5を試行。
+
'
+
Dim client2 As New ImapClient(New Uri("imap://user;AUTH=CRAM-MD5@imap.example.net:10143/"))
+

         
+
client2.Profile.UseTlsIfAvailable = True
+
client2.Connect(New NetworkCredential("user", "pass"))
+

         
+
'
+
' ホスト"imap.example.net"のポート10143にSSL/TLSを用いて接続。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5を試行。
+
'
+
Dim client3 As New ImapClient("imap.example.net", 10143, True, "user", "DIGEST-MD5")
+

         
+
client3.Connect("pass")
+

         
+
'
+
' ホスト"imap.example.net"のIMAPデフォルトポート(143)に接続、SSL/TLSは使用しない。
+
' ユーザ名に"user"を使用、パスワードはNetworkCredentialから取得。 認証方式はDIGEST-MD5, CRAM-MD5, IMAP LOGINの順に試行。
+
'
+
Dim client4 As New ImapClient("imap.example.net", -1, False, Nothing, "*")
+

         
+
client4.Profile.UseTlsIfAvailable = False
+
client4.Profile.UsingSaslMechanisms = New String() {"DIGEST-MD5", "CRAM-MD5"}
+

         
+
client4.Connect(New NetworkCredential("user", "pass"))
+

         
+
'
+
' ホスト"imap.example.net"のIMAPデフォルトポート(143)に接続、可能ならSSL/TLSを使用する。
+
' ユーザ名に"user"を使用、パスワードはNetworkCredentialから取得。
+
' 認証方式はCRAM-MD5, PLAIN, IMAP LOGINの順に試行。 ただしSSL/TLSが使用できない場合、平文による認証を許可しない。
+
'
+
Dim client5 As New ImapClient(New Uri("imap://user@imap.example.net/"))
+

         
+
client5.Profile.UseTlsIfAvailable = True
+
client5.Profile.UsingSaslMechanisms = New String() {"CRAM-MD5", "PLAIN"}
+
client5.Profile.AllowInsecureLogin = False
+

         
+
client5.Connect(New NetworkCredential("user", "pass"))
+

         
+
'
+
' GMailのアカウント"user"にIMAPで接続。 パスワードは"pass"を使用。
+
'
+
Dim client6 As New ImapClient(New Uri("imaps://user@imap.gmail.com/"))
+

         
+
client6.Connect("pass")
+
}}
+
#tabpage-end
 

        

        
 
***&aname(ImapClient.certs){証明書の選択と検証};
***&aname(ImapClient.certs){証明書の選択と検証};
 
デフォルトでは、接続・認証時にImapConnectionクラス(Smdn.Net.Imap4.Protocol.Client名前空間)の以下のメンバを参照して証明書の選択と検証を行います。
デフォルトでは、接続・認証時にImapConnectionクラス(Smdn.Net.Imap4.Protocol.Client名前空間)の以下のメンバを参照して証明書の選択と検証を行います。
408,7 348,6
 

        

        
 
以下は証明書の検証を行う簡単な例です。
以下は証明書の検証を行う簡単な例です。
 

        

        
+
#tabpage(C#)
 
#code(cs,証明書の検証を行う例){{
#code(cs,証明書の検証を行う例){{
 
using System;
using System;
 
using System.Net;
using System.Net;
451,48 390,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb,証明書の検証を行う例){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.Client
+
Imports Smdn.Net.Imap4.Protocol.Client
+

         
+
Public Class ValidateServerCerts
+
  Public Shared Sub Main(ByVal args As String())
+
    ' 証明書の検証を行うコールバックメソッドを指定
+
    ImapConnection.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    Using client As New ImapClient(New Uri("imaps://user@localhost/"))
+
      client.Connect("pass")
+
    End Using
+
  End Sub
+

         
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
#If DEBUG Then
+
    ' デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
+
    If CInt(sslPolicyErrors & sslPolicyErrors.RemoteCertificateNameMismatch) <> 0 Then
+
      sslPolicyErrors = sslPolicyErrors And Not sslPolicyErrors.RemoteCertificateNameMismatch
+
    End If
+
#End If
+

         
+
    If sslPolicyErrors = sslPolicyErrors.None Then
+
      Return True
+
    Else
+
      ' エラーがあれば標準エラーに表示
+
      Console.Error.WriteLine(sslPolicyErrors)
+
      Return False
+
    End If
+
  End Function
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapClient.Connect()メソッドの引数に適切なコールバックメソッドを指定してください。
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapClient.Connect()メソッドの引数に適切なコールバックメソッドを指定してください。
 
(このドキュメントは作成中です)
(このドキュメントは作成中です)
879,7 776,6
 

        

        
 
このメソッドはWebRequest.RegisterPrefixメソッドを呼び出し、imapスキームおよびimapsスキームに対してImapWebRequestCreatorを関連付けます。
このメソッドはWebRequest.RegisterPrefixメソッドを呼び出し、imapスキームおよびimapsスキームに対してImapWebRequestCreatorを関連付けます。
 

        

        
+
#tabpage(C#)
 
#code(cs,記述例){{
#code(cs,記述例){{
 
using System;
using System;
 
using System.Net;
using System.Net;
896,24 792,6
 
  :
  :
 
  :
  :
 
}}
}}
+
#tabpage(VB)
+
#code(vb,記述例){{
+
Imports System
+
Imports System.Net
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.WebClients
+

         
+
  :
+
  :
+
' imapおよびimapsスキームの登録
+
ImapWebRequestCreator.RegisterPrefix()
+

         
+
' ImapWebRequestインスタンスの作成
+
Dim request As WebRequest = WebRequest.Create("imap://user@imap.example.net/")
+
  :
+
  :
+
}}
+
#tabpage-end
 

        

        
 
**リクエストURLと接続・認証時の動作
**リクエストURLと接続・認証時の動作
 
***&aname(ImapWebRequest.login){接続と認証};
***&aname(ImapWebRequest.login){接続と認証};
929,7 807,6
 

        

        
 
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#ImapWebRequest.certs]]が必要になります。
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#ImapWebRequest.certs]]が必要になります。
 

        

        
+
#tabpage(C#)
 
#code(cs,記述例){{
#code(cs,記述例){{
 
// imapおよびimapsスキームの登録
// imapおよびimapsスキームの登録
 
ImapWebRequestCreator.RegisterPrefix();
ImapWebRequestCreator.RegisterPrefix();
988,66 865,6
 

        

        
 
request6.Credentials = new NetworkCredential("user", "pass");
request6.Credentials = new NetworkCredential("user", "pass");
 
}}
}}
+
#tabpage(VB)
+
#code(vb,記述例){{
+
' imapおよびimapsスキームの登録
+
ImapWebRequestCreator.RegisterPrefix()
+

         
+
'
+
' ホスト"imap.example.net"のIMAPSデフォルトポート(993)にSSL/TLSを用いて接続。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式は対応しているものを順に試行。
+
'
+
Dim request1 As WebRequest = WebRequest.Create(New Uri("imaps://user@imap.example.net/"))
+

         
+
request1.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' ホスト"imap.example.net"のポート10143に接続、可能ならSSL/TLSにアップグレード。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はCRAM-MD5を試行。
+
'
+
Dim request2 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imap://user;AUTH=CRAM-MD5@imap.example.net:10143/")), ImapWebRequest)
+

         
+
request2.UseTlsIfAvailable = True
+
request2.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' ホスト"imap.example.net"のポート10143にSSL/TLSを用いて接続。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5を試行。
+
'
+
Dim request3 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imaps://user;AUTH=DIGEST-MD5@imap.example.net:10143/")), ImapWebRequest)
+

         
+
request3.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' ホスト"imap.example.net"のIMAPデフォルトポート(143)に接続、SSL/TLSは使用しない。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5, CRAM-MD5, PLAINの順に試行。
+
'
+
Dim request4 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imap://;AUTH=*@imap.example.net/")), ImapWebRequest)
+

         
+
request4.UseTlsIfAvailable = False
+
request4.UsingSaslMechanisms = New String() {"DIGEST-MD5", "CRAM-MD5", "PLAIN"}
+
request4.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' ホスト"imap.example.net"のIMAPデフォルトポート(143)に接続、可能ならSSL/TLSを使用する。
+
' ユーザ名に"user"、パスワードに"pass"を使用。
+
' 認証方式はCRAM-MD5, PLAIN, IMAP LOGINの順に試行。 ただしSSL/TLSが使用できない場合、平文による認証を許可しない。
+
'
+
Dim request5 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imap://user@imap.example.net/")), ImapWebRequest)
+

         
+
request5.UseTlsIfAvailable = True
+
request5.UsingSaslMechanisms = New String() {"CRAM-MD5", "PLAIN"}
+
request5.AllowInsecureLogin = False
+
request5.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' GMailのアカウント"user"にIMAPで接続。 パスワードは"pass"を使用。
+
'
+
Dim request6 As ImapWebRequest = DirectCast(WebRequest.Create(New Uri("imaps://user@imap.gmail.com/")), ImapWebRequest)
+

         
+
request6.Credentials = New NetworkCredential("user", "pass")
+
}}
+
#tabpage-end
 

        

        
 
***&aname(ImapWebRequest.certs){証明書の選択と検証};
***&aname(ImapWebRequest.certs){証明書の選択と検証};
 
デフォルトでは、接続・認証時にImapSessionManagerクラスの以下のメンバを参照して証明書の選択と検証を行います。
デフォルトでは、接続・認証時にImapSessionManagerクラスの以下のメンバを参照して証明書の選択と検証を行います。
1060,7 877,6
 

        

        
 
以下は証明書の検証を行う簡単な例です。
以下は証明書の検証を行う簡単な例です。
 

        

        
+
#tabpage(C#)
 
#code(cs,証明書の検証を行う例){{
#code(cs,証明書の検証を行う例){{
 
using System;
using System;
 
using System.Net;
using System.Net;
1105,50 921,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb,証明書の検証を行う例){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.WebClients
+

         
+
Public Class ValidateServerCerts
+
  Public Shared Sub main(ByVal args As String())
+
    ImapWebRequestCreator.RegisterPrefix()
+

         
+
    ' 証明書の検証を行うコールバックメソッドを指定
+
    ImapSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    Using client As New WebClient()
+
      client.Credentials = New NetworkCredential("user", "pass")
+
      client.DownloadFile("imaps://user@localhost/INBOX/;UID=1", "sample.eml")
+
    End Using
+
  End Sub
+

         
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
#If DEBUG Then
+
    ' デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
+
    If CInt(sslPolicyErrors & sslPolicyErrors.RemoteCertificateNameMismatch) <> 0 Then
+
      sslPolicyErrors = sslPolicyErrors And Not sslPolicyErrors.RemoteCertificateNameMismatch
+
    End If
+
#End If
+

         
+
    If sslPolicyErrors = sslPolicyErrors.None Then
+
      Return True
+
    Else
+
      ' エラーがあれば標準エラーに表示
+
      Console.Error.WriteLine(sslPolicyErrors)
+
      Return False
+
    End If
+
  End Function
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapSessionManager.CreateSslStreamCallbackに適切なコールバックメソッドを指定してください。
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、ImapSessionManager.CreateSslStreamCallbackに適切なコールバックメソッドを指定してください。
 

        

        
1340,7 1112,6
 

        

        
 
**ImapClient
**ImapClient
 
***&aname(ImapClient.sample1){メッセージをダウンロードしてファイルに保存する};
***&aname(ImapClient.sample1){メッセージをダウンロードしてファイルに保存する};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 

        

        
1365,36 1136,10
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

         
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.Client
+

         
+
Class Sample
+
  Public Shared Sub Main(ByVal args As String())
+
    Using client As New ImapClient(New Uri("imap://user;AUTH=DIGEST-MD5@localhost/"))
+
      client.Connect("pass")
+

         
+
      ' INBOXを開く
+
      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
+
        ' UIDが1のメッセージを取得
+
        Dim message As ImapMessageInfo = inbox.GetMessageByUid(1)
+

         
+
        ' ファイルsample.emlに保存
+
        message.Save("sample.eml")
+
      End Using
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample1]]
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample1]]
 

        

        
 
***&aname(ImapClient.sample2){メッセージをアップロードする};
***&aname(ImapClient.sample2){メッセージをアップロードする};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.IO;
using System.IO;
1420,37 1165,10
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+

         
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.Client
+

         
+
Class Sample
+
  Public Shared Sub Main(ByVal args As String())
+
    Using client As New ImapClient("localhost", 143, "user", "DIGEST-MD5")
+
      client.Connect("pass")
+

         
+
      ' INBOXを取得
+
      Dim inbox As ImapMailboxInfo = client.GetInbox()
+

         
+
      ' ファイルsample.emlを開く
+
      Using messageStream As Stream = File.OpenRead("sample.eml")
+
        ' Streamの内容をINBOXにアップロード
+
        inbox.AppendMessage(messageStream)
+
      End Using
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample2]]
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample2]]
 

        

        
 
***&aname(ImapClient.sample3){メッセージの検索};
***&aname(ImapClient.sample3){メッセージの検索};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 

        

        
1482,52 1200,11
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+

         
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.Client
+
Imports Smdn.Net.Imap4.Protocol.Client
+

         
+
Class Sample
+
  Public Shared Sub Main(ByVal args As String())
+
    ImapConnection.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    ' Gmailのアカウントに接続
+
    Using client As New ImapClient(New Uri("imaps://user@imap.gmail.com/"))
+
      client.Connect("pass")
+

         
+
      ' INBOXを開く
+
      Using inbox As ImapOpenedMailboxInfo = client.OpenInbox()
+
        ' タイトルに[Mono-dev]を含むメールの一覧を取得する
+
        For Each message As ImapMessageInfo In inbox.GetMessages(ImapSearchCriteria.Subject("[Mono-dev]"))
+
          ' 取得したメッセージのUIDと件名を表示
+
          Console.WriteLine("UID {0}: {1}", message.Uid, message.EnvelopeSubject)
+
        Next
+
      End Using
+
    End Using
+
  End Sub
+

         
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
    ' 証明書の検証は省略 (エラーを無視してすべて受け入れる)
+
    Return True
+
  End Function
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample3]]
同じ処理を[[ImapWebRequestで記述した例>#ImapWebRequest.sample3]]
 

        

        
 
**ImapWebRequest/ImapWebResponse
**ImapWebRequest/ImapWebResponse
 
***&aname(ImapWebRequest.sample1){メッセージをダウンロードしてファイルに保存する};
***&aname(ImapWebRequest.sample1){メッセージをダウンロードしてファイルに保存する};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
1548,32 1225,10
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+

         
+
Imports Smdn.Net.Imap4.WebClients
+

         
+
Class Sample
+
  Public Shared Sub Main(ByVal args As String())
+
    ImapWebRequestCreator.RegisterPrefix()
+

         
+
    Using client As New WebClient()
+
      client.Credentials = New NetworkCredential("user", "pass")
+

         
+
      ' INBOXにあるUIDが1のメッセージをダウンロードしてファイルsample.emlに保存
+
      client.DownloadFile("imap://user;AUTH=DIGEST-MD5@localhost/INBOX/;UID=1", "sample.eml")
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[ImapClientで記述した例>#ImapClient.sample1]]
同じ処理を[[ImapClientで記述した例>#ImapClient.sample1]]
 

        

        
 
***&aname(ImapWebRequest.sample2){メッセージをアップロードする};
***&aname(ImapWebRequest.sample2){メッセージをアップロードする};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.IO;
using System.IO;
1595,33 1250,10
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+
Imports System.Net
+

         
+
Imports Smdn.Net.Imap4.WebClients
+

         
+
Class Sample
+
  Public Shared Sub Main(ByVal args As String())
+
    ImapWebRequestCreator.RegisterPrefix()
+

         
+
    Using client As New WebClient()
+
      client.Credentials = New NetworkCredential("user", "pass")
+

         
+
      ' ファイルsample.emlの内容をINBOXにアップロード
+
      client.UploadData("imap://user;AUTH=DIGEST-MD5@localhost/INBOX", ImapWebRequestMethods.Append, File.ReadAllBytes("sample.eml"))
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[ImapClientで記述した例>#ImapClient.sample2]]
同じ処理を[[ImapClientで記述した例>#ImapClient.sample2]]
 

        

        
 
***&aname(ImapWebRequest.sample3){メッセージの検索};
***&aname(ImapWebRequest.sample3){メッセージの検索};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
1651,50 1283,11
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+

         
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.WebClients
+

         
+
Class Sample
+
  Public Shared Sub Main(ByVal args As String())
+
    ImapWebRequestCreator.RegisterPrefix()
+
    ImapSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    ' GmailアカウントのINBOXから、件名に[Mono-dev]を含むメールの一覧を取得する
+
    Dim request As WebRequest = WebRequest.Create("imaps://user@imap.gmail.com/INBOX?SUBJECT ""[Mono-dev]""")
+

         
+
    request.Credentials = New NetworkCredential("user", "pass")
+

         
+
    Using response As ImapWebResponse = DirectCast(request.GetResponse(), ImapWebResponse)
+
      For Each message As IImapMessageAttribute In response.MessageAttributes
+
        ' 取得したメッセージのURLを表示
+
        Console.WriteLine(message.Url)
+
      Next
+
    End Using
+
  End Sub
+

         
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
    ' 証明書の検証は省略 (エラーを無視してすべて受け入れる)
+
    Return True
+
  End Function
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[ImapClientで記述した例>#ImapClient.sample3]]
同じ処理を[[ImapClientで記述した例>#ImapClient.sample3]]
 

        

        
 
***&aname(ImapWebRequest.sample4){メッセージのコピー};
***&aname(ImapWebRequest.sample4){メッセージのコピー};
 
INBOXにあるメッセージすべてをINBOX.backupにコピーする例。 AllowCreateMailboxプロパティをtrueにしておくことで、サーバがレスポンスコードTRYCREATEを返した場合は自動的にメールボックスを作成します。
INBOXにあるメッセージすべてをINBOX.backupにコピーする例。 AllowCreateMailboxプロパティをtrueにしておくことで、サーバがレスポンスコードTRYCREATEを返した場合は自動的にメールボックスを作成します。
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
1714,32 1307,10
 
  :
  :
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.WebClients
+
  :
+

         
+
Dim request As ImapWebRequest = DirectCast(WebRequest.Create("imap://user@localhost/INBOX?ALL"), ImapWebRequest)
+

         
+
request.Credentials = New NetworkCredential("user", "pass")
+
request.Method = ImapWebRequestMethods.Copy
+
request.AllowCreateMailbox = True
+
request.DestinationUri = New Uri("imap://user@localhost/INBOX.backup")
+

         
+
Using response As WebResponse = request.GetResponse()
+
  :
+
  :
+
End Using
+
}}
+
#tabpage-end
 

        

        
 
***&aname(ImapWebRequest.sample5){メールボックスの削除};
***&aname(ImapWebRequest.sample5){メールボックスの削除};
 
メールボックスINBOX.oldを削除する例。 ExpectedErrorResponseCodesプロパティにImapResponseCode.NonExistentを指定しておくことで、メールボックスが存在しない場合(サーバがレスポンスコードNONEXISTENTを返した場合)でもWebExceptionをスローしないようにします。
メールボックスINBOX.oldを削除する例。 ExpectedErrorResponseCodesプロパティにImapResponseCode.NonExistentを指定しておくことで、メールボックスが存在しない場合(サーバがレスポンスコードNONEXISTENTを返した場合)でもWebExceptionをスローしないようにします。
 

        

        
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
1759,32 1330,10
 
  :
  :
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.Protocol
+
Imports Smdn.Net.Imap4.WebClients
+
  :
+

         
+
Dim request As ImapWebRequest = DirectCast(WebRequest.Create("imap://user@localhost/INBOX.old"), ImapWebRequest)
+

         
+
request.Credentials = New NetworkCredential("user", "pass")
+
request.Method = ImapWebRequestMethods.Delete
+
request.ExpectedErrorResponseCodes = New ImapResponseCode() {ImapResponseCode.NonExistent}
+

         
+
Using response As WebResponse = request.GetResponse()
+
  :
+
  :
+
End Using
+
}}
+
#tabpage-end
 

        

        
 
***&aname(ImapWebRequest.sample6){メールボックスの作成};
***&aname(ImapWebRequest.sample6){メールボックスの作成};
 
メールボックスINBOX.newを作成する例。 先の例と同様に、メールボックスがすでに存在する場合(サーバがレスポンスコードALREADYEXISTSを返した場合)でもWebExceptionをスローしないようにします。
メールボックスINBOX.newを作成する例。 先の例と同様に、メールボックスがすでに存在する場合(サーバがレスポンスコードALREADYEXISTSを返した場合)でもWebExceptionをスローしないようにします。
 

        

        
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
1804,36 1353,14
 
  :
  :
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.Protocol
+
Imports Smdn.Net.Imap4.WebClients
+
  :
+

         
+
Dim request As ImapWebRequest = DirectCast(WebRequest.Create("imap://user@localhost/INBOX.new"), ImapWebRequest)
+

         
+
request.Credentials = New NetworkCredential("user", "pass")
+
request.Method = ImapWebRequestMethods.Create
+
request.ExpectedErrorResponseCodes = New ImapResponseCode() {ImapResponseCode.AlreadyExists}
+

         
+
Using response As WebResponse = request.GetResponse()
+
  :
+
  :
+
End Using
+
}}
+
#tabpage-end
 

        

        
 
***&aname(ImapWebRequest.sample7){メッセージの検索};
***&aname(ImapWebRequest.sample7){メッセージの検索};
 
ImapStyleUriBuilderを使って、複雑な検索クエリを含むリクエストを送信する例。
ImapStyleUriBuilderを使って、複雑な検索クエリを含むリクエストを送信する例。
 

        

        
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
-
using System.Text;
 
using System.Net;
using System.Net;
+
using System.Text;
 

        

        
 
using Smdn.Net.Imap4;
using Smdn.Net.Imap4;
 
using Smdn.Net.Imap4.WebClients;
using Smdn.Net.Imap4.WebClients;
1854,34 1381,6
 
  :
  :
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports System.Text
+

         
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.WebClients
+
  :
+

         
+
Dim builder As New ImapUriBuilder("imap://user@localhost/INBOX")
+

         
+
builder.SearchCriteria = (ImapSearchCriteria.From("差出人") And ImapSearchCriteria.SentBefore(New DateTime(2010, 2, 6))) _
+
                         Or _
+
                         (ImapSearchCriteria.Unseen And Not ImapSearchCriteria.Subject("未承諾広告"))
+
builder.Charset = Encoding.GetEncoding(932)
+

         
+
Dim request As ImapWebRequest = DirectCast(WebRequest.Create(builder.Uri), ImapWebRequest)
+

         
+
request.Credentials = New NetworkCredential("user", "pass")
+

         
+

         
+
Using response As WebResponse = request.GetResponse()
+
  :
+
  :
+
End Using
+
}}
+
#tabpage-end
 

        

        
 
この例で指定している検索クエリは、
この例で指定している検索クエリは、
 
+fromが'差出人'かつ送信日が2010年2月6日以前、もしくは
+fromが'差出人'かつ送信日が2010年2月6日以前、もしくは
1892,10 1391,10
 
***&aname(ImapWebRequest.sample8){メッセージへのフラグの設定};
***&aname(ImapWebRequest.sample8){メッセージへのフラグの設定};
 
fromにspammer.example.comを含むメッセージをすべて既読にし、Thunderbirdの迷惑メールのマーク(Junk)を設定する例。 ImapStoreDataItem.ReplaceFlagsメソッドを使って新しく置き換える(設定する)フラグを作成し、StoreDataItemプロパティにしています。
fromにspammer.example.comを含むメッセージをすべて既読にし、Thunderbirdの迷惑メールのマーク(Junk)を設定する例。 ImapStoreDataItem.ReplaceFlagsメソッドを使って新しく置き換える(設定する)フラグを作成し、StoreDataItemプロパティにしています。
 

        

        
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
-
using System.Text;
 

        

        
 
using Smdn.Net.Imap4;
using Smdn.Net.Imap4;
 
using Smdn.Net.Imap4.WebClients;
using Smdn.Net.Imap4.WebClients;
1912,27 1411,6
 
  :
  :
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+

         
+
Imports Smdn.Net.Imap4
+
Imports Smdn.Net.Imap4.WebClients
+
  :
+

         
+
Dim request As ImapWebRequest = DirectCast(WebRequest.Create("imap://user@localhost/INBOX?from spammer.example.com"), ImapWebRequest)
+

         
+
request.Credentials = New NetworkCredential("user", "pass")
+
request.Method = ImapWebRequestMethods.Store
+
request.StoreDataItem = ImapStoreDataItem.ReplaceFlags(New String() {"Junk"}, ImapMessageFlag.Seen)
+

         
+
Using response As WebResponse = request.GetResponse()
+
  :
+
  :
+
End Using
+
}}
+
#tabpage-end
 

        

        
 
**ImapSession
**ImapSession
 
このクラスを直接使用することはできますが推奨はしません。 また、ドキュメントを用意する予定はありません。 内部実装の参照や改変などの参考程度に掲載します。
このクラスを直接使用することはできますが推奨はしません。 また、ドキュメントを用意する予定はありません。 内部実装の参照や改変などの参考程度に掲載します。

works/libs/Smdn.Net.Imap4/index.wiki.txt

current previous
46,7 46,6
 

        

        
 
*使い方・サンプルコード
*使い方・サンプルコード
 
もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとIMAP URLを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。
もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとIMAP URLを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
68,35 67,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+

         
+
Imports Smdn.Net.Imap4.WebClients
+

         
+
Class GimapFetchExample
+
  Public Shared Sub Main()
+
    ImapWebRequestCreator.RegisterPrefix()
+
    ImapSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    Using client As New WebClient()
+
      client.Credentials = New NetworkCredential("username", "password")
+
      client.DownloadFile("imaps://username@imap.gmail.com/INBOX/;UID=1", "message.eml")
+
    End Using
+
  End Sub
+

         
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
    Return True
+
  End Function
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Imap4/doc]]およびデモ用アプリケーション[[works/tools/junk/MRAConnector]], [[works/tools/junk/TundereBird]]をご覧ください。
詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Imap4/doc]]およびデモ用アプリケーション[[works/tools/junk/MRAConnector]], [[works/tools/junk/TundereBird]]をご覧ください。
 

        

        

works/libs/Smdn.Formats.Mime/index.wiki.txt

current previous
37,14 37,13
 

        

        
 
*サンプル
*サンプル
 
emlファイルを読み込んでヘッダの一覧とボディの内容を表示する例。
emlファイルを読み込んでヘッダの一覧とボディの内容を表示する例。
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using Smdn.Formats.Mime;
using Smdn.Formats.Mime;
 

        

        
 
public class ReadMail {
public class ReadMail {
 
  public static void Main(string[] args) {
  public static void Main(string[] args) {
~
    var message = MimeMessage.Load("sample.eml");
    var message = MimeMessage.Load("/home/smdn/Desktop/sample.eml");
 

        

        
 
    Dump(message, 0);
    Dump(message, 0);
 
  }
  }
77,46 76,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports Smdn.Formats.Mime
+

         
+
Public Class ReadMail
+
  Public Shared Sub Main(ByVal args As String())
+
    Dim message As MimeMessage = MimeMessage.Load("sample.eml")
+

         
+
    Dump(message, 0)
+
  End Sub
+

         
+
  Private Shared Sub Dump(ByVal message As MimeMessage, ByVal nest As Integer)
+
    Dim indent As String = New String(" "c, nest * 4)
+

         
+
    DumpHeaders(message, indent)
+

         
+
    Console.Write(indent)
+

         
+
    If message.MimeType.TypeEquals("text") Then
+
      Console.WriteLine(message.ReadContentAsText())
+
    Else
+
      Console.WriteLine(message.MimeType)
+
    End If
+

         
+
    For Each part As MimeMessage In message.SubParts
+
      Console.WriteLine()
+

         
+
      Dump(part, nest + 1)
+
    Next
+
  End Sub
+

         
+
  Private Shared Sub DumpHeaders(ByVal message As MimeMessage, ByVal indent As String)
+
    For Each header As MimeHeader In message.Headers
+
      Console.WriteLine("{0}{1}: {2}", indent, header.Name, header.Value)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。
本ライブラリを使用したサンプルアプリケーション[[works/tools/junk/TundereBird]]もあわせてご覧ください。
 

        

        

works/libs/Smdn.Net.Pop3/doc/index.wiki.txt

current previous
271,7 271,6
 
接続・認証時の動作は、[[接続と認証>#login]]で解説したとおりPOP URLに記述されるスキーム・ホスト名・ポート・認証方式・ユーザ名に基づいて決まります。 PopClientクラスではPOP URLは用いず、ホスト・ポート・認証方式・ユーザ名等を個々に指定することもできます。
接続・認証時の動作は、[[接続と認証>#login]]で解説したとおりPOP URLに記述されるスキーム・ホスト名・ポート・認証方式・ユーザ名に基づいて決まります。 PopClientクラスではPOP URLは用いず、ホスト・ポート・認証方式・ユーザ名等を個々に指定することもできます。
 

        

        
 
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#PopClient.certs]]が必要になります。
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#PopClient.certs]]が必要になります。
+
#tabpage(C#)
 
#code(cs,PopClient){{
#code(cs,PopClient){{
 
/*
/*
 
 * ホスト"pop.example.net"のPOPSデフォルトポート(995)にSSL/TLSを用いて接続。
 * ホスト"pop.example.net"のPOPSデフォルトポート(995)にSSL/TLSを用いて接続。
329,65 328,7
 

        

        
 
client6.Connect("pass");
client6.Connect("pass");
 
}}
}}
+
#tabpage(VB)
+
#code(vb,PopClient){{
+
'
+
' ホスト"pop.example.net"のPOPSデフォルトポート(995)にSSL/TLSを用いて接続。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式は対応しているものを順に試行。
+
'
+
Dim client1 As New PopClient(New Uri("pops://user@pop.example.net/"))
+

         
+
client1.Connect("pass")
+

         
+
'
+
' ホスト"pop.example.net"のポート10110に接続、可能ならSSL/TLSにアップグレード。
+
' ユーザ名に"user"を使用、パスワードはNetworkCredentialから取得。 認証方式はAPOPを試行。
+
'
+
Dim client2 As New PopClient(New Uri("pop://user;AUTH=+APOP@pop.example.net:10110/"))
+

         
+
client2.Profile.UseTlsIfAvailable = True
+
client2.Connect(New NetworkCredential("user", "pass"))
+

         
+
'
+
' ホスト"pop.example.net"のポート10110にSSL/TLSを用いて接続。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5を試行。
+
'
+
Dim client3 As New PopClient("pop.example.net", 10110, True, "user", "DIGEST-MD5")
+

         
+
client3.Connect("pass")
+

         
+
'
+
' ホスト"pop.example.net"のPOPデフォルトポート(110)に接続、SSL/TLSは使用しない。
+
' ユーザ名に"user"を使用、パスワードはNetworkCredentialから取得。 認証方式はDIGEST-MD5, CRAM-MD5, APOP, USER/PASSの順に試行。
+
'
+
Dim client4 As New PopClient("pop.example.net", -1, False, Nothing, "*")
+

         
+
client4.Profile.UseTlsIfAvailable = False
+
client4.Profile.UsingSaslMechanisms = New String() {"DIGEST-MD5", "CRAM-MD5", "+APOP"}
+

         
+
client4.Connect(New NetworkCredential("user", "pass"))
+

         
+
'
+
' ホスト"pop.example.net"のPOPデフォルトポート(110)に接続、可能ならSSL/TLSを使用する。
+
' ユーザ名に"user"を使用、パスワードはNetworkCredentialから取得。
+
' 認証方式はCRAM-MD5, PLAIN, APOP, USER/PASSの順に試行。 ただしSSL/TLSが使用できない場合、平文による認証を許可しない。
+
'
+
Dim client5 As New PopClient(New Uri("pop://user@pop.example.net/"))
+

         
+
client5.Profile.UseTlsIfAvailable = True
+
client5.Profile.UsingSaslMechanisms = New String() {"CRAM-MD5", "PLAIN"}
+
client5.Profile.AllowInsecureLogin = False
+

         
+
client5.Connect(New NetworkCredential("user", "pass"))
+

         
+
'
+
' GMailのアカウント"user"にPOPで接続。 パスワードは"pass"を使用。
+
'
+
Dim client6 As New PopClient(New Uri("pops://user@pop.gmail.com/"))
 

        

        
+
client6.Connect("pass")
+
}}
+
#tabpage-end
 
***&aname(PopClient.certs){証明書の選択と検証};
***&aname(PopClient.certs){証明書の選択と検証};
 
デフォルトでは、接続・認証時にPopConnectionクラス(Smdn.Net.Pop3.Protocol.Client名前空間)の以下のメンバを参照して証明書の選択と検証を行います。
デフォルトでは、接続・認証時にPopConnectionクラス(Smdn.Net.Pop3.Protocol.Client名前空間)の以下のメンバを参照して証明書の選択と検証を行います。
 

        

        
399,7 340,6
 

        

        
 
以下は証明書の検証を行う簡単な例です。
以下は証明書の検証を行う簡単な例です。
 

        

        
+
#tabpage(C#)
 
#code(cs,証明書の検証を行う例){{
#code(cs,証明書の検証を行う例){{
 
using System;
using System;
 
using System.Net;
using System.Net;
442,48 382,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb,証明書の検証を行う例){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.Client
+
Imports Smdn.Net.Pop3.Protocol.Client
+

         
+
Public Class ValidateServerCerts
+
  Public Shared Sub Main(ByVal args As String())
+
    ' 証明書の検証を行うコールバックメソッドを指定
+
    PopConnection.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    Using client As New PopClient(New Uri("pops://user@localhost/"))
+
      client.Connect("pass")
+
    End Using
+
  End Sub
+

         
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
#If DEBUG Then
+
    ' デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
+
    if (CInt(sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) <> 0 then
+
      sslPolicyErrors = sslPolicyErrors And Not sslPolicyErrors.RemoteCertificateNameMismatch
+
    End If
+
#End If
+

         
+
    If sslPolicyErrors = sslPolicyErrors.None Then
+
      Return True
+
    Else
+
      ' エラーがあれば標準エラーに表示
+
      Console.Error.WriteLine(sslPolicyErrors)
+
      Return False
+
    End If
+
  End Function
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、PopClient.Connect()メソッドの引数に適切なコールバックメソッドを指定してください。
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、PopClient.Connect()メソッドの引数に適切なコールバックメソッドを指定してください。
 
(このドキュメントは作成中です)
(このドキュメントは作成中です)
644,7 542,6
 

        

        
 
このメソッドはWebRequest.RegisterPrefixメソッドを呼び出し、popスキームおよびpopsスキームに対してPopWebRequestCreatorを関連付けます。
このメソッドはWebRequest.RegisterPrefixメソッドを呼び出し、popスキームおよびpopsスキームに対してPopWebRequestCreatorを関連付けます。
 

        

        
+
#tabpage(C#)
 
#code(cs,記述例){{
#code(cs,記述例){{
 
using System;
using System;
 
using System.Net;
using System.Net;
661,24 558,6
 
  :
  :
 
  :
  :
 
}}
}}
+
#tabpage(VB)
+
#code(vb,記述例){{
+
Imports System
+
Imports System.Net
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.WebClients
+

         
+
  :
+
  :
+
' popおよびpopsスキームの登録
+
PopWebRequestCreator.RegisterPrefix()
+

         
+
' PopWebRequestインスタンスの作成
+
Dim request As WebRequest = WebRequest.Create("pop://user@pop.example.net/")
+
  :
+
  :
+
}}
+
#tabpage-end
 

        

        
 
**リクエストURLと接続・認証時の動作
**リクエストURLと接続・認証時の動作
 
***&aname(PopWebRequest.login){接続と認証};
***&aname(PopWebRequest.login){接続と認証};
694,7 573,6
 

        

        
 
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#PopWebRequest.certs]]が必要になります。
以下はコード上での記述と接続・認証時の動作の例です。 実際にSSL/TLSを使用する場合は[[証明書の検証等>#PopWebRequest.certs]]が必要になります。
 

        

        
+
#tabpage(C#)
 
#code(cs,記述例){{
#code(cs,記述例){{
 
// popおよびpopsスキームの登録
// popおよびpopsスキームの登録
 
PopWebRequestCreator.RegisterPrefix();
PopWebRequestCreator.RegisterPrefix();
753,66 631,6
 

        

        
 
request6.Credentials = new NetworkCredential("user", "pass");
request6.Credentials = new NetworkCredential("user", "pass");
 
}}
}}
+
#tabpage(VB)
+
#code(vb,記述例){{
+
' popおよびpopsスキームの登録
+
PopWebRequestCreator.RegisterPrefix()
+

         
+
'
+
' ホスト"pop.example.net"のPOPSデフォルトポート(995)にSSL/TLSを用いて接続。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式は対応しているものを順に試行。
+
'
+
Dim request1 As WebRequest = WebRequest.Create(New Uri("pops://user@pop.example.net/"))
+

         
+
request1.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' ホスト"pop.example.net"のポート10110に接続、可能ならSSL/TLSにアップグレード。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はAPOPを試行。
+
'
+
Dim request2 As PopWebRequest = DirectCast(WebRequest.Create(New Uri("pop://user;AUTH=+APOP@pop.example.net:10110/")), PopWebRequest)
+

         
+
request2.UseTlsIfAvailable = True
+
request2.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' ホスト"pop.example.net"のポート10110にSSL/TLSを用いて接続。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5を試行。
+
'
+
Dim request3 As PopWebRequest = DirectCast(WebRequest.Create(New Uri("pops://user;AUTH=DIGEST-MD5@pop.example.net:10110/")), PopWebRequest)
+

         
+
request3.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' ホスト"pop.example.net"のPOPデフォルトポート(110)に接続、SSL/TLSは使用しない。
+
' ユーザ名に"user"、パスワードに"pass"を使用。 認証方式はDIGEST-MD5, CRAM-MD5, APOP, USER/PASSの順に試行。
+
'
+
Dim request4 As PopWebRequest = DirectCast(WebRequest.Create(New Uri("pop://;AUTH=*@pop.example.net/")), PopWebRequest)
+

         
+
request4.UseTlsIfAvailable = False
+
request4.UsingSaslMechanisms = New String() {"DIGEST-MD5", "CRAM-MD5", "+APOP"}
+
request4.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' ホスト"pop.example.net"のPOPデフォルトポート(110)に接続、可能ならSSL/TLSを使用する。
+
' ユーザ名に"user"、パスワードに"pass"を使用。
+
' 認証方式はCRAM-MD5, PLAIN, APOP, USER/PASSの順に試行。 ただしSSL/TLSが使用できない場合、平文による認証を許可しない。
+
'
+
Dim request5 As PopWebRequest = DirectCast(WebRequest.Create(New Uri("pop://user@pop.example.net/")), PopWebRequest)
+

         
+
request5.UseTlsIfAvailable = True
+
request5.UsingSaslMechanisms = New String() {"CRAM-MD5", "PLAIN"}
+
request5.AllowInsecureLogin = False
+
request5.Credentials = New NetworkCredential("user", "pass")
+

         
+
'
+
' GMailのアカウント"user"にPOPで接続。 パスワードは"pass"を使用。
+
'
+
Dim request6 As WebRequest = WebRequest.Create(New Uri("pops://user@pop.gmail.com/"))
+

         
+
request6.Credentials = New NetworkCredential("user", "pass")
+
}}
+
#tabpage-end
 

        

        
 
***&aname(PopWebRequest.certs){証明書の選択と検証};
***&aname(PopWebRequest.certs){証明書の選択と検証};
 
デフォルトでは、接続・認証時にPopSessionManagerクラスの以下のメンバを参照して証明書の選択と検証を行います。
デフォルトでは、接続・認証時にPopSessionManagerクラスの以下のメンバを参照して証明書の選択と検証を行います。
825,7 643,6
 

        

        
 
以下は証明書の検証を行う簡単な例です。
以下は証明書の検証を行う簡単な例です。
 

        

        
+
#tabpage(C#)
 
#code(cs,証明書の検証を行う例){{
#code(cs,証明書の検証を行う例){{
 
using System;
using System;
 
using System.Net;
using System.Net;
870,50 687,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb,証明書の検証を行う例){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.WebClients
+

         
+
Public Class ValidateServerCerts
+
  Public Shared Sub Main(ByVal args As String())
+
    PopWebRequestCreator.RegisterPrefix()
+

         
+
    ' 証明書の検証を行うコールバックメソッドを指定
+
    PopSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    Using client As New WebClient
+
      client.Credentials = New NetworkCredential("user", "pass")
+
      client.DownloadFile("pops://user@localhost/;MSG=1", "sample.eml")
+
    End Using
+
  End Sub
+

         
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
#If DEBUG Then
+
    ' デバッグ時のみSslPolicyErrors.RemoteCertificateNameMismatchを無視
+
    if (CInt(sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) <> 0 then
+
      sslPolicyErrors = sslPolicyErrors And Not sslPolicyErrors.RemoteCertificateNameMismatch
+
    End If
+
#End If
+

         
+
    If sslPolicyErrors = sslPolicyErrors.None Then
+
      Return True
+
    Else
+
      ' エラーがあれば標準エラーに表示
+
      Console.Error.WriteLine(sslPolicyErrors)
+
      Return False
+
    End If
+
  End Function
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、PopSessionManager.CreateSslStreamCallbackに適切なコールバックメソッドを指定してください。
SSL/TLS接続時の動作をデフォルトからカスタマイズしたい場合は、PopSessionManager.CreateSslStreamCallbackに適切なコールバックメソッドを指定してください。
 

        

        
1031,7 804,6
 

        

        
 
**PopClient
**PopClient
 
***&aname(PopClient.sample1){メッセージをダウンロードしてファイルに保存する};
***&aname(PopClient.sample1){メッセージをダウンロードしてファイルに保存する};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 

        

        
1053,33 825,10
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

         
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.Client
+

         
+
Class SaveToFile
+
  Public Shared Sub Main(ByVal args As String())
+
    Using client As New PopClient(New Uri("pop://user;AUTH=DIGEST-MD5@localhost/"))
+
      client.Connect("pass")
+

         
+
      ' メールボックスにある1件目のメッセージをダウンロード
+
      Dim message As PopMessageInfo = client.GetFirstMessage()
+

         
+
      ' ファイルsample.emlに保存
+
      message.Save("sample.eml")
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[PopWebRequestで記述した例>#PopWebRequest.sample1]]
同じ処理を[[PopWebRequestで記述した例>#PopWebRequest.sample1]]
 

        

        
 
***&aname(PopClient.sample2){Gmailアカウントのメールボックスから、最新のメッセージをダウンロードする};
***&aname(PopClient.sample2){Gmailアカウントのメールボックスから、最新のメッセージをダウンロードする};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
1115,54 864,10
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+
Imports System.Text
+

         
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.Client
+
Imports Smdn.Net.Pop3.Protocol.Client
+

         
+
Class GpopRetrieveRecent
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
    ' 証明書の検証は省略 (エラーを無視してすべて受け入れる)
+
    Return True
+
  End Function
+

         
+
  Public Shared Sub Main(ByVal args As String())
+
    PopConnection.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    Using client As New PopClient(New Uri("pops://user@pop.gmail.com/"))
+
      client.Connect("pass")
+

         
+
      If client.MessageCount = 0 Then
+
        ' メールボックスにメッセージがない
+
        Console.WriteLine("no messages")
+
        Return
+
      End If
+

         
+
      ' メールボックスにある最後のメッセージを取得
+
      Dim message As PopMessageInfo = client.GetLastMessage()
+

         
+
      ' メッセージ本文をダウンロードし、iso-2022-jpでデコードして表示
+
      Console.WriteLine(message.ReadAllText(Encoding.GetEncoding("iso-2022-jp")))
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[PopWebRequestで記述した例>#PopWebRequest.sample2]]
同じ処理を[[PopWebRequestで記述した例>#PopWebRequest.sample2]]
 

        

        
 
***メールボックスにあるすべてメッセージをダウンロードしてファイルに保存する
***メールボックスにあるすべてメッセージをダウンロードしてファイルに保存する
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 

        

        
1212,68 917,8
 
        :
        :
 
        :
        :
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+
Imports System.Text
+

         
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.Client
+
Imports Smdn.Net.Pop3.Protocol.Client
+

         
+
Class SaveAndDelete
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
    ' 証明書の検証は省略 (エラーを無視してすべて受け入れる)
+
    Return True
+
  End Function
+

         
+
  Public Shared Sub Main(ByVal args As String())
+
    PopConnection.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    Using client As New PopClient(New Uri("pops://user;auth=ntlm@localhost/"))
+
      client.Connect("pass")
+

         
+
      ' メッセージ本文を取得したら削除する
+
      client.DeleteAfterRetrieve = True
+

         
+
      ' メールボックスにあるすべてのメッセージとIDを取得
+
      For Each message As PopMessageInfo In client.GetMessages(True)
+
        ' IDをファイル名として保存 (IDがファイル名として妥当かどうかのチェックは省略)
+
        message.Save(message.UniqueId + ".eml")
+
      Next
+

         
+
      ' ログアウトしてメッセージを削除
+
      client.Logout()
+
    End Using
+
  End Sub
+
End Class
+
}}
+

         
+
上記のコードは、次のコードと等価です。
+
#code(vb){{
+
        :
+
      client.DeleteAfterRetrieve = False
+

         
+
      ' メールボックスにあるすべてのメッセージとIDを取得
+
      For Each message As PopMessageInfo In client.GetMessages(True)
+
        ' IDをファイル名として保存 (IDがファイル名として妥当かどうかのチェックは省略)
+
        message.Save(message.UniqueId + ".eml")
+
        ' 保存できたら削除マークを付ける
+
        message.MarkAsDeleted()
+
      Next
+
        :
+
        :
+
}}
+
#tabpage-end
 

        

        
 
***メッセージのIDを使って新着メッセージをチェックする
***メッセージのIDを使って新着メッセージをチェックする
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Collections.Generic;
using System.Collections.Generic;
1327,67 972,11
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Collections.Generic
+
Imports System.Threading
+

         
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.Client
+

         
+
Class CheckRecent
+
  Public Shared Sub Main(ByVal args As String())
+
    ' 既知のメッセージID
+
    Dim ids As New List(Of String)
+

         
+
    Using client As New PopClient(New Uri("pop://user;auth=ntlm@localhost/"))
+
      client.Profile.UseTlsIfAvailable = False
+

         
+
      Do
+
        client.Connect("pass")
+

         
+
        If Not client.ServerCapabilities.Has(PopCapability.Uidl) Then
+
          ' サーバがUIDLをサポートしていない
+
          Throw New ApplicationException("UIDL incapable")
+
        End If
+

         
+
        ' メールボックスにあるすべてのメッセージを取得
+
        For Each message As PopMessageInfo In client.GetMessages(True)
+
          ' 既知のメッセージIDかどうかチェック
+
          If ids.Contains(message.UniqueId) Then
+
            ' 既知の場合は何もしない
+
          Else
+
            ' 新着の場合は、メッセージ本文のヘッダのみを取得
+
            For Each line As String In message.ReadLines(0)
+
              ' ヘッダのうち"Subject:"で始まる行のみを表示
+
              If (line.StartsWith("Subject:", StringComparison.OrdinalIgnoreCase)) Then
+
                Console.WriteLine("{0}: {1}", message.UniqueId, line)
+
              End If
+
            Next
+

         
+
            ' 既知のメッセージIDとして追加
+
            ids.Add(message.UniqueId)
+
          End If
+
        Next
+

         
+
        ' いったん切断
+
        client.Disconnect()
+

         
+
        ' 5分後に再接続する
+
        Thread.Sleep(TimeSpan.FromMinutes(5.0))
+
      Loop
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
この例において、初回の接続の時点ではidsは空なので、メールボックスにあるメッセージはすべて新着として扱われます。
この例において、初回の接続の時点ではidsは空なので、メールボックスにあるメッセージはすべて新着として扱われます。
 

        

        
 
***メッセージをダウンロードしてパース・デコードする
***メッセージをダウンロードしてパース・デコードする
 
メッセージをダウンロードした後、[[works/libs/Smdn.Formats.Mime]]を使ってパース・デコードする例。
メッセージをダウンロードした後、[[works/libs/Smdn.Formats.Mime]]を使ってパース・デコードする例。
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 

        

        
1415,7 1004,7
 
                          new string('=', 32));
                          new string('=', 32));
 

        

        
 
        // デコードした本文を表示
        // デコードした本文を表示
~
        if (decodedMessage.MimeType.TypeEqualsIgnoreCase("text"))
        if (parsedMessage.MimeType.TypeEqualsIgnoreCase("text"))
 
          Console.WriteLine(decodedMessage.ReadContentAsText());
          Console.WriteLine(decodedMessage.ReadContentAsText());
 
        else
        else
 
          Console.WriteLine("非テキストメッセージです");
          Console.WriteLine("非テキストメッセージです");
1424,48 1013,9
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

         
+
Imports Smdn.Net.Pop3
+
Imports Smdn.Net.Pop3.Client
+
Imports Smdn.Formats.Mime
+

         
+
Class DecodeMime
+
  Public Shared Sub Main(ByVal args As String())
+
    Using client As New PopClient(New Uri("pop://user;auth=ntlm@localhost/"))
+
      client.Profile.UseTlsIfAvailable = False
+

         
+
      client.Connect("pass")
+

         
+
      ' すべてのメッセージを取得
+
      For Each message As PopMessageInfo In client.GetMessages()
+
        ' メッセージの本文を取得し、MimeMessage.Loadメソッドでパース・デコードした結果を得る
+
        Dim decodedMessage As MimeMessage = message.ReadAs(Of MimeMessage)(AddressOf MimeMessage.Load)
+

         
+
        ' デコードしたメッセージの件名を表示
+
        Console.WriteLine("====[{0}: {1}]{2}",
+
                          message.MessageNumber,
+
                          decodedMessage.Headers("Subject").Value,
+
                          New String("="c, 32))
+

         
+
        ' デコードした本文を表示
+
        If decodedMessage.MimeType.TypeEqualsIgnoreCase("text") Then
+
          Console.WriteLine(decodedMessage.ReadContentAsText())
+
        Else
+
          Console.WriteLine("非テキストメッセージです")
+
        End If
+
      Next
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
**PopWebRequest/PopWebResponse
**PopWebRequest/PopWebResponse
 
***&aname(PopWebRequest.sample1){メッセージをダウンロードしてファイルに保存する};
***&aname(PopWebRequest.sample1){メッセージをダウンロードしてファイルに保存する};
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
1486,28 1036,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+

         
+
Imports Smdn.Net.Pop3.WebClients
+

         
+
Class SaveToFile
+
  Public Shared Sub Main(ByVal args As String())
+
    PopWebRequestCreator.RegisterPrefix()
+

         
+
    Using client As New WebClient()
+
      client.Credentials = New NetworkCredential("user", "pass")
+

         
+
      ' メールボックスにある1件目のメッセージをダウンロードしてファイルsample.emlに保存
+
      client.DownloadFile("pop://user;AUTH=DIGEST-MD5@localhost/;MSG=1", "sample.eml")
+
    End Using
+
  End Sub
+
End Class
+

         
+
}}
+
#tabpage-end
 

        

        
 
同じ処理を[[PopClientで記述した例>#PopClient.sample1]]
同じ処理を[[PopClientで記述した例>#PopClient.sample1]]
 

        

        

works/libs/Smdn.Net.Pop3/index.wiki.txt

current previous
44,7 44,6
 

        

        
 
*使い方・サンプルコード
*使い方・サンプルコード
 
もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとPOP URLを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。
もっとも簡単なサンプルコードとして、System.Net.WebClientクラスとPOP URLを使ったメッセージのダウンロード方法を例示します。 Gmailアカウントにアクセスし、メッセージをダウンロードしてファイルに保存するサンプルです。
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
 
using System;
using System;
 
using System.Net;
using System.Net;
66,35 65,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Net
+
Imports System.Net.Security
+
Imports System.Security.Cryptography.X509Certificates
+

         
+
Imports Smdn.Net.Pop3.WebClients
+

         
+
Class GpopRetrieveExample
+
  Public Shared Sub Main()
+
    PopWebRequestCreator.RegisterPrefix()
+
    PopSessionManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateRemoteCertificate)
+

         
+
    Using client As New WebClient()
+
      client.Credentials = New NetworkCredential("username", "password")
+
      client.DownloadFile("pops://username@pop.gmail.com/;MSG=1", "message.eml")
+
    End Using
+
  End Sub
+

         
+
  Private Shared Function ValidateRemoteCertificate(ByVal sender As Object, _
+
                                                    ByVal certificate As X509Certificate, _
+
                                                    ByVal chain As X509Chain, _
+
                                                    ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
+
    Return True
+
  End Function
+
End Class
+
}}
+
#tabpage-end
 

        

        
 
この例で使用している修飾子(;MSG=1)はPOP URLに対する独自の拡張です。 詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Pop3/doc]]およびデモ用アプリケーション[[works/tools/junk/MRAConnector]], [[works/tools/junk/TundereBird]]をご覧ください。
この例で使用している修飾子(;MSG=1)はPOP URLに対する独自の拡張です。 詳細・その他のサンプルコードは[[works/libs/Smdn.Net.Pop3/doc]]およびデモ用アプリケーション[[works/tools/junk/MRAConnector]], [[works/tools/junk/TundereBird]]をご覧ください。