我已经创建了一个用C语言发送电子邮件的小程序。
我做了3个功能:
连接:使用套接字连接到服务器,
send和cieve:向邮件服务器发送和接收消息,
sendanemail:写下sendanecieve发送的文本。
Connect和Send和Cieve工作正常。
我的问题出在sendanemail上。我不知道如何完成数据步骤。
对于每个命令,我接收服务器的响应:250******
但对于数据1,它在第一个354中回复,但在最后一次完全停止后从不回复250。我认为它和telnet是相同的协议。
最后一次完全停止=车身末端。
但它不起作用。邮件服务器从不回复。
有人知道要告诉服务器我写完了正文的解决方案吗?
代码
SOCKET connexion(char* server_name,unsigned short port)
{
char buf[1024]={0};
int res_l= 0;
int nbrecv;
struct sockaddr_in serverSockAddr;
struct hostent * serverHostEnt;
SOCKET to_server_socket = 0;
serverHostEnt = gethostbyname( server_name );
if ( serverHostEnt == NULL ) {
res_l = h_errno;
return (SOCKET)-1; }
memcpy(&serverSockAddr.sin_addr,serverHostEnt->h_addr, serverHostEnt->h_length );
serverSockAddr.sin_port = htons( port );/
serverSockAddr.sin_family = AF_INET;
/* Create socket */
to_server_socket = socket( AF_INET, SOCK_STREAM, 0 );
/* connexion request*/
if( connect( to_server_socket, ( struct sockaddr * ) &serverSockAddr,sizeof( serverSockAddr ) ) < 0 )
return (SOCKET)-3;
while( !buf[0] ) nbrecv = recv( to_server_socket, buf, 1024, 0 );
printf("Welcome message : %s\n",buf);
return to_server_socket;
}
void SendAndReceive(SOCKET to_server_socket, char * messagesend)
{
char bufreceive[1024];
int size,retVal,nbrecv;
size = (int)strlen( messagesend );
// SEND THE MESSAGE
retVal = send( to_server_socket, messagesend, size, 0 );
printf("Envoye : %s\n",messagesend) ;
// WAIT THE ANSWER
memset(bufreceive,0,1024);
while(!bufreceive[0])
nbrecv = recv( to_server_socket, bufreceive, 1024, 0 );
printf("Recu : %s\n",bufreceive);
}
void SendAnEmail(SOCKET sock)
{
//ehlo
SendAndReceive(sock, "EHLO localhost\r\n");
//mail from
SendAndReceive(sock, "MAIL FROM:
//rcpt to
SendAndReceive(sock, "RCPT TO:\r\n");
/data
SendAndReceive(sock, "DATA\r\n");
//Subject : Subject
//
//Body
//.
SendAndReceive(sock, "Subject : Subject\r\n\r\nBody\r\n.\r\n");
//quit
SendAndReceive(sock, "QUIT\r\n");
}
在主服务器中,必须设置端口=25,使用真正的SMTP服务器作为服务器名,并添加包含winsock2.h的库。
CMD:
Welcome message : 220 mwinf5d05 ME ESMTP server ready
S: EHLO localhost
R: 250-mwinf5d05 hello [10.162.66.36], pleased to meet you
250-HELP
250-AUTH LOGIN PLAIN
250-SIZE 44000000
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 OK
S: MAIL FROM:
R: 250 2.1.0 sender ok
S: RCPT TO:
R: 250 2.1.5 recipient ok
S: DATA
R: 354 enter mail, end with "." on a line by itself
S: Subject: FlashRad
Ceci est un test.
.
我希望自己使用telnet时能够做到:
就像这里面的解释
website
.
有人知道怎么说我写完了尸体吗?
就像最后一站用telnet。
作者分享了用C语言实现SMTP邮件发送过程中遇到的问题,着重于如何在`SendAnEmail`函数中正确标识邮件正文结束,以使邮件服务器能正确响应。通过解析服务器交互,发现可能需要在数据阶段添加特定的终止符,如在telnet中使用的`.`


被折叠的 条评论
为什么被折叠?



