软件发布,欢迎测试 能给你的源码吗?我想看一下SMTP扩展认证的那一部分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ironsmith(三无人员): 老大,总共程序才33K,等我发邮件,还不如你直接下载。 wuzhibiao(竹子): "HELO"之后:"AUTH LOGIN"->"334 enter username"->"username"->"334 enter password"->"password"->"忘了,反正就是判断授权成功与否的信息" 引号内小写字母全为Base64编码。 真是太好了,我是vc++新手,正在学习编写用smtp发e-mail的程序,我实在搞不清怎么能通过身份认证,能把源代码发给我看看吗?[email protected] 多谢了! 各位大虾,请问:553:SMTP Server error 是怎么回事?为什么会发生这样的错误呢? 鉴于多人对SMTP的认证感兴趣,特将相关代码贴出,希望对各位有所帮助/*本函数用于在一个线程中发送邮件,线程调用各个特定函数完成特定功能,并针对不同功能完成情况决定下一步将完成什么功能*/DWORD WINAPI SendMailThread(LPVOID p){ int ret,ret0,isOK; isOK=1; CSMTPSocket * pSS=static_cast<CSMTPSocket *> (p); /*初始化Socket*/ ret0=pSS->ReadySocket(); /*此函数在界面上显示当前进度*/ pSS->SetProcessStatusInfo(1,ret0); /*程序在各个功能中选择执行,似乎用简单的While之类语句不好实现,我又不想用Goto,所以用了权值判断,在各个功能完成时根据完成情况设定权值,据此进行下一步操作*/ if (1==ret0) ret=3*5*7*11*13; else return -1; while (ret>0) { switch(ret) { /*(正常情况下)*/ /*第一步:连接服务器(包括发送“HELO”命令)*/ case (3*5*7*11*13): ret0=pSS->ConnectServer(); isOK=ret0<isOK?ret0:isOK; pSS->SetProcessStatusInfo(2,ret0); if (1==ret0) ret=5*7*11*13; else ret=13; break; case (5*7*11*13): if(pSS->m_bNeedAuth) { /*第二步:送完“HELO”,如果服务器需要授权,则发送之*/ ret0=pSS->LoginServer(); pSS->SetProcessStatusInfo(3,ret0); } else ret0=1; isOK=ret0<isOK?ret0:isOK; if (1==ret0) ret=7*11*13; else if (0==ret0) ret=11*13; else ret=13; break; case (7*11*13): /*第三步:发送数据(要分收件人发送,也在此函数中一起处理了)*/ ret0=pSS->SendMailData(); isOK=ret0<isOK?ret0:isOK; pSS->SetProcessStatusInfo(4,ret0); if ((1==ret0)||(0==ret0)) ret=11*13; else ret=13; break; case (11*13): /*第四步:退出*/ ret0=pSS->LogoutServer(); isOK=ret0<isOK?ret0:isOK; pSS->SetProcessStatusInfo(5,ret0); ret=13; break; case 13: /*第五步:关闭*/ ret0=pSS->CloseSocket(); isOK=ret0<isOK?ret0:isOK; pSS->SetProcessStatusInfo(6,isOK); ret=0; break; default: ret=0; break; } } return 0;}/*本函数完成登陆功能*/int CSMTPSocket::LoginServer(){ int ret; if (NULL==m_pSocket) { m_LastError="CSMTPSocket::LoginServer() Unhandle error on socket"; WriteError(m_LastError); return 0; } if (!m_bNeedAuth) return 1; /*密码和用户名已经编码为Base64方式*/ if ((m_strPasswordB=="")||(""==m_strUserNameB)) { m_LastError="CSMTPSocket::LoginServer() Imperfect setting"; WriteError(m_LastError); return 0; } m_strCommand="Say \"AUTH LOGIN\" to server"; /*表示客户端将开始登陆*/ if (SOCKET_ERROR==m_pSocket->Send("AUTH LOGIN\r\n",12)) { m_LastError.Format("CSMTPSocket::LoginServer() Send \"AUTH\" Error %d",GetLastError()); WriteError(m_LastError); return 0; } if ((ret=CheckAvailability())==0) return 0; else if (ret==-1) return -1; m_strCommand="Send Username to server"; /*发送用户名*/ if (SOCKET_ERROR==m_pSocket->Send(m_strUserNameB,m_strUserNameB.GetLength())) { m_LastError.Format("CSMTPSocket::LoginServer() Send username error %d",GetLastError()); WriteError(m_LastError); return 0; } /*判断反馈信息是否正确*/ if ((ret=CheckAvailability())==0) return 0; else if (ret==-1) return -1; m_strCommand="Send password to server"; /*发送密码*/ if (SOCKET_ERROR==m_pSocket->Send(m_strPasswordB,m_strPasswordB.GetLength())) { m_LastError.Format("CSMTPSocket::LoginServer() Send password error %d",GetLastError()); WriteError(m_LastError); return 0; } /*判断反馈信息是否正确*/ if ((ret=CheckAvailability())==0) return 0; else if (ret==-1) return -1; return 1;} tab控件使用问题//create函数怎么创建是以下这种形状? 用OpenGL做界面,是不是就是Direct UI ? ? 如何在程序中改变控制台程序的exe 文件的图标?马上给分 关于union的问题? 消息断点的设置? 超级菜的问题(给分!!!) afxMessageBox()问题! 关于数据库的简单问题送分了啊!up不给 谁有VC5.0光盘,请把CAB&SIGN目录下的文件email给我,感激!!! 进程外服务器与客户端的数据交互原理! 请问Unicode到底是什么概念,能不对其实质的大家讨论一下? 天同请近来,关于多线程网络编程和访问数据库还有标准SQL
老大,总共程序才33K,等我发邮件,还不如你直接下载。
wuzhibiao(竹子):
"HELO"之后:"AUTH LOGIN"->"334 enter username"->"username"->"334 enter password"->"password"->"忘了,反正就是判断授权成功与否的信息" 引号内小写字母全为Base64编码。
我是vc++新手,正在学习编写用smtp发e-mail的程序,
我实在搞不清怎么能通过身份认证,能把源代码发给我看看吗?
[email protected] 多谢了!
553:SMTP Server error 是怎么回事?
为什么会发生这样的错误呢?
DWORD WINAPI SendMailThread(LPVOID p)
{
int ret,ret0,isOK;
isOK=1;
CSMTPSocket * pSS=static_cast<CSMTPSocket *> (p);
/*初始化Socket*/
ret0=pSS->ReadySocket();
/*此函数在界面上显示当前进度*/
pSS->SetProcessStatusInfo(1,ret0);
/*程序在各个功能中选择执行,似乎用简单的While之类语句不好实现,我又不想用Goto,所以用了权值判断,在各个功能完成时根据完成情况设定权值,据此进行下一步操作*/
if (1==ret0)
ret=3*5*7*11*13;
else
return -1;
while (ret>0)
{
switch(ret)
{
/*(正常情况下)*/
/*第一步:连接服务器(包括发送“HELO”命令)*/
case (3*5*7*11*13):
ret0=pSS->ConnectServer();
isOK=ret0<isOK?ret0:isOK;
pSS->SetProcessStatusInfo(2,ret0);
if (1==ret0)
ret=5*7*11*13;
else
ret=13;
break;
case (5*7*11*13):
if(pSS->m_bNeedAuth)
{
/*第二步:送完“HELO”,如果服务器需要授权,则发送之*/
ret0=pSS->LoginServer();
pSS->SetProcessStatusInfo(3,ret0);
}
else
ret0=1;
isOK=ret0<isOK?ret0:isOK;
if (1==ret0)
ret=7*11*13;
else if (0==ret0)
ret=11*13;
else
ret=13;
break;
case (7*11*13):
/*第三步:发送数据(要分收件人发送,也在此函数中一起处理了)*/
ret0=pSS->SendMailData();
isOK=ret0<isOK?ret0:isOK;
pSS->SetProcessStatusInfo(4,ret0);
if ((1==ret0)||(0==ret0))
ret=11*13;
else
ret=13;
break;
case (11*13):
/*第四步:退出*/
ret0=pSS->LogoutServer();
isOK=ret0<isOK?ret0:isOK;
pSS->SetProcessStatusInfo(5,ret0);
ret=13;
break;
case 13:
/*第五步:关闭*/
ret0=pSS->CloseSocket();
isOK=ret0<isOK?ret0:isOK;
pSS->SetProcessStatusInfo(6,isOK);
ret=0;
break;
default:
ret=0;
break;
}
}
return 0;
}/*本函数完成登陆功能*/
int CSMTPSocket::LoginServer()
{
int ret;
if (NULL==m_pSocket)
{
m_LastError="CSMTPSocket::LoginServer() Unhandle error on socket";
WriteError(m_LastError);
return 0;
}
if (!m_bNeedAuth)
return 1;
/*密码和用户名已经编码为Base64方式*/
if ((m_strPasswordB=="")||(""==m_strUserNameB))
{
m_LastError="CSMTPSocket::LoginServer() Imperfect setting";
WriteError(m_LastError);
return 0;
}
m_strCommand="Say \"AUTH LOGIN\" to server";
/*表示客户端将开始登陆*/
if (SOCKET_ERROR==m_pSocket->Send("AUTH LOGIN\r\n",12))
{
m_LastError.Format("CSMTPSocket::LoginServer() Send \"AUTH\" Error %d",GetLastError());
WriteError(m_LastError);
return 0;
}
if ((ret=CheckAvailability())==0)
return 0;
else if (ret==-1)
return -1;
m_strCommand="Send Username to server";
/*发送用户名*/
if (SOCKET_ERROR==m_pSocket->Send(m_strUserNameB,m_strUserNameB.GetLength()))
{
m_LastError.Format("CSMTPSocket::LoginServer() Send username error %d",GetLastError());
WriteError(m_LastError);
return 0;
}
/*判断反馈信息是否正确*/
if ((ret=CheckAvailability())==0)
return 0;
else if (ret==-1)
return -1;
m_strCommand="Send password to server";
/*发送密码*/
if (SOCKET_ERROR==m_pSocket->Send(m_strPasswordB,m_strPasswordB.GetLength()))
{
m_LastError.Format("CSMTPSocket::LoginServer() Send password error %d",GetLastError());
WriteError(m_LastError);
return 0;
}
/*判断反馈信息是否正确*/
if ((ret=CheckAvailability())==0)
return 0;
else if (ret==-1)
return -1;
return 1;
}