2017-03-03 141 views
-1

我试图通过C#套接字连接到Gmail的SMTP服务器。我知道有这样的目的,但我正在学习SMTP协议,我试图实现它的功能。基本上我想要的是能够发送SMTP命令到Gmail的SMTP服务器并获得响应,但我遇到了问题。我的代码如下所示:C#:通过套接字连接到Gmail的SMTP服务器

static void Main(string[] args) 
{ 
    using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
    { 
     var host = Dns.GetHostEntry("smtp.gmail.com"); 
     var endpoint = new IPEndPoint(host.AddressList[0], 465); 
     socket.Connect(endpoint); 

     Receive(socket); 
     Send(socket, string.Format("HELO {0}\r\n", Dns.GetHostName())); 
     Receive(socket); 
    } 
} 

static void Send(Socket socket, string message) 
{ 
    Console.WriteLine(">> {0}", message); 
    socket.Send(Encoding.UTF8.GetBytes(message)); 
} 

static void Receive(Socket socket) 
{ 
    var buffer = new byte[500]; 
    socket.Receive(buffer); 
    Console.WriteLine("<< {0}", Encoding.UTF8.GetString(buffer, 0, buffer.Length)); 
} 

我的这个问题是:

  1. 这需要很长的时间来完成这个计划,即使它应该是相当快的。
  2. 响应始终为空。但是,如果我尝试运行此端口设置为587的代码,我会得到正常的响应。

我已经测试了使用命令行发送电子邮件并与openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof连接并完美工作的完整工作流程。

有什么我错了吗?如果是这样,可能是什么?任何帮助,将不胜感激。

回答

1

Google的SMTP受TLS保护 - 您必须实施加密,而不是写入裸露的数据。

您可能需要考虑切换到TcpClientSslStream,而不是手动执行Socket

这篇文章有一些指导:C# ssl/tls with socket tcp

相关问题