现在的位置: 首页 > 综合 > 正文

linux 发送邮件程序

2013年08月02日 ⁄ 综合 ⁄ 共 9829字 ⁄ 字号 评论关闭

大家都知道,要发送邮件,就是编写一个 smtp客户端,smtp其实是基于anscII的字符协议,说白了,也就是你往服务器上发送指定的字符,服务器便会有相应的响应,当然到底发送什么字符呢?这个就是smtp协议了。

如果想发送二进制的文件,音视频数据,那么就需要MIME(通用internet邮件扩充协议),它利用一些编码方式将这些数据转化为anscII字符,发送出去,接收端在利用相应的解码方式进行解码。

我们这里制作一个简单的邮件发送程序,其中身份验采用Base64编码,它将数据流划分为24位的块,再将24位变成4个6位字符,对应Base64的编码字符。

1、当然是连接smtp服务器,tcp方式连接服务器25号端口

2、登陆服务器,发送“EHLO Localhost/r/n”,发送“"AUTH LOGIN/r/n"”,发送经过Base64编码的用户名

      发送经过Base64编码的密码,当然都以"/r/n"结束

3、发送邮件

4、退出

附源程序:

/*
  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;
}

 

【上篇】
【下篇】

抱歉!评论已关闭.