C# 入門 & 実践 / C sharp

301-2. メール送受信 - 2 - pop before smtp


基本的には送信前にPOP3でログインするだけです。
このpop3は受信でも使えますね~

        // メール送信テスト。
        public static bool SendMail( string to , string from , string title, string message )
        {
            // check mail address

            try
            {
                // pop before smtp のPOP認証
                if (false == pop_check())
                {
                    return false;
                }

                SmtpClient sc = new SmtpClient();
                sc.Host = @"192.168.1.123";
                //sc.Port = 25;

                MailMessage myMessage = new MailMessage("jitmailer@gmail"
                    ,to );
                myMessage.Subject = title;
                myMessage.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
                // Encoding は、デフォルトで iso-2022-jp になっているので、
                // 指定する必要は無い。
                myMessage.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
                myMessage.Body = message;

                // 重要度の指定 (Low, Normal, Highから選ぶ)
                // 指定する必要は無い。
                //            myMessage.Priority = MailPriority.Low;

                sc.Send(myMessage);
                
                return true;
            }
            catch 
            {
                return false;
            }
        }

        // POP Check
        // pop before smtp のときにpopをチェックする。
        public static bool pop_check()
        {
            try
            {
                // pop server
                string pop3_server = @"192.168.1.123";

                TcpClient tc = new TcpClient(pop3_server, 110);
                // tc.Connect();
                // 非同期でやらないとまた繋がらない・・・
                NetworkStream stream = tc.GetStream();

                // 接続できたら、次にコマンドを送る。
                // 認証用のコマンド:ユーザ名とパスワード+QUIT
                string pop_cmd = "USER jitmailer\n";
                string pop_cmd_2 = "PASS gggggg\n";
                string pop_cmd_3 = "QUIT\n";
                Byte[] cmd_data = System.Text.Encoding.ASCII.GetBytes(pop_cmd);
                Byte[] cmd_data_2 = System.Text.Encoding.ASCII.GetBytes(pop_cmd_2);
                Byte[] cmd_data_3 = System.Text.Encoding.ASCII.GetBytes(pop_cmd_3);

                // レスポンスデータ用
                Byte[] data = new Byte[256];
                String responseData = String.Empty;
                // 接続OKのレスポンスを読む
                Int32 bytes = stream.Read(data, 0, data.Length);

                
                // ストリームに書き込み
                stream.Write(cmd_data, 0, cmd_data.Length);
                // パスワードを要求されるメッセージを読む
                bytes = stream.Read(data, 0, data.Length);
                // +OK message ~
                responseData = String.Empty;
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
                if (!responseData.StartsWith(@"+OK"))
                {
                    // > - <; エラーですよ。
                    return false;
                }
                // パスワードコマンド
                stream.Write(cmd_data_2, 0, cmd_data_2.Length);
                bytes = stream.Read(data, 0, data.Length);

                // +OK message ~
                responseData = String.Empty;
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
                if (!responseData.StartsWith(@"+OK"))
                {
                    // > - <; エラーですよ。
                    return false;
                }



                // QUIT 終了
                stream.Write(cmd_data_3, 0, cmd_data_3.Length);

                // 終わり。
                stream.Close();
                tc.Close();

                return true;
            }
            catch
            {
                // error //
                return false;
            }
        }

しかし、結局は非同期で接続しないとアプリが止まってしまいます。
次は、smtpもpopも非同期にしてみます。



301-1. メール送受信 - 1 - メール送信 « メール送受信

C# 入門 & 実践 / C sharp