2017-12-11 10 views
0

私は、学習目的でC++を使用してstmpクライアントを構築したいと考えています。 初期接続+認証ログインを実装した後、データコマンドを使用した後にメッセージを送信することになりました。ここで データを送信した後にsmtpクライアントがハングする

は、サーバー出力のフルクラスここで https://gist.github.com/xhallix/7f2d87a8b2eab4953d161059c2482b37

との主旨

 void sendmail() 
    { 

      write_command("MAIL FROM: <[email protected]>"); 
      write_command("RCPT TO: <[email protected]>"); 
      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を使用している私のコードされています

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

DATAコマンドでは、hereのようにメールメッセージ全体が必要です。 write_command()は、行ごとにメッセージを送信し、各行の後に応答を期待します。メール・メッセージが終了すると(空の行とドットの後に)サーバーは応答を返すので、最初のメッセージ行の後にハング・モードにとどまります。このcode snippetはあなたの場合に役立ちます。

ところで、私は、件名の後にあると思われるメールのヘッダーと本文の間に空白行を入れる必要があります。また、サーバーがFromヘッダーとToヘッダーのないメッセージを拒否することもあります。

+0

ありがとう、私はこれを変更しようとします – abdoe

+0

素晴らしいです!ありがとうございました! – abdoe

関連する問題