用C写邮件收发程序

刚刚抄来的,呵呵

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment (lib,"ws2_32.lib")
//Global variable
char server[40],to[40],from[40],subject[40],data[1024],szSend[7][2048];
int times;
struct sockaddr_in sa;
void usage(char *name)
{
printf("\n%s by eyas<eyas@patching.net>"
  "\n2001/2/28"
  "\nUsage:%s <ServerIP> <To> <From> <Subject> <Data> <times>"
  "\nExample:%s 202.104.32.230 zhutou@21cn.com hehe@21cn.com hello haha 100\n",
  name,name,name);
return;
}
DWORD WINAPI SendMail(PVOID p)
{
WSADATA wsd;
int net,ret,i,j;
char szBuffer[2048];
if(WSAStartup(MAKEWORD(1,1),&wsd)!=0)
{
 printf("\nFailed to load Winsock library!ErrorCode:%d.",GetLastError());
 ExitProcess(1);
}
net=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(net==INVALID_SOCKET)
{
 printf("\nsocket() failed.ErrorCode:%d.",GetLastError());
 WSACleanup();
 ExitProcess(1);
}
ret=connect(net, (struct sockaddr *) &sa, sizeof sa);
if(ret!=0)
{
 printf("\nconnect() failed.ErrorCode:%d.",GetLastError());
 closesocket(net);
 WSACleanup();
 ExitProcess(1);
}

for(j=0;j<8;j++)
{
 //receive data
 ret=recv(net,szBuffer,2048,0);
 if((ret==0) || (ret==SOCKET_ERROR))
 {
  printf("\nrecv() failed.ErrorCode:%d.",WSAGetLastError());
  break;
 }
 
 if(j==7)
  break;
 echo send data
 printf("%s",szSend[j]);
 send data
 ret=send(net,szSend[j],strlen(szSend[j]),0);
 if((ret==0) || (ret==SOCKET_ERROR))
 {
  printf("\nsend() failed.ErrorCode:%d.",WSAGetLastError());
  break;
 }
}
//free resource
closesocket(net);
WSACleanup();
return 0;
}
int main(int argc,char **argv)
{
HANDLE hThread;
DWORD dwThreadId;
int i;
if(argc!=7)
{
 usage(argv[0]);
 return 1;
}
//gets user input
strncpy(server,argv[1],sizeof(server));
strncpy(to,argv[2],sizeof(to));
strncpy(from,argv[3],sizeof(from));
strncpy(subject,argv[4],sizeof(subject));
strncpy(data,argv[5],sizeof(data));
times=atoi(argv[6]);
strncpy((char *)&sa, "", sizeof sa);
//fill the struct
sa.sin_family=AF_INET;
sa.sin_port=htons(25);
sa.sin_addr.s_addr=inet_addr(server);
///built send data
strcpy(szSend[0],"HELO\n");
strcpy(szSend[1],"MAIL FROM:<");
strncat(szSend[1],from,sizeof(from));
strcat(szSend[1],">\n");
strcpy(szSend[2],"RCPT TO:<");
strncat(szSend[2],to,sizeof(to));
strcat(szSend[2],">\n");
strcpy(szSend[3],"DATA\n");
strcpy(szSend[4],"Subject:");
strncat(szSend[4],subject,sizeof(subject));
strcat(szSend[4],"\nFrom:");
strncat(szSend[4],from,sizeof(from));
strcat(szSend[4],"\n\n");
strncat(szSend[4],data,sizeof(data));
strcat(szSend[4],"\n.\n");
strcpy(szSend[5],"SEND\n");
strcpy(szSend[6],"QUIT\n");
for(i=0;i<times;i++)
{
 hThread=CreateThread(NULL,0,SendMail,(PVOID)NULL,0,&dwThreadId);
 if(hThread==NULL)
 {
  printf("\nCreate thread error.");
  break;
 }
 Sleep(20);
 CloseHandle(hThread);
 printf("\nHave been send %d Email.",i+1);
}
printf("\nWait 5 seconds to exit.");
Sleep(5000);
printf("\nComplete.");
return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主要功能: 1、可以发送带附件的邮件,附件可以是多个,附件大小限制由发送方服务器而定,暂未测试具体为多少MB 2、邮件内容和主题可以是空,但当有附件时,主题取第一个附件的文件名(不含扩展名) 3、密码验证均为base64加密 4、邮件正文和附件的数据传送方式,均为base64 5、自动解析发件箱的SMTP服务器 压缩包文件简介: base.c:包含一些基本的函数,其中有一些在此程序中并未用到,只要使用了其中的base64加密算法 mail.c:包含邮件发送、数据读取、编码转换、smtp服务器连接、ip解析等函数 mailsend.c:包含main的c源文件,mail.exe则是根据mailsend.c、mail.c、base.c编译成的,具体编译方 法可参考makefile libbase.a:make之后生成的静态库 moontalk.cfg:base.c用到的配置文件,可能没用,放在这里进攻阅读参考 mail.cfg:自定义用户的配置文件,可用可不用,用作读代码的参考 mail.exe:邮件发送的执行文件,仅有命令行模式完善了,逐步输入(直接双击)的方式还不完善 b64.exe:base64加密解密的小工具,仅供参考,mail.cfg中用到密码的地方,可以使这个工具得到。 makefile:工程编译链接文件 注意:在本地使用mingw环境开发,遵循ANSI C标准,本地有系统的工程库,但是上传的时候,把这些文件 都放在一起了,可以先参考makefile进行工程调整,如果有任何问题,请发送到邮箱moontalk@yeah.net, 技术交流,不胜感激。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值