#include <winsock2.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>


WSADATA W;
SOCKET Sock;
struct sockaddr_in Saddr;
int res,err;
unsigned long mask=127;
char text[1024];
HANDLE FileData;
DWORD nReadBytes;

const char base64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
long base64encode(const char* FileName, char* buffer,unsigned  int length)
{
	
	unsigned char ReadData[57];
	unsigned char ResData[76];
	unsigned long p=0;
	unsigned long len=0;	
	unsigned long SourceLen=0;
	unsigned long CurResBufferPos=0;
	unsigned int j;
	unsigned char tmpchar;
	FileData=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
	if(FileData==INVALID_HANDLE_VALUE) return 0;
	
	do
	{
		memset(ReadData,0,57);
		ReadFile(FileData,ReadData,57,&nReadBytes,NULL);
		if (nReadBytes==0) 
		{
			CloseHandle(FileData);
			return len;
		}
		j=0;
		SourceLen+=nReadBytes;
		for(unsigned int i=0;i<nReadBytes;i+=3)
		{
			
			p=ReadData[i+2]+ReadData[i+1]*256+ReadData[i]*65536;
			for(unsigned char i1=0;i1<3;i1++)
			{
				tmpchar=p;
				tmpchar<<=2;
				tmpchar>>=2;//
				ResData[j+3-i1]=tmpchar;
				p>>=6;
			}
			ResData[j]=p;
			j+=4;
		}

		len+=j+1;
		
		if(len<=length)//если есть место в буффере
		{
			for(unsigned char i1=0;i1<j;i1++)
			{
				buffer[CurResBufferPos+i1]=base64[ResData[i1]];
			}
			
			buffer[CurResBufferPos+j]='\n';
			CurResBufferPos+=j+1;
		}
		else return 0;
		

	}
	while(nReadBytes==57);

	
	char pad=(3-SourceLen%3)%3;
	while(pad>0)
	{
		buffer[CurResBufferPos-1-pad]='=';
		pad--;
	}
	CloseHandle(FileData);
	return len;
}


int main()
{
	
	char rcpt[50];
	char smtp[50];
	GetPrivateProfileString("Profile","to","cp@freenet.am",rcpt,50,"mailer.ini");
	GetPrivateProfileString("Profile","smtp","mail.aic.net",smtp,50,"mailer.ini");  
	
	printf("sending mail to %s , server: %s \n",rcpt,smtp);
	long size;
	char CodedData[150000];
 	size=base64encode("filename.exe",CodedData,150000);
	err = WSAStartup( 0x101, &W );
		if(err!=0) exit(1);

	Sock=socket(AF_INET,SOCK_STREAM,0);
	Saddr.sin_family=AF_INET;
	Saddr.sin_port=htons(25);
	hostent *H=gethostbyname(smtp);
	Saddr.sin_addr.s_addr=/*0x291743c2;*/ *((unsigned long *) H->h_addr);
	
	res=connect(Sock,(sockaddr*)&Saddr,sizeof(Saddr));
	if (res!=0) return false;
	printf("connected..\n");
	res=recv(Sock,text,1024,0);
	strcpy(text,"HELO yahoo.com\r\n");
	res=send(Sock,text,strlen(text),0);
	res=recv(Sock,text,1024,0);
	printf(" %s\n",text);
	strcpy(text,"MAIL FROM:cp@freenet.am \r\n");
	res=send(Sock,text,strlen(text),0);
	sprintf(text,"RCPT TO:%s \r\n",rcpt);
	res=send(Sock,text,strlen(text),0);
	res=recv(Sock,text,1024,0);
	printf(" %s\n",text);
	strcpy(text,"DATA\r\n");
	res=send(Sock,text,strlen(text),0);
	
	strcpy(text,"FROM: zombie@freenet.am\r\n");
	res=send(Sock,text,strlen(text),0);
	strcpy(text,"TO:\r\n");
	res=send(Sock,text,strlen(text),0);
	strcpy(text,"MESSAGE_ID:zzz \r\nSUBJECT:subj\r\n");
	res=send(Sock,text,strlen(text),0);



	send(Sock,"MIME-Version: 1.0\r\n",19,0);
	strcpy(text,"Content-Type: multipart/mixed; boundary=\"--------bound--\"\r\n");
	send(Sock,text,strlen(text),0);
	send(Sock,"\r\n",2,0);
	send(Sock,"----------bound--\r\n",19,0);
	strcpy(text,"Content-Type: text/plain; charset=us-ascii\r\nContent-Transfer-Encoding: 7bit\r\n");
	send(Sock,text,strlen(text),0);
	send(Sock,"\r\n",2,0);

	sprintf(text,"message_here");
	res=send(Sock,text,strlen(text),0);

	send(Sock,"----------bound--\r\n",19,0);
	strcpy(text,"Content-Type: application/x-msdownload; name=\"file.exe\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\"file.exe\"\r\n");

	res=send(Sock,text,strlen(text),0);
	send(Sock,"\r\n",2,0);

	if(size=base64encode("file.exe",CodedData,150000)) 
	{
		send(Sock,CodedData,size,0);
	}
	else send(Sock,"FAILED",6,0);

	send(Sock,"\r\n",2,0);

	send(Sock,"----------bound--\r\n",19,0);

	strcpy(text,"\r\n.\r\n");
	res=send(Sock,text,strlen(text),0);
	
	strcpy(text,"QUIT\r\n");
	res=send(Sock,text,strlen(text),0);
	res=recv(Sock,text,1024,0);      
	printf(" %s\n done..",text);
	closesocket(Sock);


	return 0;
}


