问题描述
因为本人对VC.net不熟悉,此段代码在VC.net2005环境下错误太多,请熟悉VC.net编程的朋友帮忙。#pragmaonce#include"stdafx.h"#using<mscorlib.dll>#using<System.dll>usingnamespaceSystem;usingnamespaceSystem::IO;usingnamespaceSystem::Net;usingnamespaceSystem::Net::Sockets;usingnamespaceSystem::ComponentModel;usingnamespaceSystem::Collections;usingnamespaceSystem::Diagnostics;namespaceMailServer{///<summary>///SMTPProcessor摘要///SMTP协议负责电子邮件的上传。具体分为客户端对服务器的上传,服务器对服务器间的局间上传///SMTP是请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符号结束。响应包括一个表示返回状态的三位数字代码///SMTP在TCP协议25号端口监听连接请求//////连接和发送过程//1.建立TCP连接//2.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令。服务器端以OK作为响应,表明准备接受。//3.客户端发送RCPT命令,以标识该电子邮件的计划接收者,可以有多个RCPT行。服务器端则表示是否愿意为收件人接收电子邮件。//4.协商结束,发送电子邮件,用命令DATA发送。//5.以"."表示结束输入内容一起发送出去。//6.结束此次发送,用QUIT命令退出。///</summary>publicrefclassSMTPProcessor:publicSystem::ComponentModel::Component{public://构造函数SMTPProcessor(Socket*_socket){//:socket(NULL)//,quitRequested(false)//,isDataPartStarted(false)//InitializeComponent();socket=_socket;quitRequested=false;isDataPartStarted=false;messageID=System::Guid::NewGuid();//为文件生成全局唯一标识符}SMTPProcessor(System::ComponentModel::IContainer^container){///<summary>///Windows.Forms类撰写设计器支持所必需的///</summary>container->Add(this);InitializeComponent();}protected:///<summary>///清理所有正在使用的资源。///</summary>~SMTPProcessor(){if(components){deletecomponents;}}private:///<summary>///必需的设计器变量。///</summary>Socket*socket;//判断客户端是否释放连接boolquitRequested;//判断客户端数据部分是否开始boolisDataPartStarted;//用于生成文件名GuidmessageID;//对客户端的命令进行处理voidProcess(void){String*ClientMessage=String::Empty;//接受客户端信息String*ServerMessage=String::Empty;//服务器输出信息boolfirst=true;String*welcome=String::Concat(S"220",System::Environment::MachineName,S"SMTPservicereadyat",DateTime::Now.ToString());String*filePath=String::Concat(S"\",messageID.ToString(),S".txt");String*mailFrom=String::Empty;String*mailTo=String::Empty;if(!File::Exists(filePath)){//用此变量向文件写入邮件内容StreamWriter*streamWriterFile=File::CreateText(filePath);try{while(!quitRequested){//建立NetworkStreamNetworkStream*networkStream=newNetworkStream(socket);//建立StreamReader,读取客户端输入信息StreamReader*streamReader=newStreamReader(networkStream);//建立StreamWriter,写出服务器将要发出的信息StreamWriter*streamWriter=newStreamWriter(networkStream);streamWriter->AutoFlush=True;if(first==True){//如果刚刚建立连接,则输出welcome的内容streamWriter->WriteLine(welcome);first=false;}clientMessage=streamReader->ReadLine();//读取客户端信息Console::WriteLine(clientMessage);//处理客户端命令if(clientMessage->ToUpper()->StartsWith("HELO"));{//客户端命令:HELOserverMessage=String::Concat(S"250",System::Environment::MachineName,S"saysHelloto[");serverMessage=String::Concat(serverMessage,Dns::Resolve(System::Environment::MachineName)->AddressList[0]->ToString(),S"]");}//HELOelseif(clientMessage->ToUpper()->StartsWith("MAILFROM:")){//客户端命令:MAILFROMmailFrom=clientMessage->Substring(clientMessage->indexOf(":")+1)->Trim();//从命令中提取发信人邮箱地址mailFrom=mailFrom->Remove(0,1);mailFrom=mailFrom->Substringe(0,mailFrom->Length-1);streamWriterFile->WriteLine(String::Concat(S"mailfrom:",mailFrom);serverMessage=String::Concat(S"250",S"SenderOK");}//MAILFROMelseif(clientMessage->ToUpper()->StartsWith("RCPTTO:")){//客户端命令:RCPTTOmailTo=clientMessage->Substring(clientMessage->IndexOf(S":")+1)->Trim();mailTo=mailTo->Remove(0,1);mailTo=mailTo->Substring(0,mailTo->Length-1);streamWriterFile->WriterLine(String::Concat(S"mailto:",mailTo));serverMessage=String::Concat(S"250",S"recipentOK");}//RCPTTOelseif(clientMessage->ToUpper()->Equals("DATA")){//客户端命令:DATAisDataPartStarted=true;//数据部分开始标志serverMessage="354PleaseStartmailinput;endwith<CRLF>.<CRLF>";}//DATAelseif(isDataPartStarted){//如果数据部分开始while(true){//读取数据直至读到"."//将读取的数据部分写入文件streamWriterFile->WriterLine(clientMessage);serverMessage=String::Empty;//服务器不发送命令if(clientMessage->Equals(".")){//如果读取的内容为".",表示数据部分已经结束//数据开始部分的标志置为falseisDataPartStarted=false;serverMessage=S"250messageaccepted.";break;//跳出循环}//读取数据内容clientMessage=streamReader->ReadLine();Console::WriteLine(clientMessage);}}elseif(clientMessage->ToUpper()->Equals("QUIT")){//客户端命令:QUITserverMessage="221Closingconnection.GoodBye!";quitRequested=true;}elseserverMessage="500Commandunrecognized.";//命令处理完成if(serverMessage!="")streamWriter->WriterLine(serverMessage);}}_finally{//关闭写入文件的streamWriterif(streamWriterFile)_try_cast<IDisposable*>(streamWriterFile)->Dispose();}}}};}
解决方案
解决方案二:
你应该将整个工程打包发上来,否则就这样一段代码,还要自己新建工程,配置环境,太麻烦了!P.S.打包之前最好把/Debug和/Release下的文件都删除,然后添加上所需的lib文件或其他必需的文件。方便他人==方便自己!!!
解决方案三:
如果你的邮件服务需要验证.这样编写SMTP.是不可以的.