POP3 mailcheck (C#)

ane 19.01.04 19:21

Tarkistaa uusien viestien määrän sähköpostilootassasi, POP3-protokollaa käyttäen.

 Tekstiversio  Arvo: -1 (6 ääntä)  Äänestä: +  -
// Pop3 mailcheck - check the number of new mails in your maildrop
// - TODO: use windows.forms, use #develop
// (c) Anzuhan

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.Text.RegularExpressions;

namespace MailChecker
{
    class MailCount
    {
        private static string server;
        private static int port;
        private static string username;
        private static string password;

        // socket stuff
        private static TcpClient pop3;
        private static NetworkStream netstream;
        private static StreamReader reader;
        private static StreamWriter writer;

        public MailCount(string s, int p, string u, string pass) {
            server = s;
            port = p;
            username = u;
            password = pass;

            this.Connect();
        }

        // connect to server, and then authenticate
        private void Connect() {
            try {
                pop3 = new TcpClient(server, port);
                netstream = pop3.GetStream();

                reader = new StreamReader(netstream);
                writer = new StreamWriter(netstream);
            }
            catch (Exception e) {
                Console.WriteLine("Error: " + e.ToString());
            }
        }

        // send password to server
        public void GetMailCount() {
            string linedata;
            Regex re, re2;
            Match m, m2;

            try {
                writer.WriteLine("USER " + username);
                writer.Flush();

                writer.WriteLine("PASS " + password);
                writer.Flush();

                                // just a small delay
                Thread.Sleep(1000);

                writer.WriteLine("STAT");
                writer.Flush();

                while (true) {

                    // check if it was a correct STAT reply
                    // such as +OK 6 320
                    while ((linedata = reader.ReadLine()) != null) {
                        re = new Regex(@"^\+OK\s(\d+?)\s(\d+?)$"); // +OK x y
                        re2 = new Regex(@"^-ERR\s(.*)$"); // -ERR error

                        m = re.Match(linedata);
                        m2 = re2.Match(linedata);

                        // should it match, print the number of new mails and disconnect
                        if (m.Success) {
                            Console.WriteLine("You have " + m.Groups[1].Captures[0].Value + " new mails!");
                            break;
                        }

                        // did we get an error?
                        else if (m2.Success) {
                            Console.WriteLine("Error: " + m2.Groups[1].Captures[0].Value);
                            break;
                        }
                    }

                    reader.Close();
                    writer.Close();
                    pop3.Close();
                    break;
                }
            }
            catch (Exception e) {
                Console.WriteLine("Error: " + e.ToString());
            }
        }
    }

    // a test class
    class GetMail
    {
        static void Main(string[] args) {
            MailCount mails = new MailCount("server.com", 110, "someuser", "somepassword");
            mails.GetMailCount();
        }
    }
}



 

weicco 12:00 20.1.04 
Näppärää. -1 siitä, kun et tarkistanut USER ja PASS viestien paluuarvoja :P
ane 18:17 20.1.04 
Nyt on.
ikkah 20:16 20.1.04 
ezSocketeilla ja C++:lla olis nätimpi :)
Anylo 23:23 21.1.04 
Hyvä pikkukikkare. Tällaisia lisää.
feenix 14:53 16.5.05 
Kun USER ja PASS -paluuarvot käsitellään, voidaan heittää seuraavaksi regexpit mäkeen ja tehdä homma tehokkaammin. Ja miksi muutenkaan tehtäisi molempia regexpejä? Eikä tarvita silloin myöskään mitään odotuksia, jotka hidastavat jos kaikki meneekin kiltisti oikein.

Esimerkiksi:

if (linedata.StartsWith("+OK")) // joissain protokollissa olisi kilttiä tehdä ToUpper(), mutta POP3:n speksi sanoo että PITÄÄ olla isolla, muuten serveri on rikki
{
string[] tmp = linedata.Split(' ');
Console.WriteLine("You have " + tmp[1] + " new mails!");
break;
}

Myöskin POP3:n RFC käskee päättämään rivit CRLF, jota tässä ei tehdä, ellei ajeta ympäristössä jossa rivinvaihtokoodi on CRLF. Ei porttautuvaa siis.