我试图用c语言发送电子邮件,但在握手、确认消息和打印消息发送后,它不会将邮件发送到我的收件箱。我的整个代码都成功执行了。你能帮忙吗,谢谢。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define BUFFEr_SIZE 4096
void error(char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[BUFFEr_SIZE];
if (argc < 3) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
n = read(sockfd,buffer,BUFFEr_SIZE-1);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
bzero(buffer,BUFFEr_SIZE);
/*------------------------------*/
printf("\nDONE\n");
printf("EHLO");
strcpy(buffer,"ehlo smtp.gmail.com\n");
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,BUFFEr_SIZE);
n = read(sockfd,buffer,BUFFEr_SIZE-1);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
/*------------------------------*/
/*------------------------------*/
printf("\nDONE EHLO\n");
printf("AUTH");
strcpy(buffer,"AUTH LOGIN\n");
n = write(sockfd,buffer,strlen(buffer)+1);
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,BUFFEr_SIZE);
n = read(sockfd,buffer,BUFFEr_SIZE-1);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
/*------------------------------*/
/*------------------------------*/
printf("\nDONE AUTH\n");
printf("AUTH UID");
strcpy(buffer,"xxxx@gmail.com");
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,BUFFEr_SIZE);
n = read(sockfd,buffer,BUFFEr_SIZE-1);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
/*------------------------------*/
/*------------------------------*/
printf("\nDONE UID\n");
printf("AUTH PWD");
strcpy(buffer,"xxxxxx");
n = write(sockfd,buffer,strlen(buffer)+1);
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,BUFFEr_SIZE);
n = read(sockfd,buffer,BUFFEr_SIZE-1);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
/*------------------------------*/
/*------------------------------*/
printf("MAIL FROM");
strcpy(buffer,"MAIL FROM: xxxxx@gmail.com");
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,BUFFEr_SIZE);
n = read(sockfd,buffer,BUFFEr_SIZE-1);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
/*------------------------------*/
/*------------------------------*/
printf("MAIL TO");
strcpy(buffer,"RCPT TO: aaaaa@gmail.com");
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,BUFFEr_SIZE);
n = read(sockfd,buffer,BUFFEr_SIZE-1);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
/*------------------------------*/
/*------------------------------*/
printf("DONE MAILTO\n");
printf("DATA");
strcpy(buffer,"DATA\r\n");
n = write(sockfd,buffer,strlen(buffer));
strcpy(buffer,"Subject: test\r\n");
n = write(sockfd,buffer,strlen(buffer));
strcpy(buffer,"SMTP MAIL TOOL TEST WORKS!!!\r\n");
n = write(sockfd,buffer,strlen(buffer));
strcpy(buffer,"\n\n");
n = write(sockfd,buffer,strlen(buffer));
strcpy(buffer,".\n");
n = write(sockfd,buffer,strlen(buffer));
/*------------------------------*/
/*------------------------------*/
printf("SON DONE");
strcpy(buffer,"quit\n");
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,BUFFEr_SIZE);
n = read(sockfd,buffer,BUFFEr_SIZE-1);
if (n < 0)
error("ERROR reading from socket");
puts(buffer);
/*------------------------------*/
return 0;
}输出如下:
220 smtp.gmail.com ESMTP bh6sm124854736wjb.0 - gsmtp
DONE EHLO250-smtp.gmail.com为您服务,85.98.184.204
250型- 35882577
250-8位
250-STARTTLS
250-增强统计代码
250-流水线
250-分块
250 SMTPUTF8
违反EHLO AUTH451 4.5.0 SMTP协议,参见RFC2821bh6sm124854736wjb.0- gsmtp
完成身份验证
身份验证UID
完成UID
身份验证密码
邮件发件人
邮件发送到
已完成邮件发送
DATASON完成
发布于 2016-01-12 23:31:09
发送AUTH LOGIN命令后,SMTP服务器返回451 4.5.0 SMTP protocol violation, see RFC 2821。看看RFC 2181,这个命令并不存在。
此命令是SMTP的扩展,此邮件服务器不支持此扩展。如果您删除身份验证命令,它应该可以工作。
此外,在继续测试时,一定要查看程序的输出,以确保服务器不会再返回任何错误。如果是这样,请检查标准,了解为什么会出现这些错误。
发布于 2016-01-12 22:24:57
您需要将地址发送为:
MAIL FROM:<userx@y.foo.org>
RCPT TO:<userc@d.bar.org>发布于 2016-01-13 07:03:23
违反协议只是因为第二行中的+1:
strcpy(buffer,"AUTH LOGIN\n");
n = write(sockfd,buffer,strlen(buffer)+1);您正在发送google "AUTH LOGIN\n \0“-\0不应该在那里。
你仍然会发现google不允许你通过普通的未加密的SMTP连接发送你的密码(即没有STARTTLS,而实际上是通过TLS连接),但那是另一回事了。
https://stackoverflow.com/questions/34745306
复制相似问题