NonSoft

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


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

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

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

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

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

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

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

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

★フォーム(Form1.cs)
public partial class Form1 : Form
{
    private String tagn = "TAGN ";
    private String cset = "ISO-2022-JP";
    private String serv = "imap.xxx.com";
    private int port = 993;
    private String user = "user";
    private String pass = "pass";

    // (SSL有り)IMAPでメール受信(TcpClientソケット通信)サンプル
    // グーグル(imap.gmail.com)やヤフー(imap.mail.yahoo.co.jp)や
    // ニフティー(imap.nifty.com)でメール受信メール受信
    private void button1_Click(object sender, EventArgs e)
    {
        // IMAPサーバーに接続
        System.Net.Sockets.TcpClient client;
        client = new System.Net.Sockets.TcpClient();
        client.Connect(serv, port);

        // SSLの実装------------------------------------------------------------------
        // 通信開始(SSL有り)
        System.Net.Security.SslStream stream;
        stream = new System.Net.Security.SslStream(client.GetStream());
        stream.AuthenticateAsClient(serv);
        // ---------------------------------------------------------------------------

        // IMAPサーバー接続時のレスポンス受信
        String rstr;
        rstr = StreamWriteAndRead(stream, "", cset);
        if (rstr.StartsWith("*") == false)
        {
            throw new Exception("エラー:" + rstr);
        }

        // LOGIN(ログイン)の送信
        rstr = StreamWriteAndRead(stream, tagn + "LOGIN " + user + " " + pass + "\r\n", cset);
        if (rstr.StartsWith("*") == false)
        {
            throw new Exception("エラー:" + rstr);
        }

        // SELECT INBOX(メールボックスを選択)の送信
        rstr = StreamWriteAndRead(stream, tagn + "SELECT INBOX" + "\r\n", cset);
        if (rstr.StartsWith("*") == false)
        {
            throw new Exception("エラー:" + rstr);
        }

        // SEARCH ALL(メール番号の一覧を取得)の送信
        rstr = StreamWriteAndRead(stream, tagn + "SEARCH ALL" + "\r\n", cset);
        if (rstr.StartsWith("*") == false)
        {
            throw new Exception("エラー:" + rstr);
        }

        // FETCH(メールのヘッダを取得)の送信
        rstr = StreamWriteAndRead(stream, tagn + "FETCH 1:* (RFC822.HEADER)" + "\r\n", cset);
        if (rstr.StartsWith("*") == false)
        {
            throw new Exception("エラー:" + rstr);
        }

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

        // FETCH(メールの本文を取得)の送信
        rstr = StreamWriteAndRead(stream, tagn + "FETCH 1:* (RFC822.TEXT)" + "\r\n", cset);
        if (rstr.StartsWith("*") == false)
        {
            throw new Exception("エラー:" + rstr);
        }

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

        // LOGOUT(ログアウト)の送信
        rstr = StreamWriteAndRead(stream, tagn + "LOGOUT" + "\r\n", cset);
        if (rstr.StartsWith("*") == false)
        {
            throw new Exception("エラー:" + rstr);
        }
    }

    /// <summary>
    /// メールサーバとの送受信
    /// </summary>
    /// <param name="stm">メールサーバ通信ストリーム</param>
    /// <param name="req">リクエスト(コマンド)</param>
    /// <param name="cts">文字コード</param>
    /// <returns>レスポンス</returns>
    private String StreamWriteAndRead(
        System.Net.Security.SslStream stm, String req, String cst)
    {
        // メールサーバへリクエスト送信
        if (req != "")
        {
            Byte[] sdat;
            sdat = System.Text.Encoding.GetEncoding(cst).GetBytes(req);
            stm.Write(sdat, 0, sdat.Length);
            stm.Flush();
        }

        // メールサーバからのレスポンス受信
        String rstr = "";
        Byte[] rdat = new Byte[] { };
        int l;
        do
        {
            Array.Resize<Byte>(ref rdat, 1024 * 1024);
            l = stm.Read(rdat, 0, rdat.Length);
            if (l > 0)
            {
                Array.Resize<Byte>(ref rdat, l);
                rstr +=
                    System.Text.Encoding.GetEncoding(cst).GetString(rdat);
            }
            else
            {
                throw new Exception("Read Error.");
            }
        } while (req != "" &&
                 rstr.StartsWith("*") == true &&
                 rstr.IndexOf("\r\n" + tagn) < 0);

        // レスポンス応答
        return rstr;
    }
}