我创建了一个小程序来在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/

10-11 23:01
查看更多