Smtp客户端发送数据后挂起
Smtp client hangs after sending data
出于学习目的,我想使用 C++ 构建一个 stmp 客户端。
在我设法实现初始连接 + 身份验证登录后,我在使用数据命令后一直在发送消息。
这是我的代码
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。
这是一个完整的要点 class 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 命令需要完整的邮件消息,如图所示here. The write_command()
sends a message by lines and expects response after each line. Since the server returns the response once the mail message is finished (after empty line and dot), it stays in the hanging mode after the first message line. This code snippet 对您的情况可能有所帮助。
顺便说一句,你应该在邮件 header 和 body 之间放一个空行,我猜这是在主题行之后。此外,服务器可能会拒绝没有 From 和 To headers 的消息。
出于学习目的,我想使用 C++ 构建一个 stmp 客户端。 在我设法实现初始连接 + 身份验证登录后,我在使用数据命令后一直在发送消息。
这是我的代码
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。
这是一个完整的要点 class 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 命令需要完整的邮件消息,如图所示here. The write_command()
sends a message by lines and expects response after each line. Since the server returns the response once the mail message is finished (after empty line and dot), it stays in the hanging mode after the first message line. This code snippet 对您的情况可能有所帮助。
顺便说一句,你应该在邮件 header 和 body 之间放一个空行,我猜这是在主题行之后。此外,服务器可能会拒绝没有 From 和 To headers 的消息。