Задать вопрос
mastersoftna
@mastersoftna

OpenSSL и C#

Привет всем!

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

Пример моего кода:

private string Response()
{
string sResponse = "";
byte[] bytes = new byte[1024];

System.Text.ASCIIEncoding oEncodedData = new System.Text.ASCIIEncoding();
NetworkStream NetStream = tcpClient.GetStream();
if (tls)
{
SslStream ss = new SslStream(NetStream, false, new RemoteCertificateValidationHandler(CertificateValidationCallback), null);

ss.AuthenticateAsClient("smtp.gmail.com");
while (tcpClient.Available == 0)
{
System.Threading.Thread.Sleep(100);
}
ss.Read(bytes, 0, tcpClient.Available);
sResponse = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
}
else
{
while (tcpClient.Available == 0)
{
System.Threading.Thread.Sleep(100);
}
NetStream.Read(bytes, 0, tcpClient.Available);
sResponse = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
}
return sResponse;
}

static bool CertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, int tmp, VerifyResult vr)
{
/*if (sslPolicyErrors != SslPolicyErrors.None)
{
Console.WriteLine("SSL Certificate Validation Error!");
Console.WriteLine(sslPolicyErrors.ToString());
return false;
}
else*/
return true;
}

private void Write(string sMessage)
{
System.Text.ASCIIEncoding oEncodedData = new System.Text.ASCIIEncoding();
byte[] WrriteBuffer = new byte[1024];
WrriteBuffer = oEncodedData.GetBytes(sMessage);
NetworkStream NetStream = tcpClient.GetStream();
if (tls)
{

SslStream ss = new SslStream(NetStream, false, new RemoteCertificateValidationHandler(CertificateValidationCallback), null);
ss.AuthenticateAsClient("smtp.gmail.com");
ss.Write(WrriteBuffer, 0, WrriteBuffer.Length);

}
else
{
NetStream.Write(WrriteBuffer, 0, WrriteBuffer.Length);
}
}

/// /// Отпрвляем письмо
///
/// само письмо
///
public bool Send(NANMessage msg)
{
string result = "";
int tmp = msg.From.IndexOf("@", 0, msg.From.Length);
string domain = msg.From.Substring(tmp + 1, msg.From.Length - tmp - 1);

result = Response();
if (result.Substring(0, 3) != "220")
{
throw new SMTPException(result);
}
Write("EHLO "+ domain + "\r\n");
result = Response();
if (result.Substring(0, 3) != "250")
{
throw new SMTPException(result);
}
  • Вопрос задан
  • 5272 просмотра
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы