[code=c] hostent *shost;
shost = gethostbyname("smtp.163.com");
SOCKADDR_IN soaddr;
soaddr.sin_family = AF_INET;
soaddr.sin_port = htons(25);
soaddr.sin_addr.S_un.S_addr = *(ULONG *)(shost->h_addr_list[0]); client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (client == INVALID_SOCKET)
{
return ;
}
if (SOCKET_ERROR == connect(client,(sockaddr*)&soaddr,sizeof((soaddr))))
{
MessageBox(NULL,"tsadfasd",NULL);
}
char buff[1024] = {0};
recv(client,buff,1024,0);
send(client,"ehlo hao\r\n",strlen("helo hao\r\n"),0);
recv(client,buff,1024,0); send(client,"auth login\r\n",strlen("auth login\r\n"),0);
recv(client,buff,1024,0);
//AfxMessageBox(buff);
send(client,"Z2c2NTI1XEXX\r\n",strlen("Z2c2NTI1XEXX\r\n"),0);//base64账号 我在这里就不写真号了
recv(client,buff,1024,0);
send(client,"MTM1NDU0OTc2cqq=\r\n",strlen("MTM1NDU0OTc2cqq=\r\n"),0););//base64密码 我在这里就不写真号了 recv(client,buff,1024,0);
send(client,"mail from:<[email protected]>\r\n",strlen("mail from:<[email protected]>\r\n"),0);
recv(client,buff,1024,0);
send(client,"rcpt to:<[email protected]>\r\n",strlen("rcpt to:<[email protected]>\r\n"),0);
recv(client,buff,1024,0);
send(client,"DATA\r\n",strlen("DATA\r\n"),0);
recv(client,buff,1024,0);
////在这里一切都是正常//////////////////就这里最后一步不知道怎么发邮件了
char str[]="from:[email protected]\r\nto:[email protected]\r\nsubject:sss\r\nssdsfsdf\r\n.\r\n";
send(client,str,strlen(str),0);
//////////////////就这里最后一步不知道怎么发邮件了我用telnet 发smtp协议邮件 正常
把代码办到vc里面 就最后一步 不正常求指教smtp邮件vc
shost = gethostbyname("smtp.163.com");
SOCKADDR_IN soaddr;
soaddr.sin_family = AF_INET;
soaddr.sin_port = htons(25);
soaddr.sin_addr.S_un.S_addr = *(ULONG *)(shost->h_addr_list[0]); client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (client == INVALID_SOCKET)
{
return ;
}
if (SOCKET_ERROR == connect(client,(sockaddr*)&soaddr,sizeof((soaddr))))
{
MessageBox(NULL,"tsadfasd",NULL);
}
char buff[1024] = {0};
recv(client,buff,1024,0);
send(client,"ehlo hao\r\n",strlen("helo hao\r\n"),0);
recv(client,buff,1024,0); send(client,"auth login\r\n",strlen("auth login\r\n"),0);
recv(client,buff,1024,0);
//AfxMessageBox(buff);
send(client,"Z2c2NTI1XEXX\r\n",strlen("Z2c2NTI1XEXX\r\n"),0);//base64账号 我在这里就不写真号了
recv(client,buff,1024,0);
send(client,"MTM1NDU0OTc2cqq=\r\n",strlen("MTM1NDU0OTc2cqq=\r\n"),0););//base64密码 我在这里就不写真号了 recv(client,buff,1024,0);
send(client,"mail from:<[email protected]>\r\n",strlen("mail from:<[email protected]>\r\n"),0);
recv(client,buff,1024,0);
send(client,"rcpt to:<[email protected]>\r\n",strlen("rcpt to:<[email protected]>\r\n"),0);
recv(client,buff,1024,0);
send(client,"DATA\r\n",strlen("DATA\r\n"),0);
recv(client,buff,1024,0);
////在这里一切都是正常//////////////////就这里最后一步不知道怎么发邮件了
char str[]="from:[email protected]\r\nto:[email protected]\r\nsubject:sss\r\nssdsfsdf\r\n.\r\n";
send(client,str,strlen(str),0);
//////////////////就这里最后一步不知道怎么发邮件了我用telnet 发smtp协议邮件 正常
把代码办到vc里面 就最后一步 不正常求指教smtp邮件vc
解决方案 »
- 自己尝试写一个CString类,一个关于“+”操作符重载的问题
- 使用OPENSSL的EVP_EncodeBlock函数进行BASE64编码的困惑。
- CListCtrl中动态的改变行的颜色以及在动态的添加checkbox
- VC登录窗口怎么修改?
- Picture 控件中显示图片的问题??
- 关于ListCtrl 的问题
- 问一个关于生成exe文件的问题!!
- 我用ADO绑定更新记录失败,请高手指教
- 问一个关于学习vc中碰到的问题,请高手解答。
- 怎样在vc中调用磁盘检查程序(win2000里面)!!!高分!!!急用!!!!
- 请问:MFC使用兼容DC绘图时,如何分层绘图?
- 调用com组件 出错 0x800a03ec
int CDlg::SendEmail(char* pFile,char* pReciver,char* pSubject,char* pContent)
{
int nRet = -1;
if (pReciver == NULL)
{
return 1;
}
if (NULL == pSubject)
{
//主题是否为空
}
if (NULL == pContent)
{
//内容是否为空
} WSAData data;
int error;
error = WSAStartup(MAKEWORD(2, 2), &data);
if (0 != error)
{
return -1;
}
if(HIBYTE(data.wVersion) != 2 && LOBYTE(data.wVersion))
{
WSACleanup();
return -1;
}
SOCKET sConn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKADDR_IN sock_addr = { 0 } ;
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(25);
struct hostent *phost = gethostbyname("smtp.163.com");
memcpy(&sock_addr.sin_addr.S_un.S_addr , phost->h_addr_list[0] , phost->h_length ); if (connect(sConn,(SOCKADDR*)&sock_addr,sizeof(SOCKADDR_IN)))
{
//未连接
int nError = GetLastError();
TRACE("ERROR = %d",nError);
nRet = 1;
closesocket(sConn);
return nRet;
} char szTemp[1024] = {0};
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 220)
{
//邮箱服务器不可用
nRet = 2;
closesocket(sConn);
return nRet;
}
} CString strSend;
strSend.Format(_T("EHLO %s\r\n"), "smtp.163.com"); if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 250)
{
//服务器错误
nRet = 3;
closesocket(sConn);
return nRet;
}
}
}
strSend.Empty();
strSend = "AUTH LOGIN\r\n";
if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 334)
{
//验证连接错误
nRet = 4;
closesocket(sConn);
return nRet;
}
}
}
CBase64 Base64;
strSend.Empty();
strSend.Format("%s\r\n", Base64.Encode(m_szUserName, strlen(m_szUserName)));
if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 334)
{
//验证连接错误
nRet = 4;
closesocket(sConn);
return nRet;
}
}
} strSend.Empty();
strSend.Format("%s\r\n", Base64.Encode(m_szPassWord, strlen(m_szPassWord)));
if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 235)
{
//用户名或密码验证错误
nRet = 5;
closesocket(sConn);
return nRet;
}
}
} strSend.Empty();
strSend.Format(_T("MAIL FROM:<%s>\r\n"), XXXXX);//[email protected]
if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 250)
{
//邮箱服务器错误
nRet = 6;
closesocket(sConn);
return nRet;
}
}
} strSend.Empty();
strSend.Format(_T("RCPT TO:<%s>\r\n"),pReciver);
if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 250)
{
//邮箱服务器错误
nRet = 7;
closesocket(sConn);
return nRet;
}
}
} strSend.Empty();
strSend = "DATA\r\n";
if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 354)
{
//邮箱服务器不能接收数据
nRet = 8;
closesocket(sConn);
return nRet;
}
}
}
CString szFrom;
CString szTo;
CString szDateTime;
CString szSubject;
CString szBodyHead;
CString szBody;
CString szContent;
CString szAttachment;
CString strTemp; szFrom.Format(_T("FROM:%s<%s>\r\n"),xxxxx,xxxxxx);
szTo.Format(_T("TO:<%s>\r\n"),pReciver);
CTime tDateTime = tDateTime.GetCurrentTime();
szDateTime = "Date:";
szDateTime += tDateTime.Format("%a, %d %b %Y %H:%M:%S %Z");
szDateTime += "\r\n";
szSubject.Format(_T("Subject:%s\r\n"),pSubject);
szBodyHead = "X-Mailer: Test [ch]\r\n";
szBodyHead += "MIME_Version:1.0\r\n";
szBodyHead += "Content-type:multipart/mixed;Boundary=Test\r\n\r\n";
szBodyHead += "--Test\r\n";
szBodyHead += "Content-type:text/plain;Charset=gb2312\r\n";
szBodyHead += "Content-Transfer-Encoding:8bit\r\n\r\n";
szBody.Format(_T("%s\r\n\r\n"), pContent); //以下进行附件的处理:
if(pFile[0] != '\0')
{
strTemp = "--Test\r\n";
strTemp += "Content-Type:application/octet-stream;Name=%s\r\n";
strTemp += "Content-Disposition:attachment;FileName=%s\r\n";
strTemp += "Content-Transfer-Encoding:Base64\r\n\r\n";
strTemp += "%s\r\n\r\n"; szContent = szFrom + szTo + szDateTime + szSubject + szBodyHead + szBody; char sep[2] = ";";
char* pPos = NULL;
char* token = NULL;
char* next;
int nCount = 0;
token = strtok_s(pFile,sep,&next);
while (token != NULL)
{
CFile hFile;
if(hFile.Open(token, CFile::modeRead))
{
DWORD dwFileSize = hFile.GetLength();
CString szFileBuffer;
hFile.Read(szFileBuffer.GetBuffer(dwFileSize), dwFileSize);
szAttachment.Format(strTemp.GetBuffer(), hFile.GetFileName(), hFile.GetFileName(), Base64.Encode(szFileBuffer, dwFileSize));
szFileBuffer.ReleaseBuffer();
hFile.Close();
szContent += szAttachment;
}
else
{
int nError = GetLastError();
TRACE("ERROR = %d\n",nError);
nRet = 9;
closesocket(sConn);
return nRet;
}
token = strtok_s(NULL, sep, &next);
}
szContent += "--Test--\r\n.\r\n";
}
else
{
szContent = szFrom + szTo + szDateTime + szSubject + szBodyHead + szBody + "--Test" + "\r\n.\r\n";
} if (send(sConn,(char*)szContent.GetBuffer(),szContent.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 250)
{
//邮箱服务器错误
nRet = 10;
closesocket(sConn);
return nRet;
}
}
} strSend.Empty();
strSend = "QUIT\r\n";
if (send(sConn,(char*)strSend.GetBuffer(),strSend.GetLength(),0) > 0)
{
memset(szTemp,0,1024);
if (recv(sConn,szTemp,1024,0) > 0)
{
int response = -1;
CString sResponse = szTemp;
sscanf((LPCTSTR)sResponse.Left(3), _T("%d"), &response);
if (response != 221)
{
//没有中止会话
nRet = 11;
closesocket(sConn);
return nRet;
}
}
}
nRet = 0;
return nRet;
}
xxxxx的地方你改改.
给分吧....
我就是最后一句格式错了
不知道怎么改smtp协议中 '.' 表示发信内容结束. 你把'.' 改掉了. 我试了没用
send(client,str,strlen(str),0);这样可以吗?
TO:<[email protected]>
Date:Thu, 31 Oct 2013 18:23:28 中国标准时间
Subject:关于测试的问题
X-Mailer: Test [ch]
MIME_Version:1.0
Content-type:multipart/mixed;Boundary=Test--Test
Content-type:text/plain;Charset=gb2312
Content-Transfer-Encoding:8bit您好! 欢迎来到测试天地. 谢谢!--Test
.
上面就是格式
最后这些东西都是rfc文档,具体哪个忘了,自己去搜搜