mx
来源:互联网 发布:鱼眼校正软件 编辑:程序博客网 时间:2024/04/27 13:41
/*-------------
Code by:允恒
Date:2006.08.14
转载请包含此信息
--------------*/
#include
#include
#include
#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 = '0' && 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++ > 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 <
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:/r/n",smtpinfo->RecvFromMail);
if (FALSE == SendData(Socket,sendbody,lstrlenA(sendbody),"250"))
{
closesocket(Socket);
continue;
}
wsprintfA(sendbody,"RCPT TO:/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?=/" /r/n" /
"To: /"=?GB2312?Q?%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();
}
- mx
- MX MUX
- MX记录
- mx-memonger
- mx:list mx:dataGrid 实例
- MX记录及MX记录优先级
- Dreamweaver MX / Fireworks MX Savvy with
- flex 命名空间mx,fx,s,mx
- 1.51mx简介
- Databases in Dreamweaver MX
- dreamweaver MX 注册码
- Dreamweaver MX 笔记
- mx记录问题
- Get Mail MX Server
- 关于MX门户
- Dreamweaver MX 2004 Bible
- Dreamweaver MX Extensions
- Flash MX ActionScript字典
- echo 打印彩色字符
- 向DataTable表中添加一行空信息,使DropDownList的第一个选项为空
- 海空神佛的虚伪[注意]
- 充分利用ASP.NET的三种缓存提高站点性能
- 通用ODBC API应用结构概述
- mx
- 使用高效的日志工具—Log4J
- 软件配置管理概念-1,介绍
- UNIX控制台部分常用命令
- ASP.NET2.0生成静态页面的代码
- 软件配置管理概念-2,用户角色
- Inno Setup中运行可执行文件和MD5效验
- location.replace()和location.href=的区别
- 如何点击服务器Button按钮后变为不可点