OpenSSL и C#

Привет всем!

Объясните мне пожалуйста. как определять в каком формате работает тот или иной smtp-сервер: ssl или tls. Написал клиента на c#. подключаюсь. считываю команды сервера. Вижу команду STARTTLS. Отвечаю серверу STARTTLS. А что делать дальше? Как тут можно использовать openssl? В другом случае команды разобрать не могу. значит ssl. Использую функции openssl. посылаю ehlo получаю ответ. а вот вторая команда уже не проходит. Можно привести пример кода для работы с ssl и tls. Проблемы c gmail. Стандартные framework-овские sslstream не подходит так как пишу для compact framework.

( Читать дальше )

POP3 - клиент на С# (работает на Windows Mobile)

Недавно столкнулся с проблемой получения почты с pop3 — сервера. С отправкой в Framework-е все нормально, а вот с получением… Решил привести пример своего решения данной проблемы на данном молодом сайте.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

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

/// <summary>
/// Сводное описание для POP3EmailMessage
/// </summary>
public class POP3EmailMessage
{
    //номер сообщения на сервере
    public long msgNumber;
    //размер сообщения на сервере
    public long msgSize;
    //флаг, принято ли сообщение с сервера
    public bool msgRecived;
    //текст сообщения
    public string msgContent;
    
    public POP3EmailMessage()
	{
		//
		// TODO: добавьте логику конструктора
		//
	}
}

public class POP3:System.Net.Sockets.TcpClient
{
    public string SaveToFile(string msgContent, string path, string filename)
    {
        string flag = "";
        try
        {
            if (!(Directory.Exists(path)))
            {
                Directory.CreateDirectory(path);
            }
            flag = path + filename + ".eml";
            FileStream file = new FileStream(flag, FileMode.Create);
            StreamWriter sw = new StreamWriter(file);
            sw.WriteLine(msgContent);
            sw.Close();
            file.Close();
        }
        catch (Exception ex)
        {
            flag = "";
        }
        return flag;
    }

    public string From(string msgContent)
    {
        string str = " ";
        char[] sep = {'\r', '\n' };
        string[] tmp = msgContent.Split(sep);
        int count = tmp.Length;
        int j=0;
        while (j != count)
        {
            if (tmp[j].IndexOf("From:") == 0)
            {
                str = Regex.Replace(tmp[j], @"^From:.*[ |<]([a-z|A-Z|0-9|\.|\-|_][email protected][a-z|A-Z|0-9|\.|\-|_]+).*$", "$1");
                break;
            }
            j++;
        }
        return str;
    }

    public string To(string msgContent)
    {
        string str = " ";
        char[] sep = { '\r', '\n' };
        string[] tmp = msgContent.Split(sep);
        int count = tmp.Length;
        int j = 0;
        while (j != count)
        {
            if (tmp[j].IndexOf("To:") == 0)
            {
                str = Regex.Replace(tmp[j], @"^To:.*[ |<]([a-z|A-Z|0-9|\.|\-|_][email protected][a-z|A-Z|0-9|\.|\-|_]+).*$", "$1");
                break;
            }
            j++;
        }
        return str;
    }

    public string Subject(string msgContent)
    {
        string str = " ";
        char[] sep = { '\r', '\n' };
        string[] tmp = msgContent.Split(sep);
        int count = tmp.Length;
        int j = 0;
        while (j != count)
        {
            if (tmp[j].IndexOf("Subject:") == 0)
            {
                str = Regex.Replace(tmp[j], @"^Subject: (.*)$", "$1");
                break;
            }
            j++;
        }
        return str;
    }
    
    public void ConnectPOP(string sServerName, string sUserName, string sUserPassword)
    { 
        //сообщение сервера и результат с сервера
        string sMessage;
        string sResult;

        //соединяемся с POP сервером
        Connect(sServerName, 110);
        //получаем результат
        sResult = Response();

        //проверяеи ответ
        if (sResult.Substring(0, 3) != "+OK") { throw new POPException(sResult); }

        //соеденились, отправляем имя пользователя
        sMessage = "USER " + sUserName + "\r\n";
        //отправляем данные через TCP-соединение
        Write(sMessage);
        sResult = Response();
        if (sResult.Substring(0, 3) != "+OK") { throw new POPException(sResult); }

        //отправляем пароль
        sMessage = "PASS " + sUserPassword + "\r\n";
        Write(sMessage);
        sResult = Response();
        if (sResult.Substring(0, 3) != "+OK") { throw new POPException(sResult); }

    }

    public void DisconnectPOP()
    {
        string sMessage;
        string sResult;

        sMessage = "QUIT\r\n";
        Write(sMessage);
        sResult = Response();
        if (sResult.Substring(0, 3) != "+OK") { throw new POPException(sResult); }
    }

    public ArrayList ListMessages()
    {
        string sMessage;
        string sResult;
        ArrayList returnValue = new ArrayList();
        sMessage = "LIST\r\n";
        Write(sMessage);
        sResult = Response();
        if (sResult.Substring(0, 3) != "+OK") { throw new POPException(sResult); }

        while (true)
        {
            sResult = Response();
            if (sResult == ".\r\n")
            {
                return returnValue;
            }
            else
            {
                POP3EmailMessage oMailMessage = new POP3EmailMessage();
                //разделитель - пробел
                char[] sep = {' '};
                string[] values = sResult.Split(sep);
                oMailMessage.msgNumber = Int32.Parse(values[0]);
                oMailMessage.msgSize = Int32.Parse(values[1]);
                oMailMessage.msgRecived = false;
                returnValue.Add(oMailMessage);
                continue;
            }
        }

    }

    public POP3EmailMessage RetrieveMessage(POP3EmailMessage msgRETR)
    {
        string sMessage;
        string sResult;

        POP3EmailMessage oMailMassage = new POP3EmailMessage();
        oMailMassage.msgSize = msgRETR.msgSize;
        oMailMassage.msgNumber = msgRETR.msgNumber;
        sMessage = "RETR " + msgRETR.msgNumber + "\r\n";
        Write(sMessage);
        sResult = Response();
        if (sResult.Substring(0, 3) != "+OK") { throw new POPException(sResult); }
        oMailMassage.msgRecived = true;
        while (true)
        {
            sResult = Response();
            if (sResult == ".\r\n")
            {
                break;
            }
            else
            {
                oMailMassage.msgContent += sResult;
            }
        }
        return oMailMassage;

    }

    private void Write(string sMessage)
    {
        System.Text.ASCIIEncoding oEncodedData = new System.Text.ASCIIEncoding();
        byte[] WrriteBuffer = new byte[1024];
        WrriteBuffer = oEncodedData.GetBytes(sMessage);
        NetworkStream NetStream = GetStream();
        NetStream.Write(WrriteBuffer, 0, WrriteBuffer.Length);
    }

    private string Response()
    {
        System.Text.ASCIIEncoding oEncodedData = new System.Text.ASCIIEncoding();
        byte[] ServerBuffer = new Byte[1024];
        NetworkStream NetStream = GetStream();
        int count = 0;

        //считываем данные из сетевого потока сервера, что бы потом их декодировать
        while (true)
        {
            byte[] buff = new Byte[2];
            int bytes = NetStream.Read(buff, 0, 1);
            if (bytes == 1)
            {
                ServerBuffer[count] = buff[0];
                count++;
                if (buff[0] == '\n')
                {
                    break;
                }
            }
            else
            {
                break;
            }
        }
        //возвращаем декодированный ответ сервера
        string ReturnValue = oEncodedData.GetString(ServerBuffer, 0, count);
        return ReturnValue;
    }

    public void DeleteMessage(POP3EmailMessage msgDELE)
    {
        string sMessage;
        string sResult;

        sMessage = "DELE " + msgDELE.msgNumber + "\r\n";
        Write(sMessage);
        sResult = Response();
        if (sResult.Substring(0, 3) != "+OK") { throw new POPException(sResult); }

    }
}

public class POPException : System.ApplicationException
{
    public POPException(string str): base (str)
    { 
    }
}


Пример кода взят из какой то книги, название не помню. И немного доработан. Конечно он не решит всех проблем, но думаю многим будет полезен.