4.2有关邮件收发系统的协议二POP3
4.2.1POP3协议流程
POP3流程
1、 认证
2、 邮件接收
3、 根据Transaction流程的定义,更新邮件信箱。
与SMTP相比,POP3的指令内容较为简单,因为在每个阶段,RFC均定义了客户端所发送指令的格式以及服务器端响应的内容。
(1) 客户端所发送的指令必须以CRLF结尾。
(2) 服务器响应的信息,只用两种情况。
+OK:表示指令正确执行
-ERR:表示指令执行错误。
此外,在POP3的每个阶段,均有相应的指令应用。
4.2.2认证阶段指令
认证阶段指令
指令 语法
USER USER<loginname>
PASS PASS<password>
QUIT QUIT
代码如下:
//Socket初始化
Socket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接服务器
try
{
ClientSocket.Connect(RecServer, int.Parse(RecServerPort));
}
catch (Exception ex) { throw new MyException("从<" + MailAddress + ">接收邮件失败:" + ex.Message); }
Rec(ClientSocket);
if (RecString.IndexOf("OK") < 0)
{
ClientSocket.Close();
throw new MyException("从<" + MailAddress + ">接收邮件失败:错误发生在与服务器的连接!");
}
//发送USER
ClientSocket.Send(System.Text.Encoding.Default.GetBytes("user " + RecServerUser + "\r\n"));
Rec(ClientSocket);
if (RecString.IndexOf("OK") < 0)
{
ClientSocket.Close();
throw new MyException("从<" + MailAddress + ">接收邮件失败:错误发生在用户名校验!");
}
//发送PASS
ClientSocket.Send(System.Text.Encoding.Default.GetBytes("pass " + RecServerPassword + "\r\n"));
Rec(ClientSocket);
if (RecString.IndexOf("OK") < 0)
{
ClientSocket.Close();
throw new MyException("从<" + MailAddress + ">接收邮件失败:错误发生在密码校验!");
}
4.2.3邮件发送阶段指令
邮件发送阶段指令
指令 语法
STAT STAT
LIST LIST(mail#)
RETR RETR[mail#]
DELE DELE
NOOP NOOP
RSET RSET
代码如下:
//发送STAT
ClientSocket.Send(System.Text.Encoding.Default.GetBytes("stat\r\n"));
Rec(ClientSocket);
if (RecString.IndexOf("OK") < 0)
{
ClientSocket.Close();
throw new MyException("从<" + MailAddress + ">接收邮件失败:错误发生在通知收件服务器准备接受邮件!");
}
string[] RecStrings = RecString.Split(' ');
int Count = Int32.Parse(RecStrings[1]);
//发送LIST
ClientSocket.Send(System.Text.Encoding.Default.GetBytes("list\r\n"));
Rec(ClientSocket);
if (RecString.IndexOf("OK") < 0)
{
ClientSocket.Close();
throw new MyException("从<" + MailAddress + ">接收邮件失败:错误发生在从服务器中获得邮件列表和字节大小!");
}
//获取邮件
for (int a = 1; a <= Count; a++)
{
Thread.Sleep(100);
ClientSocket.Send(System.Text.Encoding.Default.GetBytes("retr " + a + "\r\n"));
Rec(ClientSocket);
string RecvMail = "";//清除提示信息
while (RecvMail.IndexOf("\r\n.\r\n") < 0)
{
Len = ClientSocket.Receive(Buff);
RecvMail += System.Text.Encoding.Default.GetString(Buff, 0, Len);
} if (!IsLeaveMessage)
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>