小弟最近在做个用SMTP发送邮件的程序
碰到点问题,求大虾们指导
首先是想请教一下套接字连接SMTP服务器,Connect之后应该是"HELO"还是"AUTH LOGIN"?
还有就是我在Connect SMTP服务器后,服务器返回220,表示连接成功了,但是接下来我不管是发送HELO还是AUTH LOGIN服务器都返回421,服务失败,为什么?具体代码如下:
...........connect smtp server...............................
...............
char chrMessage[255]="HELO smtp.163.com\r\n";
memset(chrMessage, 0, sizeof(chrMessage));
if(!theSocket.Send(chrMessage,sizeof(chrMessage)))
{
AfxMessageBox("Could not send to LOGIN!");
return false;
}
if (theSocket.Receive(chrResponse, sizeof(chrResponse)) == SOCKET_ERROR)
{
CString strError;
strError.Format("%d",theSocket.GetLastError());
AfxMessageBox(strError);
return false;
}
strResponse.Format("%s",chrResponse);
if (strResponse.Left(3) != _T("334"))
{
CString strError = "ERROR: Not a valid SMTP server response\r\n";
strError += strResponse;
AfxMessageBox(strError);
theSocket.Send("QUIT\r\n",255);
return false;
}
碰到点问题,求大虾们指导
首先是想请教一下套接字连接SMTP服务器,Connect之后应该是"HELO"还是"AUTH LOGIN"?
还有就是我在Connect SMTP服务器后,服务器返回220,表示连接成功了,但是接下来我不管是发送HELO还是AUTH LOGIN服务器都返回421,服务失败,为什么?具体代码如下:
...........connect smtp server...............................
...............
char chrMessage[255]="HELO smtp.163.com\r\n";
memset(chrMessage, 0, sizeof(chrMessage));
if(!theSocket.Send(chrMessage,sizeof(chrMessage)))
{
AfxMessageBox("Could not send to LOGIN!");
return false;
}
if (theSocket.Receive(chrResponse, sizeof(chrResponse)) == SOCKET_ERROR)
{
CString strError;
strError.Format("%d",theSocket.GetLastError());
AfxMessageBox(strError);
return false;
}
strResponse.Format("%s",chrResponse);
if (strResponse.Left(3) != _T("334"))
{
CString strError = "ERROR: Not a valid SMTP server response\r\n";
strError += strResponse;
AfxMessageBox(strError);
theSocket.Send("QUIT\r\n",255);
return false;
}
解决方案 »
- AutoRun启动程序和双击启动程序的差别
- VS2005应该用哪个版本的xtreme toolkit?
- 送分聊天!!!!本人已经过被录用大家来讨论一下...
- double型转变成字符串的问题
- 请问一个工程建立好后,可以修改工程的名字吗?
- 文件的格式?
- 请问, KillTime 是否可以放在 OnTime 的响应函数当中!!!!!!!!!!!!!!
- ===菜鸟急问===:如何用程序打开一个Openfile的对话框?
- 对话框程序的更新问题!(在线等待)急!!!!!
- 如何在调用动态链接库中的对话框类???
- 急求:如何在VC中启动IE来调试用ATL COM AppWizard生成的dll控件?
- socket速度问题
返回的还是421。:(
BOOL CSendMail::InitSocket()
{
int ret=0; WSADATA wsa;
ret=WSAStartup(0x0101,&wsa);
if(ret!=0)
{
return FALSE;
} Sock=socket(AF_INET,SOCK_STREAM,0);
if(Sock==INVALID_SOCKET)
{
return FALSE;
} int timeo=100;
ret=setsockopt(Sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeo,sizeof(timeo));
if(ret==SOCKET_ERROR)
{
return FALSE;
} return TRUE;
}
//接收响应码
BOOL CSendMail::WaitForResponse(char *_code,ULONG _minisec)
{
ULONG stick=GetTickCount();
char szbuf[1024]={0};
int bytes_in=0;
while(GetTickCount()-stick<=_minisec)
{
bytes_in=recv(Sock,szbuf,sizeof(szbuf),0);
if(bytes_in>0)
{
szbuf[bytes_in]=0;
if( memcmp(szbuf,_code,3)==0 )
return TRUE;
}
} return FALSE;
}
BOOL CSendMail::CycleSendData(const std::string strdata)
{
int rt = 0;
int iTolLen = strdata.size();
char *ptr=new char[strdata.size()+1];
if (ptr==NULL)
return FALSE;
strcpy(ptr,strdata.c_str());
while(iTolLen>0)
{
rt = send(Sock,ptr,iTolLen,0);
Sleep(10);
if (rt == SOCKET_ERROR)
{
closesocket(Sock);
Sock = INVALID_SOCKET;
delete[] ptr;
return FALSE;
}
iTolLen -= rt;
if (iTolLen>0)
ptr += rt;
}
if (ptr != NULL)
delete[] ptr;
Sleep(10);
return TRUE;
}
www.cnanf.com中国协议分析网