C++ C++;SMTP客户端在连接到服务器后没有响应

C++ C++;SMTP客户端在连接到服务器后没有响应,c++,smtp,winsock,C++,Smtp,Winsock,我正在尝试创建一个SMTP客户端来发送电子邮件,但无法将其连接到SMTP.gmail.com。 连接本身似乎没有失败,但是recv阻塞,没有发出任何欢迎消息。当我使用Telnet时,工作正常 ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; iResu

我正在尝试创建一个SMTP客户端来发送电子邮件,但无法将其连接到SMTP.gmail.com。 连接本身似乎没有失败,但是recv阻塞,没有发出任何欢迎消息。当我使用Telnet时,工作正常

ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    iResult = getaddrinfo("smtp.gmail.com", "465", &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed with error: %d\n", iResult);
        WSACleanup();
        return 1;
    }

    for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {

        ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
            ptr->ai_protocol);
        if (ConnectSocket == INVALID_SOCKET) {
            printf("socket failed with error: %ld\n", WSAGetLastError());
            WSACleanup();
            return 1;
        }

        iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
        if (iResult == SOCKET_ERROR) {
            closesocket(ConnectSocket);
            ConnectSocket = INVALID_SOCKET;
            continue;
        }
        break;
    }

    freeaddrinfo(result);

    if (ConnectSocket == INVALID_SOCKET) {
        printf("Unable to connect to server!\n");
        WSACleanup();
        return 1;
    }


    iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);

    std::cout << recvbuf << std::endl;
ZeroMemory(&hints,sizeof(hints));
hits.ai_family=AF_INET;
hits.ai_socktype=SOCK_流;
hits.ai_protocol=IPPROTO_TCP;
iResult=getaddrinfo(“smtp.gmail.com”、“465”、&hights和&result);
如果(iResult!=0){
printf(“getaddrinfo失败,错误:%d\n”,iResult);
WSACleanup();
返回1;
}
for(ptr=result;ptr!=NULL;ptr=ptr->ai_next){
连接插座=插座(ptr->ai_系列,ptr->ai_插座类型,
ptr->ai_协议);
if(ConnectSocket==无效的_套接字){
printf(“套接字失败,错误:%ld\n”,WSAGetLastError());
WSACleanup();
返回1;
}
iResult=connect(ConnectSocket,ptr->ai_addr,(int)ptr->ai_addrlen);
if(iResult==SOCKET\u错误){
闭合插座(连接插座);
ConnectSocket=无效的_套接字;
继续;
}
打破
}
freeaddrinfo(结果);
if(ConnectSocket==无效的_套接字){
printf(“无法连接到服务器!\n”);
WSACleanup();
返回1;
}
iResult=recv(ConnectSocket,recvbuf,recvbuflen,0);
std::cout端口465使用隐式TLS,这要求客户端在连接后立即协商TLS会话,然后才能读取服务器的(加密的)欢迎消息。您没有收到任何内容,因为服务器尚未发送任何内容。它正在等待您发送TLS握手,而您没有这样做


在端口25和587上还有显式TLS的概念,客户端必须先阅读(未加密)欢迎消息,然后在协商TLS会话之前发送
STARTTLS
命令。

请发布一个,或者至少是整个函数。您希望如何获得使用TLS加密的欢迎消息,由于您是通过TLS端口465连接到SMTP,而没有使用任何TLS库,从外观上看,在显示的代码中?你能解释一下你是如何让telnet(据我所知,它不支持任何加密)在连接到端口465后验证服务器的SSL证书,然后解密加密的通信量的吗?端口25工作。。。在获得TLS之前,我并不希望能够使用465端口发送邮件,但我确实希望收到一条欢迎消息。我以前的代码不适用于任何端口,因此这篇文章,但在为发布和更改某些内容而对其进行了一些清理之后,它似乎可以工作。Telnet也没有回复端口465,很可能是使用了端口25。端口465使用TLS。连接客户端将发送第一个加密数据包,即“ClientHello”数据包。这就是为什么你会得到bupkis。你可以通过谷歌搜索找到更多信息。