NonSoft

IMAP(SSL有り)でメール受信
(TcpClientソケット通信)サンプル(VB.NET)


 サンプル(ソース/コード)
ソケット通信(System.Net.Sockets.TcpClient)によるIMAPメール受信(SSL有り)のサンプルです。
メールで送受信されているコマンドとレスポンスの参考になると思います。

IMAPサーバーで使用されるコマンド(APPEND/EXPUNGE/SEARCH/FETCH/STORE/COPY)は沢山ありますが、
このサンプルではFETCHによるメール受信のみシンプルにまとめています。

このサンプルは、IMAP over SSL(セキュリティで保護された接続)を
ソケット通信で実装したサンプルです。

簡単にメール送受信したい方は、こちらのDLLをオススメします。
メール送信/受信DLL(VB.NET/C#.NET)

C#.NET版のサンプルソースはこちらです。
IMAP(SSL有り)でメール受信(TcpClientソケット通信)サンプル(C#.NET)

メール関係のその他のサンプルはこちらです。
メール送信/メール受信サンプル(VBS/VBA)
メール送信(SMTP認証/POP認証)のサンプル(VB.NET)
SMTP(SSL無し)でメール送信(TcpClientソケット通信)サンプル(VB.NET)
SMTP(SSL有り)でメール送信(TcpClientソケット通信)サンプル(VB.NET)
SMTP(TLS有り)でメール送信(TcpClientソケット通信)サンプル(VB.NET)
POP3(SSL無し)でメール受信(TcpClientソケット通信)サンプル(VB.NET)
POP3(SSL有り)でメール受信(TcpClientソケット通信)サンプル(VB.NET)
IMAP(SSL無し)でメール受信(TcpClientソケット通信)サンプル(VB.NET)

メール関係のツールはこちらです。
指令メール実行
受信メールを監視しメールタイトルのキーワードに対応したプログラムを実行するツールです。
ファイル監視人
ファイルやフォルダの更新時にメッセージ表示またはメール送信するツールです。
フォルダ監視人
フォルダ内のファイル更新時に更新通知(差分メール等)、指定プログラム実行するツールです。
PC状況メール通知(PcEvMail)
PC起動/PC終了/ログイン/ログアウト/ファイル更新時にメール通知/ログ出力するツールです。

ソケット通信関係のサンプルはこちらにもあります。
ソケット(TCP/IP)通信関係のサンプル

★フォーム(Form1.vb)
Public Class Form1
    Private tagn As String = "TAGN "
    Private cset As String = "ISO-2022-JP"
    Private serv As String = "imap.xxx.com"
    Private port As Integer = 993
    Private user As String = "user"
    Private pass As String = "pass"

    ' (SSL有り)IMAPでメール受信(TcpClientソケット通信)サンプル
    ' グーグル(imap.gmail.com)やヤフー(imap.mail.yahoo.co.jp)や
    ' ニフティー(imap.nifty.com)でメール受信
    Private Sub Button1_Click( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' IMAPサーバーに接続
        Dim client As System.Net.Sockets.TcpClient
        client = New System.Net.Sockets.TcpClient
        client.Connect(serv, port)

        ' SSLの実装-------------------------------------------------------------------
        ' 通信開始(SSL有り)
        Dim stream As System.Net.Security.SslStream
        stream = New System.Net.Security.SslStream(client.GetStream())
        stream.AuthenticateAsClient(serv)
        ' ----------------------------------------------------------------------------

        ' IMAPサーバー接続時のレスポンス受信
        Dim rstr As String
        rstr = StreamWriteAndRead(stream, "", cset)
        If rstr.StartsWith("*") = False Then
            Throw New Exception("エラー:" & rstr)
        End If

        ' LOGIN(ログイン)の送信
        rstr = StreamWriteAndRead(stream, tagn & "LOGIN " & user & " " & pass & vbCrLf, cset)
        If rstr.StartsWith("*") = False Then
            Throw New Exception("エラー:" & rstr)
        End If

        ' SELECT INBOX(メールボックスを選択)の送信
        rstr = StreamWriteAndRead(stream, tagn & "SELECT INBOX" & vbCrLf, cset)
        If rstr.StartsWith("*") = False Then
            Throw New Exception("エラー:" & rstr)
        End If

        ' SEARCH ALL(メール番号の一覧を取得)の送信
        rstr = StreamWriteAndRead(stream, tagn & "SEARCH ALL" & vbCrLf, cset)
        If rstr.StartsWith("*") = False Then
            Throw New Exception("エラー:" & rstr)
        End If

        ' FETCH(メールのヘッダを取得)の送信
        rstr = StreamWriteAndRead(stream, tagn & "FETCH 1:* (RFC822.HEADER)" & vbCrLf, cset)
        If rstr.StartsWith("*") = False Then
            Throw New Exception("エラー:" & rstr)
        End If

        ' メールのヘッダを表示
        System.Diagnostics.Debug.WriteLine(rstr)

        ' FETCH(メールの本文を取得)の送信
        rstr = StreamWriteAndRead(stream, tagn & "FETCH 1:* (RFC822.TEXT)" & vbCrLf, cset)
        If rstr.StartsWith("*") = False Then
            Throw New Exception("エラー:" & rstr)
        End If

        ' メールの本文を表示
        System.Diagnostics.Debug.WriteLine(rstr)

        ' LOGOUT(ログアウト)の送信
        rstr = StreamWriteAndRead(stream, tagn & "LOGOUT" & vbCrLf, cset)
        If rstr.StartsWith("*") = False Then
            Throw New Exception("エラー:" & rstr)
        End If
    End Sub

    ''' <summary>
    ''' メールサーバとの送受信
    ''' </summary>
    ''' <param name="stm">メールサーバ通信ストリーム</param>
    ''' <param name="req">リクエスト(コマンド)</param>
    ''' <param name="cst">文字コード</param>
    ''' <returns>レスポンス</returns>
    ''' <remarks></remarks>
    Private Function StreamWriteAndRead( _
        ByVal stm As Object, _
        ByVal req As String, _
        ByVal cst As String) As String

        ' メールサーバへリクエスト送信
        If req <> "" Then
            Dim sdat() As Byte
            sdat = System.Text.Encoding.GetEncoding(cst).GetBytes(req)
            stm.Write(sdat, 0, sdat.Length)
            stm.Flush()
        End If

        ' メールサーバからのレスポンス受信
        Dim rstr As String = ""
        Dim rdat As Byte() = New Byte() {}
        Dim l As Integer
        Do
            ReDim rdat(1024 * 1024 - 1)
            l = stm.Read(rdat, 0, rdat.Length)
            If l > 0 Then
                ReDim Preserve rdat(l - 1)
                rstr &= _
                    System.Text.Encoding.GetEncoding(cst).GetString(rdat)
            Else
                Throw New Exception("Read Error.")
            End If
        Loop While (req <> "" And _
                    rstr.StartsWith("*") = True And _
                    rstr.IndexOf(vbCrLf & tagn) < 0)

        ' レスポンス応答
        Return rstr
    End Function
End Class