当前位置:编程学习 > C#/ASP.NET >>

请帮忙调试、修改一段代码

因为本人对VC.net不熟悉,此段代码在VC.net 2005环境下错误太多,请熟悉VC.net编程的朋友帮忙。

#pragma once
#include "stdafx.h"
#using <mscorlib.dll>
#using <System.dll>

using namespace System;
using namespace System::IO;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Diagnostics;


namespace MailServer {

/// <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>
public ref class SMTPProcessor :  public System::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)
{
delete components;
}
}

private:
/// <summary>
/// 必需的设计器变量。
/// </summary>
Socket * socket;
// 判断客户端是否释放连接
bool quitRequested;
// 判断客户端数据部分是否开始
bool isDataPartStarted;
// 用于生成文件名
Guid messageID;


// 对客户端的命令进行处理
void Process(void)
{
String  * ClientMessage = String::Empty; //接受客户端信息
String  * ServerMessage = String::Empty; //服务器输出信息
bool first = true;
String  * welcome = String::Concat(S"220",
System::Environment::MachineName,
S" SMTP service ready at ", 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)
{
//建立NetworkStream
NetworkStream  * networkStream = new NetworkStream(socket);
//建立StreamReader,读取客户端输入信息
StreamReader  * streamReader = new StreamReader(networkStream);
//建立StreamWriter,写出服务器将要发出的信息
StreamWriter  * streamWriter = new StreamWriter(networkStream);
streamWriter -> AutoFlush = True;

if(first == True)
{
//如果刚刚建立连接,则输出welcome的内容
streamWriter -> WriteLine(welcome);
first = false;
}
clientMessage = streamReader -> ReadLine();  //读取客户端信息
Console::WriteLine(clientMessage);
//处理客户端命令
if(clientMessage -> ToUpper() -> StartsWith("HELO"));
{
//客户端命令:HELO
serverMessage = String::Concat(S"250 ",
System::Environment::MachineName, S" says Hello to [");
serverMessage = String::Concat(serverMessage,Dns::Resolve(
System::Environment::MachineName) -> AddressList[0] -> ToString(),S"]");
} //HELO
else if(clientMessage -> ToUpper() -> StartsWith("MAIL FROM: "))
{
//客户端命令: MAIL FROM
mailFrom = clientMessage -> Substring(clientMessage -> indexOf(": ") + 1) -> Trim();
//从命令中提取发信人邮箱地址
mailFrom = mailFrom -> Remove(0,1);
mailFrom = mailFrom -> Substringe(0,mailFrom -> Length - 1);
streamWriterFile -> WriteLine(String::Concat(S"mail from: ",mailFrom);
serverMessage = String::Concat(S"250 ",S"Sender OK");
} //MAIL FROM
else if (clientMessage->ToUpper()->StartsWith("RCPT TO:"))
{ //客户端命令:RCPT TO
mailTo = clientMessage -> Substring(clientMessage ->IndexOf(S": ") + 1) -> Trim();
mailTo = mailTo -> Remove(0,1);
mailTo = mailTo -> Substring(0,mailTo -> Length - 1);
streamWriterFile -> WriterLine(String::Concat(S"mail to: ",mailTo));
serverMessage = String::Concat(S"250", S"recipent OK");
} //RCPT TO
else if (clientMessage -> ToUpper() -> Equals("DATA"))
{ //客户端命令:DATA
isDataPartStarted = true; //数据部分开始标志
serverMessage = "354 Please Start mail input; end with <CRLF>.<CRLF>";
} //DATA
else if (isDataPartStarted)
{ //如果数据部分开始
while (true)
{ //读取数据直至读到"."
//将读取的数据部分写入文件
streamWriterFile -> WriterLine(clientMessage);
serverMessage = String::Empty; //服务器不发送命令

if(clientMessage -> Equals("."))
{
//如果读取的内容为".",表示数据部分已经结束
//数据开始部分的标志置为false
isDataPartStarted = false;
serverMessage = S"250 message accepted.";
break; //跳出循环
}
//读取数据内容
clientMessage = streamReader -> ReadLine();
Console::WriteLine(clientMessage);
}
}
else if (clientMessage -> ToUpper() -> Equals("QUIT"))
{ //客户端命令: QUIT
serverMessage = "221 Closing connection. Good Bye!";
quitRequested = true;
}
else
serverMessage = "500 Command unrecognized.";
//命令处理完成
if (serverMessage != "")
streamWriter -> WriterLine(serverMessage);
}
}
_finally
{ //关闭写入文件的streamWriter
if (streamWriterFile)
_try_cast <IDisposable * > (streamWriterFile) -> Dispose();
}
}


}

};
}
--------------------编程问答-------------------- 你应该将整个工程打包发上来,否则就这样一段代码,还要自己新建工程,配置环境,太麻烦了!

P.S.打包之前最好把 /Debug 和 /Release 下的文件都删除,然后添加上所需的 lib 文件或其他必需的文件。

方便他人==方便自己!!! --------------------编程问答-------------------- 如果你的邮件服务需要验证.这样编写SMTP.是不可以的.
补充:.NET技术 ,  VC.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,