使用 c/c++(套接字)连接到 gmail smtp 服务器

Connecting to gmail smtp server using c/c++ (sockets)

我正在尝试使用纯套接字连接到 google smtp 服务器(“smtp.gmail.com”)。 我创建了一个套接字,当我读取数据时连接只给我“54”或“52”或“53”或“54”。

    sockaddr_in service;
    WSADATA wsaData;

    struct hostent* remoteHost;

    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != NO_ERROR) {
        std::cout << 1;
        return EXIT_FAILURE;
    }

    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock == INVALID_SOCKET) {
        WSACleanup;
        return EXIT_FAILURE;
    }

    remoteHost = gethostbyname(SMTP_HOST);

    memset(&service, 0, sizeof(service));
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = *(u_long*)remoteHost->h_addr_list[0];
    service.sin_port = htons(25);


    if (connect(sock, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) {
        WSACleanup;
        return EXIT_FAILURE;
    }

    char senddata[] = "STARTTLS";

    read_socket();
    send(sock, EHLO, strlen(EHLO), 0);
    read_socket();
    send(sock, senddata, strlen(senddata), 0);

    std::cout << 0;
    return EXIT_SUCCESS;

我的read_socket函数

void read_socket() {
    int bytesRecv = recv(sock, recvbuf, BUFSIZ, 0);

    if (bytesRecv == 0 || bytesRecv == WSAECONNRESET) {
        std::cout << "Connection closed"<<std::endl;
        return;
    }

    std::cout << bytesRecv << std::endl;
}

编辑:添加 read_socket 功能。

显然第一个 recv() 只返回第一行响应。

250-smtp.gmail.com at your service, [1.2.3.4](地址不同)

你有两个选择。在阅读之前等待一段时间,以便获得所有响应,或者循环读取(更好的主意),直到收到来自 SMTP 服务器的所有响应。

recv 将缓冲区和 return 接收到的字节数作为参数,代码中的 bytesRecv 是接收到的字节数(54 字节)而不是字节数,以找到 google 回答你需要显示的内容 recvbuf

std::cout << recvbuf << std::endl;