📄 嵌入式linux发送电子邮件程序.txt
字号:
/*
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 -1
int 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;
}
/*
int main(int argc,char *argv[])
{
//char *host = "smtp.tom.com";
//char *username = "hitliyanan";
//char *password = "830603";
//char *m_From = "hitliyanan@tom.com";
//char *m_To = "gudulyn@yahoo.com.cn";
//char *m_date = "2006-4-7,22:27";
//char *m_Subject = "hello world";
//char *m_data = "It is a test";
//void Init();
if(argc < 9)
{
printf("Usage Error\n");
return;
}
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;
}
if(!ConnectHost(argv[1]))
{
printf("can not connect the host\n");
return -1;
}
if(!LogIn(argv[2],argv[3]))
{
printf("login error\n");
return -1;
}
if(!SendMail(argv[4],argv[5],argv[6],argv[7],argv[8]))
{
printf("send mail error\n");
return -1;
}
if(!End())
{
printf("End error\n");
return -1;
}
Destory(); return 0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -