C#:通过套接字连接到Gmail的SMTP服务器

时间:2017-03-03 12:29:10

标签: c# sockets email smtp

我正在尝试通过C#套接字连接到Gmail的SMTP服务器。我知道有这个目的的类,但我正在学习SMTP协议,我正在尝试实现它的功能。基本上我想要的是能够将SMTP命令发送到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的情况下运行相同的代码,我会得到正常的响应。
  3. 我已经测试了使用命令行发送电子邮件并与openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof连接的完整工作流程,并且它运行良好。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题