C ++ SMTP客户端连接到服务器后无响应

问题描述 投票:-1回答:1

我正在尝试创建一个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;
c++ smtp winsock
1个回答
0
投票

端口465使用隐式 TLS,这要求客户端在连接后立即协商TLS会话,然后才能读取服务器的(加密的)欢迎消息。您没有收到任何信息,因为服务器尚未发送任何信息。它正在等待您发送TLS握手,您没有这样做。

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

© www.soinside.com 2019 - 2024. All rights reserved.