|
![]() | 作者: battle [battle]
![]() |
登录 |
typedef struct _SMTPINFO { char SmtpSrvName[32]; char Port[7]; char UserName[16]; char Password[16]; char From[32]; char To[32]; char Subject[32]; char *msg; }SMTPINFO; int SendMail(const SMTPINFO *psmtpinfo); void Base64(unsigned char chasc[3],unsigned char chuue[4]); int Talk(SOCKET sockid, const char *OkCode, char *pSend); //--------------------------------------------------------------------- int SendMail(const SMTPINFO *psmtpinfo) { //准备网络连接 WSADATA wsadata; if (WSAStartup(MAKEWORD(2,2),&wsadata) != 0) { #ifdef _DEBUG printf("WSAStartup() error : %d\n", GetLastError()); #endif return 1; } //创建套接字 SOCKET sockid; if ((sockid = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET) { #ifdef _DEBUG printf("socket() error : %d\n", GetLastError()); #endif WSACleanup(); return 1; } //得到smtp服务器ip struct hostent *phostent = gethostbyname(psmtpinfo->SmtpSrvName); struct sockaddr_in addr; CopyMemory(&addr.sin_addr.S_un.S_addr, phostent->h_addr_list[0], sizeof(addr.sin_addr.S_un.S_addr)); #ifdef _DEBUG struct in_addr srvaddr; CopyMemory(&srvaddr, &addr.sin_addr.S_un.S_addr, sizeof(struct in_addr)); printf("Smtp server name is %s\n", psmtpinfo->SmtpSrvName); printf("Smtp server ip is %s\n", inet_ntoa(srvaddr)); #endif addr.sin_family = AF_INET; addr.sin_port = htons(atoi(psmtpinfo->Port)); ZeroMemory(&addr.sin_zero, 8); //连接服务器 if (connect(sockid, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { #ifdef _DEBUG printf("connect() error : %d\n", GetLastError()); #endif goto STOP; } if (Talk(sockid, "220", "AUTH LOGIN")) { goto STOP; } //将用户名和密码转换为base64编码 const int buflen = 128; char buf[buflen]; int i,userlen,passlen; ZeroMemory(buf, buflen); userlen = lstrlen(psmtpinfo->UserName); passlen = lstrlen(psmtpinfo->Password); for(i = 0; i < (userlen%3?userlen/3+1:userlen/3); i++) { Base64(psmtpinfo->UserName + i * 3, buf + i * 4); } if (Talk(sockid, "334", buf)) { goto STOP; } ZeroMemory(buf, buflen); for(i = 0; i < (passlen%3?passlen/3+1:passlen/3); i++) { Base64(psmtpinfo->Password + i * 3, buf + i * 4); } if (Talk(sockid, "334", buf)) { goto STOP; } if (Talk(sockid, "235", "HELO sjdf")) { goto STOP; } ZeroMemory(buf, buflen); wsprintf(buf, "MAIL FROM:%s", psmtpinfo->From); if (Talk(sockid, "250", buf)) { goto STOP; } ZeroMemory(buf, buflen); wsprintf(buf, "RCPT TO:%s", psmtpinfo->To); if (Talk(sockid, "250", buf)) { goto STOP; } if (Talk(sockid, "250", "DATA")) { goto STOP; } ZeroMemory(buf, buflen); wsprintf(buf, "TO:%s\r\nFROM:%s\r\nSUBJECT:%s\r\n%s\r\n\r\n.", psmtpinfo->To,psmtpinfo->From,psmtpinfo->Subject,psmtpinfo->msg); if (Talk(sockid, "354", buf)) { goto STOP; } if (Talk(sockid, "250", "QUIT")) { goto STOP; } if (Talk(sockid, "221", "")) { goto STOP; } else { closesocket(sockid); WSACleanup(); return 0; } STOP: closesocket(sockid); WSACleanup(); return 1; } //--------------------------------------------------------------------- int Talk(SOCKET sockid, const char *OkCode, char *pSend) { const int buflen = 128; char buf[buflen]; ZeroMemory(buf, buflen); //接收返回信息 if (recv(sockid, buf, buflen, 0) == SOCKET_ERROR) { #ifdef _DEBUG printf("recv() error : %d\n", GetLastError()); #endif return 1; } #ifdef _DEBUG printf(buf); #endif if (strstr(buf, OkCode) == NULL) { #ifdef _DEBUG printf("Error: recv code != %s\n", OkCode); #endif return 1; } //发送命令 if (lstrlen(pSend)) { ZeroMemory(buf, buflen); wsprintf(buf, "%s\r\n", pSend); #ifdef _DEBUG printf(buf); #endif if (send(sockid, buf, lstrlen(buf), 0) == SOCKET_ERROR) { #ifdef _DEBUG printf("send() error : %d\n", GetLastError()); #endif return 1; } } return 0; } //--------------------------------------------------------------------- //Base64编码,chasc:未编码的二进制代码,chuue:编码过的Base64代码 void Base64(unsigned char chasc[3],unsigned char chuue[4]) { int i,k=2; unsigned char t = 0; for(i=0;i<3;i++) { *(chuue+i)=*(chasc+i)>>k; *(chuue+i)|=t; t=*(chasc+i)<<(8-k); t>>=2; k+=2; } *(chuue+3)=*(chasc+2)&63; for(i=0;i<4;i++) if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65; else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71; else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4; else if(*(chuue+i)==62) *(chuue+i)=43; else if(*(chuue+i)==63) *(chuue+i)=47; } 运行时出现下面这个错误 error C2664: 'Base64' : cannot convert parameter 1 from 'const char *' to 'unsigned char []'Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 请各位朋友,还帮忙看看问题在哪 [此贴被 特务(battle) 在 07月22日17时27分 编辑过] |
地主 发表时间: 04-07-22 17:26 |
![]() | 回复: 286 [unique] ![]() |
登录 |
void Base64(unsigned char chasc[3],unsigned char chuue[4]) void Base64(unsigned char *chasc,unsigned char *chuue) |
B1层 发表时间: 04-07-22 17:59 |
![]() | 回复: battle [battle] ![]() |
登录 |
不行,我改了,还是报错,错的是这两句 for(i = 0; i < (userlen%3?userlen/3+1:userlen/3); i++) { Base64(psmtpinfo->UserName + i * 3, buf + i * 4); } for(i = 0; i < (passlen%3?passlen/3+1:passlen/3); i++) { Base64(psmtpinfo->Password + i * 3, buf + i * 4); } error C2664: 'Base64' : cannot convert parameter 1 from 'const char *' to 'unsigned char *'Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast |
B2层 发表时间: 04-07-22 18:06 |
![]() | 回复: LionD8 [liond8] ![]() |
登录 |
#include "winsock2.h" #include "windows.h" #include "stdio.h" const int buflen = 128; typedef struct _SMTPINFO { char SmtpSrvName[32]; char Port[7]; char UserName[16]; char Password[16]; char From[32]; char To[32]; char Subject[32]; char *msg; }SMTPINFO; int SendMail(const SMTPINFO *psmtpinfo); void Base64(unsigned char* chasc,unsigned char* chuue); int Talk(SOCKET sockid, const char *OkCode, char *pSend); //--------------------------------------------------------------------- int SendMail(const SMTPINFO *psmtpinfo) { //准备网络连接 WSADATA wsadata; if (WSAStartup(MAKEWORD(2,2),&wsadata) != 0) { #ifdef _DEBUG printf("WSAStartup() error : %d\n", GetLastError()); #endif return 1; } //创建套接字 SOCKET sockid; if ((sockid = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET) { #ifdef _DEBUG printf("socket() error : %d\n", GetLastError()); #endif WSACleanup(); return 1; } //得到smtp服务器ip struct hostent *phostent = gethostbyname(psmtpinfo->SmtpSrvName); struct sockaddr_in addr; CopyMemory(&addr.sin_addr.S_un.S_addr, phostent->h_addr_list[0], sizeof(addr.sin_addr.S_un.S_addr)); #ifdef _DEBUG struct in_addr srvaddr; CopyMemory(&srvaddr, &addr.sin_addr.S_un.S_addr, sizeof(struct in_addr)); printf("Smtp server name is %s\n", psmtpinfo->SmtpSrvName); printf("Smtp server ip is %s\n", inet_ntoa(srvaddr)); #endif addr.sin_family = AF_INET; addr.sin_port = htons(atoi(psmtpinfo->Port)); ZeroMemory(&addr.sin_zero, 8); //连接服务器 if (connect(sockid, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { #ifdef _DEBUG printf("connect() error : %d\n", GetLastError()); #endif goto STOP; } if (Talk(sockid, "220", "AUTH LOGIN")) { goto STOP; } //将用户名和密码转换为base64编码 char buf[128]; int i,userlen,passlen; ZeroMemory(buf, buflen); userlen = lstrlen(psmtpinfo->UserName); passlen = lstrlen(psmtpinfo->Password); for(i = 0; i < (userlen%3?userlen/3+1:userlen/3); i++) { Base64((UCHAR*)(psmtpinfo->UserName + i * 3), (UCHAR*)(buf + i * 4)); } if (Talk(sockid, "334", buf)) { goto STOP; } ZeroMemory(buf, buflen); for(i = 0; i < (passlen%3?passlen/3+1:passlen/3); i++) { Base64((UCHAR*)(psmtpinfo->Password + i * 3), (UCHAR*)(buf + i * 4)); } if (Talk(sockid, "334", buf)) { goto STOP; } if (Talk(sockid, "235", "HELO sjdf")) { goto STOP; } ZeroMemory(buf, buflen); wsprintf(buf, "MAIL FROM:%s", psmtpinfo->From); if (Talk(sockid, "250", buf)) { goto STOP; } ZeroMemory(buf, buflen); wsprintf(buf, "RCPT TO:%s", psmtpinfo->To); if (Talk(sockid, "250", buf)) { goto STOP; } if (Talk(sockid, "250", "DATA")) { goto STOP; } ZeroMemory(buf, buflen); wsprintf(buf, "TO:%s\r\nFROM:%s\r\nSUBJECT:%s\r\n%s\r\n\r\n.", psmtpinfo->To,psmtpinfo->From,psmtpinfo->Subject,psmtpinfo->msg); if (Talk(sockid, "354", buf)) { goto STOP; } if (Talk(sockid, "250", "QUIT")) { goto STOP; } if (Talk(sockid, "221", "")) { goto STOP; } else { closesocket(sockid); WSACleanup(); return 0; } STOP: closesocket(sockid); WSACleanup(); return 1; } //--------------------------------------------------------------------- int Talk(SOCKET sockid, const char *OkCode, char *pSend) { const int buflen = 128; char buf[128]; ZeroMemory(buf, buflen); //接收返回信息 if (recv(sockid, buf, buflen, 0) == SOCKET_ERROR) { #ifdef _DEBUG printf("recv() error : %d\n", GetLastError()); #endif return 1; } #ifdef _DEBUG printf(buf); #endif if (strstr(buf, OkCode) == NULL) { #ifdef _DEBUG printf("Error: recv code != %s\n", OkCode); #endif return 1; } //发送命令 if (lstrlen(pSend)) { ZeroMemory(buf, buflen); wsprintf(buf, "%s\r\n", pSend); #ifdef _DEBUG printf(buf); #endif if (send(sockid, buf, lstrlen(buf), 0) == SOCKET_ERROR) { #ifdef _DEBUG printf("send() error : %d\n", GetLastError()); #endif return 1; } } return 0; } //--------------------------------------------------------------------- //Base64编码,chasc:未编码的二进制代码,chuue:编码过的Base64代码 void Base64(unsigned char* chasc,unsigned char* chuue) { int i,k=2; unsigned char t = 0; for(i=0;i<3;i++) { *(chuue+i)=*(chasc+i)>>k; *(chuue+i)|=t; t=*(chasc+i)<<(8-k); t>>=2; k+=2; } *(chuue+3)=*(chasc+2)&63; for(i=0;i<4;i++) if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65; else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71; else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4; else if(*(chuue+i)==62) *(chuue+i)=43; else if(*(chuue+i)==63) *(chuue+i)=47; } 修改了一点 编译是通过了 不知道 你不是你想要的结果 |
B3层 发表时间: 04-07-23 12:17 |
![]() | 回复: battle [battle] ![]() |
登录 |
谢谢!! 编译是成功了,, 但好象信发不出去哦,有时间帮忙看看问题在哪 [此贴被 特务(battle) 在 07月23日19时59分 编辑过] |
B4层 发表时间: 04-07-23 19:51 |
![]() | 回复: leonshoh [leonshoh] ![]() |
登录 |
SMTP发163,sina,sohu想都不要想了,有MX验证,除非在他们的红名单里面,不然一律认为是垃圾邮件过滤,如果DATA部分格式没有遵循RFC文档的话,象21cn也拒收。 用ESMTP通过验证的话就可以扔邮件了,不过DATA部分要遵循RFC文档... |
B5层 发表时间: 04-07-24 14:29 |
![]() | 回复: battle [battle] ![]() |
登录 |
是smtp验证的啊!! |
B6层 发表时间: 04-07-24 16:24 |
![]() | 回复: pwycctv [pwycctv] ![]() |
登录 |
我怎么一点也看不懂![]() |
B7层 发表时间: 04-07-28 19:19 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号