c - 在c中发送电子邮件,服务器在我发送正文后从不回复
问题描述
我创建了一个小程序来用 c 发送电子邮件。我做了 3 个功能: Connect:使用套接字连接到服务器,SendAndRecieve:向邮件服务器发送和接收消息,SendAnEmail:编写将由 SendAndRecieve 发送的文本。
Connect 和 SendAndRecieve 运行良好。我的问题出在 SendAnEmail 中。我不知道如何完成数据步骤。
对于每个命令,我都会收到服务器的答案:250 ****** 但是对于数据一,它在第一个 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:<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,为 server_name 使用真正的 smtp 服务器,并添加一个包含 Winsock2.h 的库
指令:
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 时,我希望能够这样做:
就像它在这个网站上的解释一样。
所以有人知道我写完正文该怎么说吗?就像 telnet 的最后一个句号。
解决方案
RFC 821 说
该过程的第三步是 DATA 命令。
DATA <CRLF> If accepted, the receiver-SMTP returns a 354 Intermediate reply and considers all succeeding lines to be the message text. When the end of text is received and stored the SMTP-receiver sends a 250 OK reply. Since the mail data is sent on the transmission channel the end of the mail data must be indicated so that the command and reply dialog can be resumed. SMTP indicates the end of the mail data by sending a line containing only a period. A transparency procedure is used to prevent this from interfering with the user's text (see Section 4.5.2).
所以你需要在你的身体之后发送一条只有一个句号的行。
如果您在等待 250 之后DATA
,那也是一个错误。你首先得到 354,然后是 250 在句号之后的唯一行
推荐阅读
- windows - 创建 Windows AMI 时的部分 sysprep
- configure - configure GnuTLS - libnettle 3.4.1 was not found - OS X Lion
- sql - 使用 Teradata SQLquery 限制结果
- ios - 如何在 SwiftUI 中限制拖动距离
- sql - oracle执行中过滤谓词中的SYS_AUDIT是什么
- html - 使用 MSO 样式前缀格式化 word 页面
- c++ - 如何从 C++ 中的实例解析模板类型
- javascript - Problem with thumbnail images in gatsby.js
- c++ - Is it a bug of C++ gcc HEAD 10.0.0 20190 relative to friend functions
- node.js - 外部 Web 服务将用户重定向并将数据发布到我的回调 URL。如何在 Express/Next.js 应用程序中将发布的数据呈现给用户?