⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mailtest.c

📁 linux下发送mail源代码
💻 C
字号:
/*  funtion : send email  author  : liyanan  data    : 2006-04-08*/#include <stdlib.h>#include <stdio.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h> #include <fcntl.h>#include <sys/ioctl.h>#include <netinet/in.h>#include <sys/socket.h>#include <linux/if_ether.h>#include <net/if.h>#include <errno.h>#define   ETH_NAME  "eth0"#define SD_BOTH 2#define SOCKET_ERROR -1#define INVALID_SOCKET -1int s;struct sockaddr_in remote;unsigned short port; int rt;char *send_data;char *recv_data;char *hostname;struct hostent *ht;char *usersrc,*userdes,*passsrc,*passdes;char *From,*To,*Date,*Subject;char *Filename;int GetLocalAddress(char *szIPAddr){  int   sock;     struct   sockaddr_in   sin;     struct   sockaddr   sa;     struct   ifreq   ifr;                                sock = socket(AF_INET,   SOCK_DGRAM,   0);     if(sock == -1)     {      printf("Error:get local IP socket fail!\n");       return  -1;                               }                     strncpy(ifr.ifr_name, ETH_NAME,IFNAMSIZ);     ifr.ifr_name[IFNAMSIZ - 1] = 0;                     if(ioctl(sock, SIOCGIFADDR, &ifr) < 0)     {   printf("Error:get local IP ioctl fail!");       return  -1;     }     memcpy(&sin,   &ifr.ifr_addr,   sizeof(sin));  sprintf(szIPAddr,"%s",inet_ntoa(sin.sin_addr));     return  0; }int GetLocalMac(unsigned char *vmac){    int sock; int i; struct sockaddr_in sin; struct sockaddr sa; struct ifreq ifr; unsigned char mac[6];   sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) {  perror("socket");  return -1;   }  strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ); ifr.ifr_name[IFNAMSIZ - 1] = 0;  memset(mac, 0, sizeof(mac)); if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0) {  perror("ioctl");  return -1; } memcpy(&sa, &ifr.ifr_addr, sizeof(sin)); memcpy(mac,sa.sa_data,6); sprintf(vmac,"%.2X:%.2X:%.2X:%.2X:%0.2X:%0.2X\n",mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return 0;}void Destory(){ if(s!=INVALID_SOCKET) {  shutdown(s,SD_BOTH);  close(s);  //WSACleanup(); } free(From); free(To); free(Date); free(Subject); free(Filename); free(recv_data); free(userdes); free(passdes);}void Base64_Code(unsigned char *chsrc, unsigned char *chdes){ char chadd[3]; unsigned char temp[4],t;  int len,i; len = strlen((char *)chsrc);    while(len>=3) {  temp[0] = (*chsrc)>>2;  t       = (*chsrc & 0x03)<<4;  temp[1] = (*(chsrc+1)>>4)|t;  t       = ((*(chsrc+1)<<2) & 0x3f);  temp[2] = (*(chsrc+2)>>6)|t;  temp[3] = (*(chsrc+2) & 0x3f);  for(i=0;i<4;i++)  {   if(temp[i]>=0 && temp[i]<=25)     *(chdes+i) = temp[i]+65;   if(temp[i]>=26 && temp[i]<=51)     *(chdes+i) = temp[i]+71;   if(temp[i]>=52 && temp[i]<=61)     *(chdes+i) = temp[i]-4;   if(temp[i]==62)     *(chdes+i) = 43;   if(temp[i]==63)     *(chdes+i) = 47;  }          len -= 3;  chsrc += 3;  chdes += 4; }    if(len!=0) {  for(i=0;i<3;i++)   chadd[i] = 0;        memcpy(chadd,chsrc,len);  temp[0] = chadd[0]>>2;  t       = (chadd[0] & 0x03)<<4;  temp[1] = (chadd[1]>>4)|t;  t       = ((chadd[1]<<2) & 0x3f);  temp[2] = (chadd[2]>>6)|t;  temp[3] = chadd[2] & 0x3f;  for(i=0;i<4;i++)  {   if(temp[i]>=0 && temp[i]<=25 && (i==0 || i==1)) *(chdes+i) = temp[i]+65;   else  *(chdes+i) = 61;   if(temp[i]>=26 && temp[i]<=51) *(chdes+i) = temp[i]+71;   else if(temp[i]>=52 && temp[i]<=61) *(chdes+i) = temp[i]-4;   else if(temp[i]==62) *(chdes+i) = 43;   else if(temp[i]==63) *(chdes+i) = 47;  }  chdes += 4;  *chdes = '\0';  return; } *chdes = '\0';}void Base64_Decode(unsigned char *chsrc, unsigned char *chdes){ unsigned char temp[4],t; int len,i; len = strlen((char *)chdes); while(len>=4) {  for(i=0;i<4;i++)  {   if(*(chdes+i)>=65 && *(chdes+i)<=90)      temp[i] = *(chdes+i)-65;   if(*(chdes+i)>=97 && *(chdes+i)<=122)     temp[i] = *(chdes+i)-71;   if(*(chdes+i)>=48 && *(chdes+i)<=57)     temp[i] = *(chdes+i)+4;   if(*(chdes+i)==43)     temp[i] = 62;   if(*(chdes+i)==47)     temp[i] = 63;   if(*(chdes+i)==61)    temp[i] = 0;  }  t = (temp[1]>>4)&0x03;        *chsrc = (temp[0]<<2)|t;  t = (temp[2]>>2)&0x0f;  *(chsrc+1) = (temp[1]<<4)|t;  t = temp[3];  *(chsrc+2) = (temp[2]<<6)|t;  chsrc += 3;  chdes += 4;  len   -= 4; } chsrc -= 3; for(i=0;i<3;i++) {  if(*(chsrc+i) == 0)  {   *(chsrc+i) = '\0';   break;  } } if(i>=2)  *(chsrc+3) = '\0';}int GetResponse(){ rt = recv(s,recv_data,1024,0); if(rt == SOCKET_ERROR) {  printf("receive nothing\n");  return -1; } recv_data[rt]='\0'; if(*recv_data == '5') {  printf("the order is not support smtp host\n ");  return -1; } printf("%s\n",recv_data); return 1;}int CreateSocket(){ long t = 5000; s = socket(AF_INET,SOCK_STREAM,0); if(s == SOCKET_ERROR) {  printf("socket init error\n");  shutdown(s,SD_BOTH);  close(s);  return -1; } return 1;}int ConnectHost(const char *hostname){ //printf("socket id :%d\n",s); if(hostname == NULL)  return -1; memset(&remote,0,sizeof(struct sockaddr)); remote.sin_family = AF_INET; remote.sin_port   = htons(port); remote.sin_addr.s_addr = inet_addr(hostname); rt = connect(s,(struct sockaddr *)&remote,sizeof(struct sockaddr)); if(rt == SOCKET_ERROR) {  printf("connect error\n");  shutdown(s,SD_BOTH);  close(s);  return -1; }     //printf("connect the host ok :%d\n",port); if(!GetResponse())  return -1; return 1;}int LogIn(char *username,char *password){ char ch[100]; if(username == NULL || password == NULL)  return -1; usersrc = username; passsrc = password; Base64_Code((unsigned char *)usersrc,(unsigned char *)userdes); Base64_Code((unsigned char *)passsrc,(unsigned char *)passdes); send_data = "EHLO Localhost\r\n";  rt = send(s,send_data,strlen(send_data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1;            send_data = "AUTH LOGIN\r\n"; rt = send(s,send_data,strlen(send_data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1;         sprintf(ch,"%s\r\n",userdes); rt = send(s,(char *)ch,strlen(ch),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1;  sprintf(ch,"%s\r\n",passdes); rt = send(s,(char *)ch,strlen(ch),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1; return 1;}int SendMail(const char *from,const char *to,const char *date,const char *subject,const char *data){ if(from == NULL || to == NULL || date == NULL || subject == NULL) {  shutdown(s,SD_BOTH);  close(s);  return -1; } sprintf(From,"MAIL FROM: <%s>\r\n",from); rt = send(s,From,strlen(From),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1; sprintf(To,"RCPT TO: <%s>\r\n",to); rt = send(s,To,strlen(To),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1; send_data = "DATA\r\n"; rt = send(s,send_data,strlen(send_data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1; sprintf(From,"From: %s\r\n",from); rt = send(s,From,strlen(From),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; }     sprintf(To,"To: %s\r\n",to); rt = send(s,To,strlen(To),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; }  sprintf(Date,"Date: %s\r\n",date); rt = send(s,Date,strlen(Date),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } sprintf(Subject,"Subject: %s\r\n",subject); rt = send(s,Subject,strlen(Subject),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } send_data = "\r\n"; rt = send(s,send_data,strlen(send_data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } rt = send(s,(char *)data,strlen(data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } send_data = "\r\n"; rt = send(s,send_data,strlen(send_data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } return 1;}int End(){ send_data = "\r\n"; rt = send(s,send_data,strlen(send_data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } send_data = "\r\n.\r\n"; rt = send(s,send_data,strlen(send_data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1;        send_data = "QUIT\r\n"; rt = send(s,send_data,strlen(send_data),0); if(rt == SOCKET_ERROR) {  shutdown(s,SD_BOTH);  close(s);  return -1; } if(!GetResponse())  return -1; return 1;}int main(int argc,char *argv[]){ char *host      = "202.108.252.140";  //smtp.tom.com char *username  = "****"; char *password  = "****"; char *m_From    = "****@****"; char *m_To      = "****@****"; char *m_date    = "2006-4-7,22:27"; char *m_Subject = "the ip and mac address for ddns"; char *m_data    = (char*)malloc(100);        char *ip = (char*)malloc(20);        if(argc < 1)        {            printf("agrv error\n");            free(m_data);            free(ip);        }        if(GetLocalAddress(ip) == -1) {  printf("get lcoal ip fail\n");  free(ip);  return -1; } char *vmac = (char*)malloc(20);    if(GetLocalMac(vmac) == -1) {  printf("get local mac fail\n");  free(ip);  free(vmac);  return -1; } sprintf(m_data,"The IP Address :%s\nThe Mac Address:%s",ip,vmac); //printf("%s\n",m_data); From      = (char*)malloc(40);//new char[40]; To        = (char*)malloc(40);//new char[40]; Date      = (char*)malloc(40);//new char[40]; Subject   = (char*)malloc(40);//new char[40]; Filename  = (char*)malloc(100); recv_data = (char*)malloc(512); userdes   = (char*)malloc(40); passdes   = (char*)malloc(40); port = 25; s    = INVALID_SOCKET;  if(!CreateSocket()) {  printf("socket create error\n");  return -1; } //printf("create the scoket\n"); if(!ConnectHost(host)) {  printf("can not connect the host\n");  return -1; } //printf("connect the smtp host\n"); if(!LogIn(username,password)) {  printf("login error\n");  return -1; } //printf("login\n"); if(!SendMail(m_From,m_To,m_date,m_Subject,m_data)) {  printf("send mail error\n");  return -1; } //printf("send mail \n"); if(!End()) {  printf("End error\n");  return -1; } //printf("send over\n"); Destory(); return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -