Использование TcpClient для подключения и отправки команд на smtp.gmail.com - PullRequest
0 голосов
/ 16 марта 2011

Я не могу отправить команду через 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.

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Вы, вероятно, должны просто использовать System.Net.Mail.SMTPClient , так как это то, что он предназначен для использования с

0 голосов
/ 19 декабря 2015

Чтобы подключиться к TcpClient, вам нужно сканировать DNS раньше, smtp.gmail.com не тот сервер, попробуйте это:

var tcpclnt = new TcpClient();
tcpclnt.Connect("gmail-smtp-in.l.google.com", 25);
...