发送数据后,SMTP客户端挂起



我想使用C 来构建STMP客户端。在使用Data Command后,我设法实现了初始连接 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("%sn",this->buffer);
    }

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

这是全班的要点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)

感谢您帮助我

data命令期望整个邮件消息,如下所示。write_command()通过行发送消息,并期望每行之后响应。由于服务器一旦邮件消息完成(在空线和点之后)返回响应,因此它在第一个消息行之后保持悬挂模式。此代码段可能有助于您的情况。

顺便说一句,您应该在邮件标头和车身之间放置一个空线,我想这是在主题行之后。另外,可能会遇到服务器拒绝没有从和标题的消息。

最新更新