Я не могу отправить команду через smtp.gmail.com.
При подключении к 465 в качестве номера порта я вижу некоторые смешанные символы.
Если я использую любой другой номер порта, например 25 или 587, произойдет сбой с сообщением «Сбой при рукопожатии из-за непредвиденного формата пакета».
Вот мой код ..
public delegate void StatusUpdateEvents(object o, clsStatusEventHandler e);
public event StatusUpdateEvents statusupdate;
clsStatusEventHandler objStatus = new clsStatusEventHandler();
public bool EnableSSL { get; set; }
public string strIpAddress { get; set; }
public int portNo { get; set; }
static public string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
public TcpClient GetTcpClient()
{
if(smtpTcpClient==null) smtpTcpClient = new TcpClient();
return smtpTcpClient;
}
public TcpClient ConnectTcpClient()
{
if (smtpTcpClient.Connected) smtpTcpClient.Close();
smtpTcpClient.Connect(strIpAddress, portNo);
return smtpTcpClient;
}
public void UpdateStatus(string strStatus)
{
objStatus.strStatus = strStatus;
if (statusupdate!=null) statusupdate(this, objStatus);
}
bool CertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
public StreamReader GetReadStream()
{
if (EnableSSL == true)
{
smtpNetworkStream = smtpTcpClient.GetStream();
if (smtpStreamReader == null) { smtpStreamReader = new StreamReader(GetSslStream()); }
return smtpStreamReader;
}
else
{
smtpNetworkStream = smtpTcpClient.GetStream();
if (smtpStreamReader == null) { smtpStreamReader = new StreamReader(smtpNetworkStream); }
return smtpStreamReader;
}
}
public StreamWriter GetWriteStream()
{
if (EnableSSL == true)
{
smtpNetworkStream = smtpTcpClient.GetStream();
// readerSmtp = new StreamReader(new System.Net.Security.SslStream(clientSmtp.GetStream(), true, CertificateValidationCallback));
if (smtpStreamWriter == null) { smtpStreamWriter = new StreamWriter(GetSslStream()); }
return smtpStreamWriter;
}
else
{
smtpNetworkStream = smtpTcpClient.GetStream();
if (smtpStreamWriter == null) { smtpStreamWriter = new StreamWriter(smtpNetworkStream); }
return smtpStreamWriter;
}
}
SslStream GetSslStream()
{
if (sslstream == null) {
sslstream = new SslStream(smtpNetworkStream);
sslstream.AuthenticateAsClient(strIpAddress, null, System.Security.Authentication.SslProtocols.Tls, false);
}
return sslstream;
}
public void DoConnect(string strIpAddress, int portno,bool EnableSSL)
{
this.strIpAddress = strIpAddress;
this.portNo = portno;
try
{
UpdateStatus("trying to connect to " + strIpAddress + ":" + portno.ToString());
smtpTcpClient = GetTcpClient();
smtpTcpClient.Connect(strIpAddress, portno);
if(EnableSSL==true)
{
this.EnableSSL = EnableSSL;
smtpNetworkStream = smtpTcpClient.GetStream();
//sslstream.Write(System.Text.ASCIIEncoding.ASCII.GetBytes("EHLO something123@gmail.com \n"));
//sslstream.Write(System.Text.ASCIIEncoding.ASCII.GetBytes("STARTTLS \n"));
smtpStreamReader = GetReadStream();//new StreamReader(new System.Net.Security.SslStream(smtpTcpClient.GetStream(), true,CertificateValidationCallback));
//readerSmtp = new StreamReader(sslstream);
}
else
{
EnableSSL = false;
smtpNetworkStream = smtpTcpClient.GetStream();
smtpStreamReader = GetReadStream();
}
UpdateStatus(readResponse());
}
catch (Exception e)
{
//MessageBox.Show(e.Message);
UpdateStatus("****CONNECTION ERROR****" + "\n" + e.Message);
smtpTcpClient.Close();
}
}
Пожалуйста, помогите мне ..
Большое спасибо заранее ..
Редактировать: Я знаю о System.net.mail.smtpclient и других доступных SMTP-библиотеках с открытым исходным кодом. Но я не могу использовать это для ручной отправки команд SMTP. Это не для отправки электронной почты. Это для пошагового просмотра протокола электронной почты по SSL.