• PUDN用户
    了解作者
  • Unix_Linux
    开发工具
  • 3KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 5
    下载次数
  • 2014-09-16 18:06
    上传日期
在Linux下实现网络POP3邮件的发送,接收,下载和统计等功能,在Linux上编译可以完美运行。
mail.zip
  • mail.c
    11.3KB
内容介绍
#include<stdio.h> #include<sys/socket.h> #include<arpa/inet.h rel='nofollow' onclick='return false;'> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<netdb.h> #include<termios.h> #include<errno.h> #define SIZE 9999 #define PASS_MAXLEN 125 #define BACKSPACE 8 #define MAX 512 #define MAXDATA 5000 #define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL) int sock; char buffer4[SIZE]; char buffer5[SIZE]; char buffer6[SIZE]; char buffer7[SIZE]; char statbuffer[SIZE]; char retrbuffer[SIZE]; char savebuffer[SIZE]; int list(); //邮件列表函数 int stat(); //邮件状态函数 int retr(); //查看邮件内容函数 int save(); //下载邮件函数 int sear(); //搜索关键字函数 int quit(); //退出函数 int judge=1,pass=1; char *pop3name; char User[SIZE]; char Pass[SIZE]; char input1[SIZE]; char input2[SIZE]; char domainbuffer[SIZE]; char namebuffer[SIZE]; char passbuffer[SIZE]; char choice; struct sockaddr_in pop3addr; struct hostent *pop3; int sock, numbytes; struct sockaddr_in it_addr; char destination[MAX]={'\0'}; struct hostent * aimpop3; main() { printf("Please input the pop3 domain:\n"); printf(">>"); gets(destination); //输入POP3域名,例如pop.163.com if((aimpop3=gethostbyname(destination))==NULL) //gethostbyname()返回对应于给定主机名的包含主机名和地址信息的hostent指针 { herror("gethostbyname"); exit(1); } if((sock=socket(AF_INET,SOCK_STREAM,0))==-1) //创建套接字 { perror("socket"); exit(1); } it_addr.sin_family=AF_INET; it_addr.sin_port=htons(110); it_addr.sin_addr=*((struct in_addr*) aimpop3->h_addr); memset(&(it_addr.sin_zero),'\0',8); if(connect(sock,(struct sockaddr *)&it_addr,sizeof(struct sockaddr))<0) //连接服务器 { perror("connect"); exit(1); } recv(sock,domainbuffer,SIZE,0); //接受域名返回信息 if((domainbuffer[0]=='+')&&(domainbuffer[1]=='O')&&(domainbuffer[2]=='K')){ //如果域名正确,服务器会返回+OK信息 printf("Please input username:\n"); printf(">>"); } else printf("ACK error\n"); while(pass){ memset(User,'\0',strlen(User)); char User[SIZE]="USER "; scanf("%s",input1); //输入用户名 getchar(); strcat(User,input1); strcat(User,"\r\n"); send(sock,User,strlen(User),0); recv(sock,namebuffer,SIZE,0); //接收用户名的反馈信息 ////////////////////////////////////// 取消密码回显 int set_disp_mode(int fd,int option){ int err; struct termios term; if(tcgetattr(fd,&term)==-1){ perror("Cannot get the attribution of the terminal"); return 1; } if(option) term.c_lflag|=ECHOFLAGS; else term.c_lflag &=~ECHOFLAGS; err=tcsetattr(fd,TCSAFLUSH,&term); if(err==-1 && err==EINTR){ perror("Cannot set the attribution of the terminal"); return 1; } return 0; } /////////////////////////////////////// if((namebuffer[0]=='+')&&(namebuffer[1]=='O')&&(namebuffer[2]=='K')){ set_disp_mode(STDIN_FILENO,0); printf("Please input password:\n"); printf(">>"); } else printf("Username error\n"); scanf("%s",input2); //输入密码 char c; char passwd[25]; int i = 0; do{ c=getchar(); if (c != '\n'|c!='\r') passwd[i++] = c; }while(c != '\n' && c !='\r' && i < (strlen(passwd) - 1)); passwd[i-1]='\0'; set_disp_mode(STDIN_FILENO,1); printf("\n"); memset(Pass,'\0',strlen(Pass)); char Pass[SIZE]="PASS "; strcat(Pass,input2); strcat(Pass,"\r\n"); printf("%s\n",Pass); if(send(sock,Pass,strlen(Pass),0)!=strlen(Pass)) printf("Password sending error\n"); if(recv(sock,passbuffer,SIZE,0)!=strlen(passbuffer)){ //密码是否正确的反馈信息 printf("PASS error\n"); printf("Input password again(Ctrl+C to quit)\n"); printf(">>"); judge=0; } else{ if((passbuffer[0]=='+')&&(passbuffer[1]=='O')&&(passbuffer[2]=='K')){ //密码正确,在passbuffer中返回+OK printf("%s\n",passbuffer); system("clear"); pass=0; } else{ printf("USERNAME OR PASS error\n"); printf("Input username again(Ctrl+C to quit)\n"); printf(">>"); } } } //while() ends while(judge) { printf("***********************************************************************\n"); printf("1.Get a list of messages and sizes\n"); printf("2.Get mail status\n"); printf("3.Display mail in detail\n"); printf("4.Download the mail and delete in the remote service\n"); printf("5.Search text in all mails\n"); printf("6.Quit\n"); printf("***********************************************************************\n"); printf("Please choose number:\n"); printf(">>"); scanf("%c",&choice); getchar(); switch(choice) { case '1': judge=list();break; case '2': judge=stat();break; case '3': judge=retr();break; case '4': judge=save();break; case '5': judge=sear();break; case '6': judge=quit();break; default: printf("Error\n"); } } //while() end } //main() end int list() { int choice1; char *command="LIST\r\n"; send(sock,command,strlen(command),0); //向服务器发送LIST指令 recv(sock,buffer4,SIZE,0); if((buffer4[0]=='+')&&(buffer4[1]=='O')&&(buffer4[2]=='K')) //读取LIST的返回信息,如果+OK表示指令正确 { printf("%s\n",buffer4); printf("Press 1 to return to main interface\n"); printf("Press 2 to return to quit\n"); printf(">>"); scanf("%d",&choice1); getchar(); system("clear"); if(choice1==1) return(1); //输入1时,list函数向主函数返回1 else return(0); } else{ printf("LIST failed\n"); return(0); } } int stat() { int choice2; if(send(sock,"STAT\r\n",6,0)!=6) printf("STAT failed\n"); if(recv(sock,buffer5,SIZE,0)!=strlen(buffer5)) printf("STAT failed\n"); else{ if((buffer5[0]=='+')&&(buffer5[1]=='O')&&(buffer5[2]=='K')) { printf("%s\n",buffer5); printf("Press 1 to return to main interface\n"); printf("Press 2 to return to quit\n"); printf(">>"); scanf("%d",&choice2); getchar(); system("clear"); if(choice2==1) return(1); else return(0); } else{ printf("STAT failed\n"); return(0); } } // outside else ends } int retr() { int iteration=1; int choice3; char num[SIZE]; char data[99999]; char command[SIZE]="RETR "; printf("Input email number to view in detail\n"); printf(">>"); scanf("%s",num); getchar(); strcat(command,num); strcat(command,"\r\n"); send(sock,command,strlen(command),0); memset(data,'\0',strlen(data)); memset(buffer6,'\0',strlen(buffer6)); while(iteration){ recv(sock,buffer6,SIZE,0); strcat(data,buffer6); int length=strlen(data); if((data[length-1]=='\n')&&(data[length-2]=='\r')&&(data[length-3]=='.')&&(data[length-4]=='\n')&&(data[length-5]=='\r')) { printf("%s",data); printf("Press 1 to return to main interface\n"); printf("Press 2 to return to quit\n"); printf(">>"); scanf("%d",&choice3); getchar(); system("clear"); if(choice3==1) return 1; else return 0; } else printf("%c\n",data[length-3]); memset(buffer6,'\0',strlen(buffer6)); } //while ends } int save() { int choice4; char tmp[MAX],filename[MAX],num[SIZE]; char command1[SIZE]="RETR "; char command2[SIZE]="DELE "; char buffer[MAXDATA]; char data[99999]; int iteration=1; FILE *fp; int len; printf("Please input the ID number: \n")
评论
    相关推荐
    • Linux smtp源代码
      这个是Linux下的smtp协议的源代码喽, 资源描述需要大于20个字符,不支持HTML标签
    • sendEmail for Linux
      sendEmail 基于Linux的使用Perl写的一个发送邮件的小工具,可应用与脚本发送警报。 使用方法 tar -xf sendEmail-v1.56.tar.gz cp -a sendEmail-v1.56/sendEmail /usr/local/bin/ 邮件发送格式: /usr/local/bin/...
    • ASMMS -- Anonymous SMTP Mail Mesg Sender-开源
      ASMMS-匿名SMTP邮件发件人...是一种简单的mta,用C语言编写,用于通过没有身份验证(AUTH)的邮件服务器发送邮件。 它应该可以在几乎所有的POSIX系统上运行,并且仅通过SunOS,Linux和HPUX进行测试。
    • mailoney:SMTP蜜罐
      Mailoney是我写的SMTP Honeypot,只是为了学习Python带来乐趣。 有多种模块或类型(请参见下文)可提供适合您需要的自定义模式。 愉快地接受建议,功能或请求请求。 安装 目前,所有内容都应包含在Linux python环境...
    • linux编程艺术
      linux编程艺术,详细介绍linux操作系统运行机制。
    • Linux SMTP C 库之 libesmtp-1.0.4
      Linux SMTP C 库程序,摘自:http://www.stafford.uklinux.net/libesmtp/index.html
    • linux send mail
      linxu email mail sendmail
    • linuxSMTP实现.rar
      linuxSMTP实现linuxSMTP实现
    • linuxC邮件群发SMTP
      linux C写的邮件群发工具。 亲测可以使用。用公司邮箱向外发了10000封邮件。 smtp群发。
    • NS2example.rar
      在ns2下实现无线传感器网络仿真,多个节点进行网络活动