2011-12-04 19 views
17

Trong khung .NET có một lớp TcpClient để truy xuất email từ máy chủ email. Lớp TcpClient có 4 hàm tạo để kết nối với máy chủ có tối đa hai tham số. Nó hoạt động tốt với những máy chủ không sử dụng SSL. Nhưng gmail hoặc nhiều nhà cung cấp dịch vụ email khác sử dụng SSL cho IMAP.Cách sử dụng SSL trong lớp TcpClient

Tôi có thể kết nối với máy chủ gmail nhưng không thể xác thực bằng email_id và mật khẩu. Mã của tôi cho người dùng xác thực là

'public void AuthenticateUser(string username, string password) 
    { 
     _imapSw.WriteLine("$ LOGIN " + username + " " + password); 
     //_imapSw is a object of StreamWriter class 
     _imapSw.Flush(); 
     Response(); 
    }' 

Nhưng mã này không thể đăng nhập được.

Vậy làm cách nào tôi có thể sử dụng lớp học TcpClient để truy xuất email khi tôi phải sử dụng SSL?

Trả lời

32

Bạn phải sử dụng SslStream cùng với TcpClient sau đó sử dụng SslStream để đọc dữ liệu thay vì TcpClient.

cái gì đó dọc theo dòng:

 TcpClient mail = new TcpClient(); 
     SslStream sslStream; 

     mail.Connect("pop.gmail.com", 995); 
     sslStream = new SslStream(mail.GetStream()); 

     sslStream.AuthenticateAsClient("pop.gmail.com"); 

     byte[] buffer = new byte[2048]; 
     StringBuilder messageData = new StringBuilder(); 
     int bytes = -1; 
     do 
     { 
      bytes = sslStream.Read(buffer, 0, buffer.Length); 

      Decoder decoder = Encoding.UTF8.GetDecoder(); 
      char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)]; 
      decoder.GetChars(buffer, 0, bytes, chars, 0); 
      messageData.Append(chars); 

      if (messageData.ToString().IndexOf("<EOF>") != -1) 
      { 
       break; 
      } 
     } while (bytes != 0); 

     Console.Write(messageData.ToString()); 
     Console.ReadKey(); 

EDIT

Đoạn mã trên sẽ đơn giản kết nối qua SSL cho Gmail và sản lượng nội dung của một thông báo test. Để đăng nhập vào một tài khoản gmail và lệnh vấn đề mà bạn sẽ cần phải làm một cái gì đó dọc theo dòng:

 TcpClient mail = new TcpClient(); 
     SslStream sslStream; 
     int bytes = -1; 

     mail.Connect("pop.gmail.com", 995); 
     sslStream = new SslStream(mail.GetStream()); 

     sslStream.AuthenticateAsClient("pop.gmail.com"); 

     byte[] buffer = new byte[2048]; 
     // Read the stream to make sure we are connected 
     bytes = sslStream.Read(buffer, 0, buffer.Length); 
     Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes)); 

     //Send the users login details 
     sslStream.Write(Encoding.ASCII.GetBytes("USER USER_EMAIL\r\n")); 
     bytes = sslStream.Read(buffer, 0, buffer.Length); 
     Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes)); 

     //Send the password       
     sslStream.Write(Encoding.ASCII.GetBytes("PASS USER_PASSWORD\r\n")); 
     bytes = sslStream.Read(buffer, 0, buffer.Length); 
     Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes)); 

     // Get the first email 
     sslStream.Write(Encoding.ASCII.GetBytes("RETR 1\r\n")); 
     bytes = sslStream.Read(buffer, 0, buffer.Length); 
     Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes)); 

Rõ ràng, không có tất cả những sự trùng lặp mã :)

+0

Cảm ơn câu trả lời của bạn.Nhưng đăng nhập của người dùng là vấn đề chính của tôi. –

+0

@MdKamruzzamanPallob: Xem cập nhật của tôi – codingbadger

+0

rất rất cảm ơn câu trả lời của bạn. Tôi làm việc tuyệt vời. Hơi có nghĩa là nó sử dụng giao thức pop để truy cập thư. Nhưng tôi muốn truy cập email bằng giao thức imap. Tôi đã thay đổi tên máy chủ và số cổng là "imap.gmail.com" và "993" nhưng nó không hoạt động. Làm thế nào nó có thể được thực hiện? –

2

Bạn có thể quấn NetworkStream được cung cấp bởi TcpClient với số SslStream. Điều này sẽ cung cấp việc xử lý SSL và chứng chỉ cần thiết.

Bạn có thể phải chèn một số mã xử lý để thực hiện gọi lại xác thực chứng chỉ, ví dụ: thông qua ServicePointManager.ServerCertificateValidationCallback.

2

để chỉnh đáp ứng tốt nhất trên đặc biệt để câu hỏi về xác thực IMAP và IMAP, bạn sẽ cần sửa đổi mã một chút để sử dụng các lệnh IMAP như sau. Để gỡ lỗi, bạn có thể thiết lập các điểm ngắt chỉ sau khi strOut được gán để xem các phản hồi của máy chủ.

  pmOffice pmO = new pmOffice(); 
      pmO.GetpmOffice(3, false); 

      TcpClient mail = new TcpClient(); 
      SslStream sslStream; 
      int bytes = -1; 

      mail.Connect("outlook.office365.com", 993); 
      sslStream = new SslStream(mail.GetStream()); 

      sslStream.AuthenticateAsClient("outlook.office365.com"); 

      byte[] buffer = new byte[2048]; 
      // Read the stream to make sure we are connected 
      bytes = sslStream.Read(buffer, 0, buffer.Length); 
      Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes)); 

      //Send the users login details (insert your username & password in the following line 
      sslStream.Write(Encoding.ASCII.GetBytes("$ LOGIN " + pmO.mailUsername + " " + pmO.mailPassword + "\r\n")); 
      bytes = sslStream.Read(buffer, 0, buffer.Length); 
      string strOut = Encoding.ASCII.GetString(buffer, 0, bytes); 

      // Get the status of the inbox (# of messages) 
      sslStream.Write(Encoding.ASCII.GetBytes("$ STATUS INBOX (messages)\r\n")); 
      bytes = sslStream.Read(buffer, 0, buffer.Length); 
      strOut = Encoding.ASCII.GetString(buffer, 0, bytes); 
Các vấn đề liên quan