|
|||||
ソケット通信(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 |