server.sin_family =AF_INET;
server.sin_addr.s_addr =inet_addr("192.168.1.254");
server.sin_port =htons(25);
if(connect(MailSocket,(sockaddr *)&server,sizeof(server))==SOCKET_ERROR)
{
cout<<"can not connect the server"<<endl;
getchar();
return 0; }ret=send(MailSocket,"MAIL FROM:[email protected]\r\n",100,0);
ret=send(MailSocket,"RCPT TO:xx@xxcom\r\n",50,0);
ret=send(MailSocket,"\r\n",4,0);
ret=send(MailSocket,"hello",9,0);
ret=send(MailSocket,"\r\n.\r\n",10,0);
ret=send(MailSocket,"QUIT\r\n",10,0);
server.sin_addr.s_addr =inet_addr("192.168.1.254");
server.sin_port =htons(25);
if(connect(MailSocket,(sockaddr *)&server,sizeof(server))==SOCKET_ERROR)
{
cout<<"can not connect the server"<<endl;
getchar();
return 0; }ret=send(MailSocket,"MAIL FROM:[email protected]\r\n",100,0);
ret=send(MailSocket,"RCPT TO:xx@xxcom\r\n",50,0);
ret=send(MailSocket,"\r\n",4,0);
ret=send(MailSocket,"hello",9,0);
ret=send(MailSocket,"\r\n.\r\n",10,0);
ret=send(MailSocket,"QUIT\r\n",10,0);
ret=send(MailSocket,"MAIL FROM:[email protected]\r\n",100,0);
recv(MailSocket,.............
ret=send(MailSocket,"RCPT TO:xx@xxcom\r\n",50,0);
recv(MailSocket,.............
ret=send(MailSocket,"MAIL FROM: <[email protected]>\r\n",strlen(,"MAIL FROM: <[email protected]>\r\n"),0);
ret=send(MailSocket,"RCPT TO: <xx@xxcom>\r\n",strlen(,"RCPT TO: <xx@xxcom>\r\n"),0);
ret=send(MailSocket,"DATA\r\n",strlen(,"DATA\r\n"),0);
ret=send(MailSocket,"hello",strlen(,"hello"),0);
ret=send(MailSocket,"\r\n.\r\n",strlen(,"\r\n.\r\n"),0);
ret=send(MailSocket,"QUIT\r\n",strlen(,"QUIT\r\n"),0);
我一开始没有用recv接收怎么都不行。
后来才知道!
要不先试试!
/*---------------------------------------------------------------------
//SendMail.c
//Coder: sjdf
//E-mail: [email protected]
//Create date: 2003.10.6
//Last modify date: 2003.10.8
//Compiler: LCC 3.8
//Test platform: Win2000 Adv Server + sp4
---------------------------------------------------------------------*/
#include <winsock2.h>
#include <windows.h>
//---------------------------------------------------------------------
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)
{
return 1;
} //创建套接字
SOCKET sockid; if ((sockid = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
{
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)); 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)
{
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)
{
return 1;
} if (strstr(buf, OkCode) == NULL)
{
return 1;
} //发送命令
if (lstrlen(pSend))
{
ZeroMemory(buf, buflen);
wsprintf(buf, "%s\r\n", pSend); if (send(sockid, buf, lstrlen(buf), 0) == SOCKET_ERROR)
{
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;}
好!我是初学者,想问问你的程序能成功的发出邮件吗?我不明白为什么你的顺序是这样的
“username--->passwd--->helo.....”?好像我看到的是:“helo-->auth login-->username-->passwd”。请指教!
不过如果是需要验证的那也只能接受验证了,输入用户名和密码