Я хочу построить клиент stmp, используя c ++ для целей обучения.
После того, как мне удалось реализовать первоначальное подключение + авторизацию, я застрял при отправке сообщения после использования команды data.
Вот мой код
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);
}
Я использую 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()
отправляет сообщение по строкам и ожидает ответа после каждой строки. Поскольку сервер возвращает ответ после завершения почтового сообщения (после пустой строки и точки), он остается в режиме ожидания после первой строки сообщения. это фрагмент кода может быть полезным для вашего случая.
Кстати, вы должны поместить пустую строку между заголовком письма и телом, которое, я думаю, находится после строки темы. Также может случиться, что сервер отклонит сообщение без заголовков «От» и «До».
Других решений пока нет …