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

📄 smtptest.c

📁 linux发送邮件程序。可发送邮件正文和附件。已经在redhat linux 4通过测试。
💻 C
📖 第 1 页 / 共 3 页
字号:
       return ch - '0' + 52; 
   switch (ch) { 
       case '+': 
           return 62; 
       case '/': 
           return 63; 
       case '=': /* base64 padding */ 
           return 0; 
       default: 
           return 0; 
   } 
}

/**
* @brief base64解码
*
* @param buf   [out]解码结果
* @param text  [in]要解码的串,必须是4的倍数
* @param size  [in]text大小
*
* @return -1出错,>=0解码缓冲区使用长度
**/
int Base64Dec(unsigned char *buf,const unsigned char*text,int size) 
{
   if(size%4)
       return -1;
   unsigned char chunk[4];
   int parsenum=0;

   while(size>0){
       chunk[0] = GetBase64Value(text[0]); 
       chunk[1] = GetBase64Value(text[1]); 
       chunk[2] = GetBase64Value(text[2]); 
       chunk[3] = GetBase64Value(text[3]); 

       *buf++ = (chunk[0] << 2) | (chunk[1] >> 4); 
       *buf++ = (chunk[1] << 4) | (chunk[2] >> 2); 
       *buf++ = (chunk[2] << 6) | (chunk[3]);

       text+=4;
       size-=4;
       parsenum+=3;
   }

   return parsenum;
} 










////////////////////////////////////////////////////////////
// base64.h
//************************************************************************/
// base64编码表
// 
//0 A 17 R 34 i 51 z 
// 1 B 18 S 35 j 52 0 
// 2 C 19 T 36 k 53 1 
// 3 D 20 U 37 l 54 2 
// 4 E 21 V 38 m 55 3 
//5 F 22 W 39 n 56 4 
//6 G 23 X 40 o 57 5 
//7 H 24 Y 41 p 58 6 
//8 I 25 Z 42 q 59 7 
//9 J 26 a 43 r 60 8 
//10 K 27 b 44 s 61 9 
//11 L 28 c 45 t 62 + 
//12 M 29 d 46 u 63 / 
//13 N 30 e 47 v (pad) = 
//14 O 31 f 48 w 
//15 P 32 g 49 x 
//16 Q 33 h 50 y 
//
// base64编码步骤:
// 
//原文:
//
//你好
//C4 E3 BA C3
//11000100 11100011 10111010 11000011
//00110001 00001110 00001110 00111010
//49 14(十进制)
//x O O 6字符
//01111000 01001111 01001111 00110110
//78(十六进制)
//xOO6
//
//解码:
//xOO6
//78 4f 4f 36
//01111000 01001111 01001111 00110110
//49 14 
//00110001 00001110 00001110 00111010 31 0e 0e 3a
//
//11000100 11100011 10111010
//C4 E3 BA
//

#ifndef _BASE64_INCLUDE__H__
#define _BASE64_INCLUDE__H__

// 编码后的长度一般比原文多占1/3的存储空间,请保证base64code有足够的空间
 int Base64Encode(char * base64code, const char * src, int src_len ); 
 int Base64Decode(char * buf, const char * base64code, int src_len);

__inline char GetB64Char(int index)
{
const char szBase64Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
if (index >= 0 && index < 64)
return szBase64Table[index];

return '=';
}

// 从双字中取单字节
#define B0(a) (a & 0xFF)
#define B1(a) (a >> 8 & 0xFF)
#define B2(a) (a >> 16 & 0xFF)
#define B3(a) (a >> 24 & 0xFF)

// 编码后的长度一般比原文多占1/3的存储空间,请保证base64code有足够的空间
 int Base64Encode(char * base64code, const char * src, int src_len) 
{ 
if (src_len == 0)
src_len = strlen(src);

int i=0,j = 0;
int len = 0;
unsigned char* psrc = (unsigned char*)src;
char * p64 = base64code;
for (i = 0; i < src_len - 3; i += 3)
{
unsigned long ulTmp = *(unsigned long*)psrc;
register int b0 = GetB64Char((B0(ulTmp) >> 2) & 0x3F); 
register int b1 = GetB64Char((B0(ulTmp) << 6 >> 2 | B1(ulTmp) >> 4) & 0x3F); 
register int b2 = GetB64Char((B1(ulTmp) << 4 >> 2 | B2(ulTmp) >> 6) & 0x3F); 
register int b3 = GetB64Char((B2(ulTmp) << 2 >> 2) & 0x3F); 
*((unsigned long*)p64) = b0 | b1 << 8 | b2 << 16 | b3 << 24;
len += 4;
p64 += 4; 
psrc += 3;
}

// 处理最后余下的不足3字节的饿数据
if (i < src_len)
{
int rest = src_len - i;
unsigned long ulTmp = 0;
for ( j = 0; j < rest; ++j)
{
*(((unsigned char*)&ulTmp) + j) = *psrc++;
}

p64[0] = GetB64Char((B0(ulTmp) >> 2) & 0x3F); 
p64[1] = GetB64Char((B0(ulTmp) << 6 >> 2 | B1(ulTmp) >> 4) & 0x3F); 
p64[2] = rest > 1 ? GetB64Char((B1(ulTmp) << 4 >> 2 | B2(ulTmp) >> 6) & 0x3F) : '='; 
p64[3] = rest > 2 ? GetB64Char((B2(ulTmp) << 2 >> 2) & 0x3F) : '='; 
p64 += 4; 
len += 4;
}

*p64 = '\0'; 

return len;
}


__inline int GetB64Index(char ch)
{
int index = -1;
if (ch >= 'A' && ch <= 'Z')
{
index = ch - 'A';
}
else if (ch >= 'a' && ch <= 'z')
{
index = ch - 'a' + 26;
}
else if (ch >= '0' && ch <= '9')
{
index = ch - '0' + 52;
}
else if (ch == '+')
{
index = 62;
}
else if (ch == '/')
{
index = 63;
}

return index;
}

// 解码后的长度一般比原文少用占1/4的存储空间,请保证buf有足够的空间
 int Base64Decode(char * buf, const char * base64code, int src_len) 
{ 
if (src_len == 0)
src_len = strlen(base64code);

int i = 0,j =0;
int len = 0;
unsigned char* psrc = (unsigned char*)base64code;
char * pbuf = buf;
for (i = 0; i < src_len - 4; i += 4)
{
unsigned long ulTmp = *(unsigned long*)psrc;

register int b0 = (GetB64Index((char)B0(ulTmp)) << 2 | GetB64Index((char)B1(ulTmp)) << 2 >> 6) & 0xFF;
register int b1 = (GetB64Index((char)B1(ulTmp)) << 4 | GetB64Index((char)B2(ulTmp)) << 2 >> 4) & 0xFF;
register int b2 = (GetB64Index((char)B2(ulTmp)) << 6 | GetB64Index((char)B3(ulTmp)) << 2 >> 2) & 0xFF;

*((unsigned long*)pbuf) = b0 | b1 << 8 | b2 << 16;
psrc += 4; 
pbuf += 3;
len += 3;
}

// 处理最后余下的不足4字节的饿数据
if (i < src_len)
{
int rest = src_len - i;
unsigned long ulTmp = 0;
for ( j = 0; j < rest; ++j)
{
*(((unsigned char*)&ulTmp) + j) = *psrc++;
}

register int b0 = (GetB64Index((char)B0(ulTmp)) << 2 | GetB64Index((char)B1(ulTmp)) << 2 >> 6) & 0xFF;
*pbuf++ = b0;
len ++;

if ('=' != B1(ulTmp) && '=' != B2(ulTmp))
{
register int b1 = (GetB64Index((char)B1(ulTmp)) << 4 | GetB64Index((char)B2(ulTmp)) << 2 >> 4) & 0xFF;
*pbuf++ = b1;
len ++;
}

if ('=' != B2(ulTmp) && '=' != B3(ulTmp))
{
register int b2 = (GetB64Index((char)B2(ulTmp)) << 6 | GetB64Index((char)B3(ulTmp)) << 2 >> 2) & 0xFF;
*pbuf++ = b2;
len ++;
}

}

*pbuf = '\0'; 

return len;
} 

#endif // #ifndef _BASE64_INCLUDE__H__
















int Base64_Code(unsigned char *s,unsigned char *d)
{
        char CharSet[64]=
        {
                'A','B','C','D','E','F','G','H',
                'I','J','K','L','M','N','O','P',
                'Q','R','S','T','U','V','W','X',
                'Y','Z','a','b','c','d','e','f',
                'g','h','i','j','k','l','m','n',
                'o','p','q','r','s','t','u','v',
                'w','x','y','z','0','1','2','3',
                '4','5','6','7','8','9','+','/'
        };
        unsigned char In[3];
        unsigned char Out[4];
        int cnt=0;
        if(!s||!d) return 0;
        for(;*s!=0;)
        {
                if(cnt+4>76)
                {
                        *d++='\n';
                        cnt=0;
                }
                if(strlen((char*)s)>=3)
                {
                        In[0]=*s;
                        In[1]=*(s+1);
                        In[2]=*(s+2);
                        Out[0]=In[0]>>2;
                        Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
                        Out[2]=(In[1]&0x0f)<<2|(In[2]&0xc0)>>6;
                        Out[3]=In[2]&0x3f;
                        *d=CharSet[Out[0]];
                        *(d+1)=CharSet[Out[1]];
                        *(d+2)=CharSet[Out[2]];
                        *(d+3)=CharSet[Out[3]];
                        s+=3;
                        d+=4;
                }
                else if(strlen((char*)s)==1)
                {
                        In[0]=*s;
                        Out[0]=In[0]>>2;
                        Out[1]=(In[0]&0x03)<<4|0;
                        *d=CharSet[Out[0]];
                        *(d+1)=CharSet[Out[1]];
                        *(d+2)='=';
                        *(d+3)='=';
                        s+=1;
                        d+=4;
                }
                else if(strlen((char*)s)==2)
                {
                        In[0]=*s;
                        In[1]=*(s+1);
                        Out[0]=In[0]>>2;
                        Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
                        Out[2]=(In[1]&0x0f)<<2|0;
                        *d=CharSet[Out[0]];
                        *(d+1)=CharSet[Out[1]];
                        *(d+2)=CharSet[Out[2]];
                        *(d+3)='=';
                        s+=2;
                        d+=4;
                }
                cnt+=4;
        }
        *d='\0';
        return 1;
}
/*

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';
// printf("----%s\n",recv_data);
 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);
 

⌨️ 快捷键说明

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