怎样完全实现POP3收邮件?~~

sunlazy 2003-04-03 01:19:10
目前大家都会用SMTP去发邮件,但怎样完全实现POP3收邮件确很少见。网上的有个POP3收件的,但根本不可行,请问哪位能对这方面有所了解?谢谢!
...全文
81 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hcfalan 2003-04-04
  • 打赏
  • 举报
回复
一个封装的POP3类
// 使用方法
Pop3 thepop = new Pop3();
thepop.Host = "pop3.sohu.com"; // 设置POP3服务器
thepop.User = "hcfalan";// 帐号
thepop.Password="*****";// 密码
if( !thepop.Connect() )
{
MessageBox.Show("ERROR:"+thepop.ErrorMessage);
return;
}
if( thepop.Retrieve(1) ) //接收第1封邮件
{
MessageBox.Show("邮件内容:\r\n"thepop.MsgContents );
}

// 附:源代码
public class Pop3
{
private static int CONNECTION_CHECK = 0;
private static int USER_CHECK = 1;
private static int PASSWORD_CHECK = 2;
private static int QUIT_CHECK = 3;
private static int DELETE_CHECK = 4;
private static int RSET_CHECK = 5;
private static int STAT_CHECK = 6;
private static int NOOP_CHECK = 7;
private static int LIST_CHECK = 8;
private static int RETR_CHECK = 9;

private string m_ErrorMessage;
private string m_Password;
private String m_User;
private String m_Host;
private String m_MsgContents;
private int m_TotalSize;
private int m_NumberMail;
private System.Net.Sockets.TcpClient m_Client;
private System.Net.Sockets.NetworkStream netStream;
private System.Collections.ArrayList m_SizeOfMsg = new System.Collections.ArrayList();

// Constructor and Destructor
public Pop3()
{
m_Client = new TcpClient();
}

protected void Finalize()
{
netStream.Close();
m_Client.Close();
}
// Properties
public string MsgContents
{
get
{
return m_MsgContents;
}
}

public int NumberOfMails
{
get
{
return m_NumberMail;
}
}

public int TotalMailSize
{
get
{
return m_TotalSize;
}
}

public string Host
{
set
{
m_Host = value;
}
get
{
return m_Host;
}
}

public string User
{
set
{
m_User = value;
}
get
{
return m_User;
}
}

public string Password
{
set
{
m_Password = value;
}
get
{
return m_Password;
}
}

public string ErrorMessage
{
get
{
return m_ErrorMessage;
}
}

// Public Methods
public bool Connect(String Host, String User, String Password)
{
try
{
m_Client.Connect( Host, 110);
netStream = m_Client.GetStream();
}
catch
{
m_ErrorMessage = "Server cannot be connected";
return false;
}
if (CheckResponse(CONNECTION_CHECK)==false)
{
return false;
}
SendCommand( "USER "+ User );
if( CheckResponse(USER_CHECK) == false)
return false;
SendCommand( "PASS "+Password );
if( CheckResponse(PASSWORD_CHECK) == false)
return false;
return true;
}

public bool Statistics()
{
// "STAT \r\n"
SendCommand("STAT");
return CheckResponse(STAT_CHECK);
}
public bool Delete(int MsgNumber)
{
// "DELE %d\r\n",MsgNumber
SendCommand( "DELE " + MsgNumber.ToString() );
return CheckResponse(DELETE_CHECK);
}

public bool Quit()
{
// "QUIT \r\n"
SendCommand("QUIT");
return CheckResponse(QUIT_CHECK);
}

public bool Noop()
{
// "NOOP \r\n"
SendCommand("NOOP");
return CheckResponse(NOOP_CHECK);
}

public bool Reset()
{
// "RSET \r\n"
SendCommand("RSET");
return CheckResponse(RSET_CHECK);
}

public bool Retrieve(int MsgNumber)
{
// "RETR %d\r\n",MsgNumber
SendCommand("RETR "+MsgNumber.ToString());
return CheckResponse(RETR_CHECK);
}

public bool Connect()
{
try
{
Connect(m_Host, m_User, m_Password);
}
catch
{
return false;
}
return true;
}

public bool List()
{
// "LIST \r\n"
SendCommand("LIST");
return CheckResponse(LIST_CHECK);
}
public int GetMessageSize(int MsgNumber)
{
if(m_SizeOfMsg.Count < MsgNumber)
return 0;
else
return (int)m_SizeOfMsg[MsgNumber-1];
}

public bool CheckResponse(int ResponseType)
{
string buf = ReadResponse();
switch (ResponseType)
{
case 0://CONNECTION_CHECK:
if ( buf.IndexOf("-ERR")!=-1 )
{
m_ErrorMessage = "Bad Connection";
return false;
}
break;
case 1://USER_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Bad User Name";
return false;
}
break;
case 2://PASSWORD_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Bad Password Name";
return false;
}
break;
case 3://QUIT_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Error occured during QUIT";
return false;
}
break;
case 4://DELETE_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Error occured during DELE";
return false;
}
break;
case 5://RSET_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Error occured during RSET";
return false;
}
break;
case 6://STAT_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Error occured during STAT";
return false;
}
else
{
string[] ss = buf.Split( new char[]{' '});
m_NumberMail = Int32.Parse(ss[1]);
m_TotalSize = Int32.Parse(ss[2]);
}
break;
case 7://NOOP_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Error occured during NOOP";
return false;
}
break;
case 8://LIST_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Error occured during LIST";
return false;
}
else
{
// TODO: recv info into buffer here
buf = ReadResponse();
buf = buf.Replace("\r\n", " ");
string[] ss = buf.Split( new char[]{' '});
for (int i=1; i<ss.Length-1; i+=2)
{
m_SizeOfMsg.Add( Int32.Parse(ss[i]) );
}
}
break;
case 9://RETR_CHECK:
if (buf.IndexOf("-ERR")!=-1)
{
m_ErrorMessage = "Error occured during RETR";
return false;
}
else
{
m_MsgContents = ReadResponse();
}
break;
}
return true;
}


// Private Methods
private void SendCommand( string cmd )
{
string strToSend = cmd + "\r\n";
byte[] buf = System.Text.Encoding.ASCII.GetBytes( strToSend );
netStream.Write(buf, 0, buf.Length);
}

private string ReadResponse()
{
StringBuilder recv = new StringBuilder();
byte[] buf = new byte[1024];
int recvCnt = 0;
while(true)
{
recvCnt = netStream.Read(buf, 0, buf.Length);
recv.Append( System.Text.Encoding.ASCII.GetString(buf,0,recvCnt) );
if (recvCnt!=1024)
break;
}
return recv.ToString();
}
}
abkn 2003-04-03
  • 打赏
  • 举报
回复
我的是exe
abkn 2003-04-03
  • 打赏
  • 举报
回复
我有一个收邮件的,只能收,不能发
lisi 2003-04-03
  • 打赏
  • 举报
回复
这很简单,和发邮件类似,几乎没区别。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧