【问题标题】:Connecting to gmail smtp server using c/c++ (sockets)使用 c/c++(套接字)连接到 gmail smtp 服务器
【发布时间】:2020-11-17 09:44:41
【问题描述】:

我正在尝试使用纯套接字连接到 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 函数。

【问题讨论】:

  • 您的代码看起来不错,您的 read_socket 功能代码在哪里?
  • 你用EHLO发送什么?
  • BUFSIZ 是?
  • @phoenixstudio 已编辑。我将 EHLO 定义为“EHLO localhost” BUFFSIZ 是来自 sdio.h 的宏及其 int 512
  • 您返回的 52-54 是 std::cout &lt;&lt; bytesRecv &lt;&lt; std::endl; 的输出吗?因为第一个响应行的长度大约是这个长度,具体取决于您的公共 IP 地址。

标签: c++ email winsock2


【解决方案1】:

recv 将缓冲区作为参数并返回接收到的字节数,bytesRecv 在您的代码中是接收到的字节数(54 个字节)而不是字节数,要找到谷歌回答的内容,您需要显示 @ 987654323@

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-23
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 2018-02-07
      • 2015-06-18
      • 2013-03-03
      相关资源
      最近更新 更多