#include <winsock2.h>
#include <stdio.h>
#include <Windns.h>
#pragma comment(lib,"Dnsapi")
#pragma comment(lib,"ws2_32")
struct SMTPINFO
{
LPSTR SendToMail;
LPSTR RecvFromMail;
LPSTR From;
LPSTR To;
int Priority;
LPSTR Subject;
LPSTR Body;
};
unsigned char Chr2Hex( char c )
{
if ( c >= 'a' && c <= 'z' ) // it's toupper
c = c - 'a' + 'A';
if ( c >= '0' && c <= '9' )
return ( int )( c - '0' );
else if ( c >= 'A' && c <= 'F' )
return ( int )( c - 'A' + 10 );
else
return -1;
}
char Hex2Chr( unsigned char n )
{
n &= 0xF;
if ( n < 10 )
return ( char )( n + '0' );
else
return ( char )( n - 10 + 'A' );
}
int QPEncode( char * const aDest,char * aSrc, int aLen )
{
char * p = aDest;
int i = 0;
while ( i++ < aLen )
{
*p++ = '=';
*p++ = Hex2Chr( *aSrc >> 4 );
*p++ = Hex2Chr( *aSrc++ );
}
*p = 0; // aDest is an ASCIIZ string
return ( p - aDest ); // exclude the end of zero
}
int QPDecode(unsigned char * const aDest, const char * aSrc )
{
unsigned char * p = aDest;
int n = strlen( aSrc );
unsigned char ch, cl;
while ( *aSrc ) // aSrc is an ASCIIZ string
{
if ( ( *aSrc == '=' ) && ( n - 2 > 0 ) )
{
ch = Chr2Hex( aSrc[1] );
cl = Chr2Hex( aSrc[2] );
if ( ( ch == ( unsigned char )-1 ) || ( cl == ( unsigned char )-1 ) )
*p++ = *aSrc++;
else
{
*p++ = ( ch << 4 ) | cl;
aSrc += 3;
}
}
else
*p++ = *aSrc++;
}
return ( p - aDest );
}
BOOL SendData(SOCKET Socket,LPSTR sendbody,int sendlen,LPSTR recvflags)
{
do
{
int len = send(Socket,sendbody,sendlen,0);
if (len == SOCKET_ERROR)
return FALSE;
sendbody += len;
sendlen -= len;
}while(sendlen != 0);
char recvbody[1024];
#ifdef _DEBUG
ZeroMemory(recvbody,sizeof(recvbody));
#endif
if (SOCKET_ERROR != recv(Socket,recvbody,sizeof(recvbody),0))
{
#ifdef _DEBUG
printf("%s\r\n",recvbody);
#endif
if (0 == strncmp(recvbody,recvflags,lstrlenA(recvflags)))
{
return TRUE;
}
else
{
return FALSE;
}
}
return TRUE;
}
BOOL SendMail(SMTPINFO *smtpinfo)
{
LPSTR smtp = strstr(smtpinfo->SendToMail,"@");
smtp++;
DNS_RECORDA *p = NULL;
if (0 == DnsQuery_A(smtp,DNS_TYPE_MX,DNS_QUERY_STANDARD,NULL,(PDNS_RECORD *)&p,NULL))
{
for(PDNS_RECORDA i = p; i != NULL; i = i->pNext)
{
if (i->wType == DNS_TYPE_MX)
{
hostent *hostname = gethostbyname(i->Data.MX.pNameExchange);
for (int j = 0;hostname != NULL && hostname->h_addr_list[j] != NULL;j++)
{
//多IP
SOCKET Socket = socket(AF_INET,SOCK_STREAM,0);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = *(DWORD*)hostname->h_addr_list[j];
addr.sin_port = htons(25);
if (SOCKET_ERROR == connect(Socket,(sockaddr*)&addr,sizeof(addr)))
{
closesocket(Socket);
continue;
}
char sendbody[1024];
if (FALSE == SendData(Socket,NULL,0,"220"))
{
closesocket(Socket);
continue;
}
char localhostname[MAX_COMPUTERNAME_LENGTH+1];
gethostname(localhostname,sizeof(localhostname));
wsprintfA(sendbody,"EHLO %s\r\n",localhostname);
if (FALSE == SendData(Socket,sendbody,lstrlenA(sendbody),"250"))
{
closesocket(Socket);
continue;
}
wsprintfA(sendbody,"MAIL FROM:<%s>\r\n",smtpinfo->RecvFromMail);
if (FALSE == SendData(Socket,sendbody,lstrlenA(sendbody),"250"))
{
closesocket(Socket);
continue;
}
wsprintfA(sendbody,"RCPT TO:<%s>\r\n",smtpinfo->SendToMail);
if (FALSE == SendData(Socket,sendbody,lstrlenA(sendbody),"250"))
{
closesocket(Socket);
continue;
}
if (FALSE == SendData(Socket,"DATA\r\n",lstrlenA("DATA\r\n"),"354"))
{
closesocket(Socket);
continue;
}
LPSTR SubjectCode = (LPSTR)GlobalAlloc(GPTR,lstrlenA(smtpinfo->Subject)*4);
QPEncode(SubjectCode,smtpinfo->Subject,lstrlenA(smtpinfo->Subject));
LPSTR FromCode = (LPSTR)GlobalAlloc(GPTR,lstrlenA(smtpinfo->From)*4);
QPEncode(FromCode,smtpinfo->From,lstrlenA(smtpinfo->From));
LPSTR ToCode = (LPSTR)GlobalAlloc(GPTR,lstrlenA(smtpinfo->To)*4);
QPEncode(ToCode,smtpinfo->To,lstrlenA(smtpinfo->To));
LPSTR BodyCode = (LPSTR)GlobalAlloc(GPTR,lstrlenA(smtpinfo->Body)*4);
QPEncode(BodyCode,smtpinfo->Body,lstrlenA(smtpinfo->Body));
wsprintfA(sendbody,"Subject: =?GB2312?Q?%s?=\r\n" \
"From: \"=?GB2312?Q?%s?=\" <%s>\r\n" \
"To: \"=?GB2312?Q?%s?=\" <%s>\r\n" \
"X-Priority: %d\r\n" \
"Content-Transfer-Encoding: Quoted-Printable\r\n"\
"Content-Type: text/plain;\r\n.charset=\"GB2312\"\r\n\r\n"\
"%s\r\n.\r\n",
SubjectCode,FromCode,smtpinfo->RecvFromMail,ToCode,smtpinfo->SendToMail,smtpinfo->Priority,BodyCode);
GlobalFree(SubjectCode);
GlobalFree(FromCode);
GlobalFree(ToCode);
GlobalFree(BodyCode);
if (FALSE == SendData(Socket,sendbody,lstrlenA(sendbody),"250"))
{
closesocket(Socket);
continue;
}
if (FALSE == SendData(Socket,"QUIT\r\n",lstrlenA("QUIT\r\n"),"221"))
{
closesocket(Socket);
continue;
}
closesocket(Socket);
DnsRecordListFree((PDNS_RECORD)p,DnsFreeFlat);
return TRUE;
}
}
}
DnsRecordListFree((PDNS_RECORD)p,DnsFreeFlat);
}
return FALSE;
}
void main()
{
WSADATA wsaData;
WSAStartup(0x202,&wsaData);
SMTPINFO smtpinfo;
smtpinfo.Priority = 1; //邮件优先级 1为最高 5为最低
smtpinfo.Subject = "MX发信测试"; //邮件主题
smtpinfo.RecvFromMail = "test@test.com"; //发件人信箱
smtpinfo.SendToMail = "lemony8734@gmail.com"; //收件人信箱
smtpinfo.From = "张三"; //发件人姓名
smtpinfo.To = "李四"; //收件人姓名
smtpinfo.Body = "hoho~~~~~"; //邮件正文s
if (SendMail(&smtpinfo))
{
printf("邮件发送成功");
}
else
{
printf("邮件发送失败");
}
WSACleanup();
}
没有合适的资源?快使用搜索试试~ 我知道了~
简单的垃圾邮件示例程序
共13个文件
manifest:2个
dep:1个
vcproj:1个
5星 · 超过95%的资源 需积分: 10 10 下载量 168 浏览量
2011-12-21
17:44:05
上传
评论
收藏 110KB RAR 举报
温馨提示
编写垃圾邮件的示例程序,是学习垃圾邮件处理的好例子,如果想要对邮件进行更多的功能处理,请研究邮件的具体格式。
资源推荐
资源详情
资源评论
收起资源包目录
JunkMail.rar (13个子文件)
JunkMail
Debug
JunkMail.suo 10KB
JunkMail
MX_SEND_MAIL.cpp 7KB
JunkMail.vcproj 4KB
JunkMail.vcproj.WWW-2939924499C.QingChen.user 1KB
Debug
vc90.idb 347KB
vc90.pdb 116KB
mt.dep 69B
JunkMail.exe.intermediate.manifest 621B
JunkMail.exe.embed.manifest 663B
BuildLog.htm 12KB
MX_SEND_MAIL.obj 41KB
JunkMail.exe.embed.manifest.res 728B
JunkMail.sln 890B
共 13 条
- 1
资源评论
- yuxinxinxin2015-01-08可以使用。
- miracle2x2013-05-14呃 可用 就是个模型
qingchen1984
- 粉丝: 0
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- torch-1.8.1+cu111-cp38-cp38-linux-x86-64.whl +torchvision
- 计算机设计 - VB+ACCESS网络计时管理系统设计(源代码+系统),保证可靠运行,毕业生可参考,免费资源下载
- 计算机设计 - vb+ACCESS身份证管理系统设计(LW+源代码),保证可靠运行,毕业生可参考,免费资源下载
- ARCMAP自动编号工具
- W801学习笔记十三:掌机系统-系统基础组件-PNG-loader
- studydatastruct3
- XHS链接提取/作品采集工具
- general-exporter windows
- kotlin语法快速入门文档
- general-exporter linux
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功