C++ SMTP 客户端连接到服务器后无响应
C++ SMTP client no response after connecting to server
我正在尝试创建一个 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;
端口 465 使用隐式 TLS,这要求客户端在连接后立即协商 TLS 会话,然后才能读取服务器的(加密的)欢迎消息。你没有得到任何东西,因为服务器还没有发送任何东西。它正在等待您发送 TLS 握手,而您没有这样做。
还有显式 TLS 的概念,在端口 25 和 587 上,客户端必须先读取(未加密的)欢迎消息,然后发送 STARTTLS
协商 TLS 会话之前的命令。
我正在尝试创建一个 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;
端口 465 使用隐式 TLS,这要求客户端在连接后立即协商 TLS 会话,然后才能读取服务器的(加密的)欢迎消息。你没有得到任何东西,因为服务器还没有发送任何东西。它正在等待您发送 TLS 握手,而您没有这样做。
还有显式 TLS 的概念,在端口 25 和 587 上,客户端必须先读取(未加密的)欢迎消息,然后发送 STARTTLS
协商 TLS 会话之前的命令。