ソフト開発塾 VBでメールソフトを作成

KONDO-NETサーチ(KLSH)
- 新着 - VB - VC - Perl - PHP - カテゴリに登録 -
メールを受信するには?
 メールサーバーにログインする必要があるようです。
 そのメールサーバーが提供している方式にあわす必要があるようで
 POP3が、一般的のようです。
 POP3は、TCP/IPのポート番号110で行うことが多いようです。

 では、やってみましょう。

「新しいプロジェクト」で、「Windowsフォームアプリケーション」を選択します。
プロジェクト名は、適当に今回は、VBMLとしました。

受信用の関数と送信用の関数を用意
通常JISコードなので、エンコード(文字コード)をJISにしておく。
データ送信用の関数
    Private Sub SendDataM(ByRef ns As System.Net.Sockets.NetworkStream, ByVal msg As String)
        '文字コードを指定する
        'Dim enc_asc As System.Text.Encoding = System.Text.Encoding.ASCII
        Dim enc_jis As System.Text.Encoding = System.Text.Encoding.GetEncoding("ISO-2022-JP")
        Dim msgBytes As Byte() = enc_jis.GetBytes(msg & vbCrLf)
        ns.Write(msgBytes, 0, msgBytes.Length)
    End Sub
データ受信用の関数
    Private Sub DataRecvM(ByRef ns As System.Net.Sockets.NetworkStream, ByRef resMsg As String)
        '文字コードを指定する
        'Dim enc_asc As System.Text.Encoding = System.Text.Encoding.ASCII
        Dim enc_jis As System.Text.Encoding = System.Text.Encoding.GetEncoding("ISO-2022-JP")
        Dim ms As New System.IO.MemoryStream
        Dim resBytes(4096) As Byte
        Dim resSize As Integer
        Do While ns.DataAvailable
            'データを受信する
            resSize = ns.Read(resBytes, 0, resBytes.Length)
            '受信したデータを蓄積する
            ms.Write(resBytes, 0, resSize)
        Loop
        resMsg = enc_jis.GetString(ms.ToArray())
        ms.Close()
    End Sub

ソケットをオープンしてコマンドを送信すれば、結果が取得できる。
        Dim mm_socket As System.Net.Sockets.TcpClient = New System.Net.Sockets.TcpClient(mp_host, mp_port)
        Dim ns As System.Net.Sockets.NetworkStream = mm_socket.GetStream()
        DataRecvM(ns, resMsg)
        SendDataM(ns, "USER " & mp_user)
        DataRecvM(ns, resMsg)
        SendDataM(ns, "PASS " & mp_pw)
        DataRecvM(ns, resMsg)
        SendDataM(ns, "LIST")
        DataRecvM(ns, resMsg)
        SendDataM(ns, "RETR 1")
        DataRecvM(ns, resMsg)
        SendDataM(ns, "QUIT")
        DataRecvM(ns, resMsg)
        ns.Close()
        mm_socket.Close()

実際の受信処理では、LISTコマンドの結果により、RETRコマンドを調整する必要があります。

(POPサーバーのコマンドは、専門サイト等で、お調べ願います。抜粋
サンプルプログラム


メールを送信するには?
 SMTPサーバーに接続する必要があるようです。
 SMTPサーバーは、TCP/IPのポート番号25で行うことが多いようです。
基本的な受信用の関数と送信用の関数は、受信と同じです。
送信の場合、メールの本文(ヘッダー含む)を送信する必要から別の関数を用意。
    Private Sub SendDataMData(ByRef ns As System.Net.Sockets.NetworkStream, ByVal msg As String)
        '文字コードを指定する
        'Dim enc_asc As System.Text.Encoding = System.Text.Encoding.ASCII
        Dim enc_jis As System.Text.Encoding = System.Text.Encoding.GetEncoding("ISO-2022-JP")
        Dim msgBytes As Byte() = enc_jis.GetBytes(msg & vbCrLf & "." & vbCrLf)
        ns.Write(msgBytes, 0, msgBytes.Length)
    End Sub

ソケットをオープンしてコマンドを送信すれば、メール送信が出来る。
        Dim mm_socket As System.Net.Sockets.TcpClient = New System.Net.Sockets.TcpClient(mp_host, mp_port)
        Dim ns As System.Net.Sockets.NetworkStream = mm_socket.GetStream()
        DataRecvM(ns, resMsg)
        SendDataM(ns, "HELO MAIL")
        DataRecvM(ns, resMsg)
        SendDataM(ns, "MAIL FROM: <" & mp_From & ">")
        DataRecvM(ns, resMsg)
        SendDataM(ns, "RCPT TO: <" & mp_To & ">")
        DataRecvM(ns, resMsg)
        SendDataM(ns, "DATA")
        DataRecvM(ns, resMsg)
        SendDataMData(ns, mp_data)
        DataRecvM(ns, resMsg)
        SendDataM(ns, "QUIT")
        DataRecvM(ns, resMsg)
        ns.Close()
        mm_socket.Close()

(SMPTサーバーのコマンドは、専門サイト等で、お調べ願います。抜粋
サンプルプログラム


ソフト開発塾 - 前のページへ戻る - KKLIB - KONDO-NETサーチ

--- KONDO-NET.GR.JP ---