Smtp客户端在发送数据后挂起

时间:2017-12-11 14:29:34

标签: c++ email smtp smtpclient

我想使用c ++构建一个stmp客户端用于学习目的。 在我设法实现初始连接+ auth登录后,我在使用数据命令后停留在发送消息。

这是我的代码

     void sendmail()
     {

            write_command("MAIL FROM: <foo@bar.de>");
            write_command("RCPT TO: <bar.foo@baz.de>");
            write_command("DATA");
            write_command("Subject: testmail"); // HANGS here after data command
            write_command("BlaBlub");
            write_command(" ");
            write_command(".");
            write_command("QUIT");
     }

    void write_command(std::string command)
    {
        ssize_t n;
        empty_buffer();
        command += '\r';
        command += '\n';
        char command_buffer[255];
        strcpy(command_buffer, command.c_str());
        n = write(sockfd,command_buffer,strlen(command_buffer));
        if (n < 0){
            error("ERROR writing to socket");
        }
        n = read_to_buffer();
        if (n < 0) {
            error("ERROR reading from socket");
        }
        printf("%s\n",this->buffer);
    }

我在端口25上使用smtp.mailtrap.io。

以下是完整课程https://gist.github.com/xhallix/7f2d87a8b2eab4953d161059c2482b37

的要点

这是服务器输出

Starting smpt client 
220 mailtrap.io ESMTP ready

250-mailtrap.io
250-SIZE 5242880
250-PIPELINING
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-AUTH PLAIN LOGIN CRAM-MD5
250 STARTTLS

334 VXNlcm5hbWU6

334 UGFzc3dvcmQ6

235 2.0.0 OK

250 2.1.0 Ok

250 2.1.0 Ok

354 Go ahead
(HANGS HERE)

感谢您帮助我

1 个答案:

答案 0 :(得分:1)

DATA命令需要整个邮件消息,如here所示。 write_command()按行发送消息,并期望在每行之后进行响应。由于服务器在邮件消息完成后返回响应(在空行和点之后),因此在第一条消息行之后它将保持挂起模式。这个code snippet可能会对您的情况有所帮助。

顺便说一下,你应该在邮件标题和正文之间加一个空行,我想这是在主题行之后。此外,服务器可能会拒绝没有From和To标头的邮件。