我创建了一个小程序来在c中发送电子邮件。
我做了3个功能:
Connect:通过使用套接字连接到服务器,
SendAndRecieve:向邮件服务器发送和接收消息,
SendAnEmail:编写将由SendAndRecieve发送的文本。
Connect和SendAndRecieve运行正常。
我的问题是在SendAnEmail中。我不知道如何完成数据步骤。
对于每个命令,我都会收到服务器的答案:250 ******
但是对于数据,它首先返回354,但在最后的句号之后永远不会返回250。我虽然与telnet协议(protocol)相同。
最后的句号= body 的尽头。
但这是行不通的。邮件服务器永不回复。
有人知道告诉服务器我写完主体的解决方案吗?
代码
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:<user@adresse.com\r\n");
//rcpt to
SendAndReceive(sock, "RCPT TO:<user@adress.com>\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服务器用作server_name,并添加包含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: <blablabla@orange.fr>
R: 250 2.1.0 <blablabla@orange.fr> sender ok
S: RCPT TO: <xapx35@gmail.com>
R: 250 2.1.5 <xapx35@gmail.com> 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的最后句号一样。
最佳答案
因此,您只需要在 body 之后的一个周期内发送一条线路。
如果您在DATA
之后等待250,那也是一个错误。您会先获得354,然后在仅句点行之后获得250
RFC 821
关于c - 在C中发送电子邮件,服务器在发送正文后永不回复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54182915/