Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2323070
  • 博文数量: 535
  • 博客积分: 8689
  • 博客等级: 中将
  • 技术积分: 7066
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-26 10:00
文章分类

全部博文(535)

文章存档

2024年(4)

2023年(4)

2022年(16)

2014年(90)

2013年(76)

2012年(125)

2011年(184)

2010年(37)

分类: LINUX

2010-11-27 12:38:24

SMTP 命令简介

什么是 SMTP
SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25 端口监听连接请求。

什么是 ESMTP
ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。

SMTP 命令
SMTP 命令包括:
HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。 
EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM 命令中指定的地址是发件人地址
RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。
DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束 
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令 
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用 
HELP 查询服务器支持什么命令 
NOOP 无操作,服务器应响应 OK 
RSET 重置会话,当前传输被取消
QUIT 结束会话 

连接到 Postfix 使用 SMTP 命令发送邮件
例如:安装 Postfix 的邮件服务器IP是192.168.0.1 (蓝色字体内容由客户端输入,红色字体内容是服务返回的)

telnet 192.168.0.1 25 --------------------------------------- 使用 telnet 命令连接服务器 25 端口 
Trying 192.168.0.1... --------------------------------------- 正在连接服务器 25 端口 
Connected to 192.168.0.1. ----------------------------------- 连接服务器 25 端口成功 
220 localhost ESMTP Postfix - by ExtMail -------------------- 显示服务器标识 ( 修改main.cf 的smtpd_banner) 
helo test.com ----------------------------------------------- 向服务器标识用户身份,发信不要认证,跳过下面几步直接发送 mail from 命令 
250 localhost
ehlo test.com ------------------------------------------------ ESMTP 命令,发信需要认证。
250-localhost
250-PIPELINING
250-SIZE 102400000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login ------------------------------------------------- 进行用户身份认证 
334 VXNlcm5hbWU6 
Y29zdGFAYW1heGl0Lm5ldA== ----------------------------------- BASE64 加密后的用户名 
334 UGFzc3dvcmQ6 
MTk4MjIxNA== ----------------------------------------------- BASE64 加密后的密码 
235 authentication successfully ---------------------------- 身份认证成功 
(535 authentication failed --------------------------------- 身份认证失败)
发到本系统中域名下的账户可跳过身份认证。
mail from: <> ------------------------------ mail from 地址 
250 ok ----------------------------------------------------- 命令执行成功 
rcpt to: <> -------------------------------- 递送给地址 
250 ok ----------------------------------------------------- 命令执行成功 
data ------------------------------------------------------- 数据传输初始化 
354 End data with .----------------------------------------- 开始传输数据 
From: 
To: 
Date: Mon, 25 Oct 2004 14:24:27 +0800
Subject: test mail 

Hi, test2 
This is a test mail, you don't reply it. 

.
------------------------------------------------------------ 数据内容,包括BASE64加密后的邮件内容, 以 CRLF.CRLF 结束数据传输 
250 OK: queued as 2F6DE3929--------------------------------- 命令执行成功 
quit ------------------------------------------------------- 结束会话 
221 Bye
Connection closed by foreign host .------------------------- 断开连接

注意:
本问引用自: 并做了小量修改。 ======================================================
以下由genius提供的POP3命令简介,将原来单独置顶的文章去掉,融合到这里。

Email基础知识: POP3命令简介
什么是 POP3
POP3 (Post Office Protocol 3) 即邮局协议的第 3 个版本,它规定怎样将个人计算机连接到 Internet 的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的         
第一个离线协议标准, POP3 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循 POP3 协议的接收邮件服务器,用来接收电子邮件的。



POP3 命令
POP3 命令包括:
USER username 认证用户名         
PASS password 认证密码认证,认证通过则状态转换         
APOP name,digest 认可一种安全传输口令的办法,执行成功导致状态转换,请参见 RFC 1321 。         
STAT 处理请求 server 回送邮箱统计资料,如邮件数、 邮件总字节数         
UIDL n 处理 server 返回用于该指定邮件的唯一标识, 如果没有指定,返回所有的。         
LIST n 处理 server 返回指定邮件的大小等         
RETR n 处理 server 返回邮件的全部文本         
DELE n 处理 server 标记删除,QUIT 命令执行时才真正删除         
RSET 处理撤消所有的 DELE 命令         
TOP n,m 处理 返回 n 号邮件的前 m 行内容,m 必须是自然数         
NOOP 处理 server 返回一个肯定的响应         
QUIT 希望结束会话。如果 server 处于"处理" 状态,则现在进入"更新"状态,删除那些标记成删除的邮件。如果 server 处于"认可"状态,则结束会话时 server 不进入"更新"状态 。         

使用 telnet 连接 Winmail Server 收信
例如:安装 Winmail 的邮件服务器 IP 是 192.168.0.1(蓝色字体内容由客户端输入,红色字体内容是服务返回的) 
  telnet 119.119.119.212 110 ----------------------------- 使用 telnet 命令连接服务器 110 端口       
  Trying 119.119.119.212... ------------------------------ 正在连接服务器 110 端口       
  Connected to 119.119.119.212. -------------------------- 连接服务器 110 端口成功       
  +OK Winmail Mail Server POP3 ready         
  user username ------------------------------------------ 输入用户名, username 为具体的用户名       
  +OK ---------------------------------------------------- 执行命令成功
  pass password ------------------------------------------ 输入用户密码,password 为具体的密码,这里要注意,当密码输入错误后要重新user username后再运行此命令,否则提示命令无效       
  +OK 2 messages ----------------------------------------- 密码认证通过 
  (-ERR authorization failed ----------------------------- 密码认证失败)       
  stat --------------------------------------------------- 邮箱状态 
  +OK 2 6415 --------------------------------------------- 2 为该信箱总邮件数,6415 为总字节数       
  list --------------------------------------------------- 列出每封邮件的字节数 
  +OK ---------------------------------------------------- 执行命令成功,开始显示,左边为邮件的序号,右边为该邮件的大小 
  1 537 -------------------------------------------------- 第 1 封邮件,大小为 537 字节       
  2 5878 ------------------------------------------------- 第 2 封邮件,大小为 5878 字节       
  .
  top 1 -------------------------------------------------- 接收第 1 封邮件 
  +OK ---------------------------------------------------- 接收成功, 返回第 1 封邮件头
  Return-Path: <>
  Delivered-To: 
  Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
  From: 
  To: 
  Date: Mon, 25 Oct 2004 14:24:27 +0800
  Subject: test mail 
  .
     
  retr 1 ------------------------------------------------- 接收第 1 封邮件     
  +OK ---------------------------------------------------- 接收成功, 返回第 1 封邮件全部内容
  Return-Path: <>
  Delivered-To: 
  Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
  
From: 
  To: 
  Date: Mon, 25 Oct 2004 14:24:27 +0800
  Subject: test mail 
  
  Hi, test2 
  This is a test mail, you don't reply it.
  
  .
  

  dele 1 ------------------------------------------------- 删除第 1 封邮件   
  +OK ---------------------------------------------------- 删除成功     
  dele 2 ------------------------------------------------- 删除第 2 封邮件   
  +OK ---------------------------------------------------- 删除成功     
  quit --------------------------------------------------- 结束会话 
  +OK ---------------------------------------------------- 执行命令成功

载自:

怎样接收电子邮件(POP3协议简介)回复人:dbcontrols

在Internet,POP3(Post Office Protocol 3)协议通常被用来接收电子邮件。这个协议很容易学,因为它只包含12个命令(其中有3个你完全可以忽略它们的存在)。这些命令被客户端计算机用来发送 给远程服务器。反过来,服务器返回给客户端计算机两个回应代码。如果你还没有看本站另一篇文章-“Winsock Terminal 示例程序”的话,请先阅读那篇文章,因为你需要那个程序来做实验。

运行示例程序,单击工具栏上的"Connect to"按钮。在弹出的对话框中输入你要连机的邮件服务器的地址例如:
mail.comset.net

选择POP3协议,然后单击"Connect"按钮。如果成功的话(如果出错,肯定是你服务器地址有问题,别怀疑到程序头上来),你会在文本框中看到服务器返回给你的信息。我的服务器的应答如下:
+OK POP3 mail.comset.net v5.49 server ready

这个字符串告诉你连机成功了。不同服务器的回应会有所不同,但开头部分都是一样的,那就是:
"+OK"。它的意思是服务器接受客户端计算机所使用的命令顺序及语法。如果开头是"-ERR",则表示你使用了错误的命令。在你的应用程序中,只须处理来自服务器的回应的前面几个字符。这么小的处理量正是POP3相对其它协议的优势所在。

授权状态
好了,现在我们已经建立了同服务器的连接并且从服务器那里得到了肯定的回答。接下来要做的就是告诉服务器你的身份。服务器要管理成千上万个邮箱并不是件好难的事。它已为每个邮箱建立好了一个帐户。每个帐户由用户名和密码构成。当你连上服务器后,要发送的第一个命令就是USER,用户名是该命令的参数。具体写法如下:
USER username

如果用户名已注册,服务器将返回一条正确的消息,然后你就可以输入下面的命令,告诉服务器你的密码。
PASS password

如果用户名和密码吻合的话,服务器同样会返回一条正确的消息,告诉你可以进入下一阶段,即TRANSACTION state.
TRANSACTION状态

为了知道你的邮箱中目前有多少封邮件以及这些邮件的大小,可使用STAT命令。它会告诉你邮箱目前的状态。服务器所返回的信息可能会是下面的样子:
+OK 0 0 (你的邮箱中没有邮件)
+OK 3 825 (你的邮箱中有三封邮件,大小为825个八位字节)

如果邮箱中没有邮件,就没有什么好做的了,用QUIT命令就可结束同服务器的连接。如果邮箱中有邮件的话,你可以用RETR命令把邮件下载到你自己的机器上。这个命令要求邮件的索引作为其参数。例如,如果我们想收第一封邮件,可输入如下命令:
RETR 1

要想取回其它的邮件,用上面的命令加上相应的邮件编号就行了。如果你输入的邮件编号超过了信箱中的邮件数量,服务器就会返回一个 "-ERR" 给你。作为对RETR命令的回应,服务器会返回给你一个字符串。这个字符串包含下面这些东西:"+OK"、邮件大小、邮件文本以及一个包含小数点的字符串。最后一个字符串,也就是小数点表示消息的结束。例如:
Client: RETR 2
Server: +OK 234 octets
Server: <邮件文本>
Server: .

注意上面收邮件的过程并不意味着将这些邮件转移到你的计算机上。你是得到这些邮件的一份拷贝,你的住信箱中仍会存放这些邮件直到你用DELE命令删除它们。同样地,DELE命令也需要你提供邮件的索引号。实际上,当你使用了DELE命令后,这些邮件并不是立即从服务器上删除。这些邮件只是被做上了一个删除的标记,当你断开同服务器的连接后,才真正从服务器上删除。如果你想移除这些删除标记,用RSET命令。这个命令并不针对某一个特定的邮件,而是移除所有删除标记,所以你不需要提供邮件索引号给这个命令。

除了上面所说的命令之外,当你还处在TRANSACTION状态时,POP3还支持另外两个命令。这两个命令是:LIST和NOOP。LIST命令可用来列出邮件的信息。就象下面所显示的一样:
Client: LIST
Server: +OK 2 messages (320 octets)
Server: 1 120
Server: 2 200
Server: .

通过对LIST命令提供邮件索引号,可列出特定邮件的信息,如下例:
Client: LIST 2
Server: +OK 2 200
NOOP命令具体的事情不做,只是用来检查同服务器的连接。
UPDATE状态

当你处于UPDATE状态时,你只有一个命令可用,那就是:QUIT。用这个命令来确认你所做的所有改变,删除被标上删除标记的邮件以及关闭连接。

其它POP3命令
POP3协议还支持另外三个命令:TOP、UIDL及APOP。这里只介绍第一个命令。TOP命令可用来获取邮件头及被预定义的一块字符串。通常如果你的邮箱中中一封容量很大的邮件时,这个命令特别有用。用TOP命令,你可以只显示邮件头的信息,从中找出邮件作者有主题。你甚至可以只下载这部分信息。该命令的语法如下:
TOP msg n
msg - 邮件的索引号
n - 你想要显示的行数

回复人:junglerover(灌木丛)
slothboy(懒虫)兄,简单的说,你在
发送每个命令后面都要再加上一个VBCRLF才行啊。
就像你不回车,它怎么确认你的命令输入完了呢。

回复人:junglerover(灌木丛)
POP3服务器本身是没有“新邮件”这个概念的。
但是你可以通过利用UIDL命令,通过保留已经收过的邮件
的UIDL的方法来自己判断。
你看看FOXMAIL,它就是这样做的。

回复人:lichard(逍遥) 2002-02-26 11:28:59
《自己动手编写电子邮件接收程序》

  2000年第1期发表了《自己动手编写电子邮件发送程序》一文后,相信很多朋友都拥有自己的个性化电子邮件发送程序了。今天,我就带大家学习用POP3协议收取邮件的方法。

  一、先试试手工收信
  同发信一样,你要用TELNET程序登录到POP3服务器,必要时可以打开“本地回现”选项,最好打开“选项”菜单下的“开始记录”项,用日志文件记录下你和服务器的交互信息,供以后分析用。连接时,注意把端口设为POP3协议默认的110号。

  连接成功,服务器会返回以下信息:

  +OK ...........

  字符+OK是POP3协议的返回信息。它的回应信息不像SMTP协议那样用丰富多变的数字表示,只有两个:+OK或者-ERR。其中,+OK表示连结成功,-ERR表示连结失败。

  接下来,输入
  USER <用户名>

  该命令告诉服务器你的用户名( 注意,有些服务器会区分字母大小写)。

  服务器返回+OK之后,输入
  PASS <口令>

  服务器返回+OK之后,还返回一些邮箱的统计信息,如:我的邮箱服务器返回
  +OK clyde has 2 messages

  不同的服务器返回的信息格式不太一样,所以我们可以用STAT命令来查看邮箱的情况。
  STAT命令的回应中有两个数字,分别表示邮件数量和邮件的大小。

  如果信箱里有信,就可以用RETR命令来获取邮件正文。RETR命令的格式是:
  RETR <邮件编号>

  如果返回结果第一行是+OK信息,表示成功。第二行起是邮件正文。最后一行和SMTP协议一样,是一个单独的英文句号,表示邮件的末尾部分。
  把邮件存储起来以后要用DELE命令删除邮箱中的邮件,要不然,你的信箱撑崩了可别怨我没告诉你。DELE命令的格式是:
  DELE <邮件编号>

  如果删错了,可以用RSET命令恢复所有删除的邮件。条件是你还没退出。一旦退出,就一切都晚了。

  全部完成以后,输入QUIT命令退出POP3服务器。

  另外,有一个UIDL命令,是提供一个供邮件程序使用的十六进制邮件识别码,它对我们没太大用处。

  二、自己编个小程序

  弄懂了POP3协议的原理,我们就可以用VB编一个小程序来完成这些工作。

  首先,在窗体上放上一个WINSOCK控件,取名POP3,一个按钮cmdStart和三个文本框,分别叫USER、PASS和SERVER,用以输入用户名、口令、服务器名等信息。

  在按钮的Click事件中启动WINSOCK控件的连接。
  Private Sub cmdStart_Click()
  POP3.RemoteHost = SERVER.Text
  POP3.RemotePort = 110
  Tag = "conn"
  POP3.Connect
  End Sub

  对于处理邮件服务器的返回信息,有些编程爱好者喜欢用WAITFOR过程。我认为这种方法不妥。如果程序等的是+OK,但是服务器返回一个-ERR,那岂不是永远也等不到了?所以在DataArrival事件中通过判断返回的信息再进行响应的处理比较好。DataArrival事件的处理代码如下:
  Private Sub POP3_DataArrival(ByVal bytesTotal As Long)
  Dim DATA As String, StartAt As Integer, Length As Integer
  POP3.GetData DATA
   Select Case Left(DATA, 1)
   Case "+" '判断状态
   Select Case Tag '刚刚发送了哪条命令
   Case "conn" '刚连接
   POP3.SendData "USER " & USER & vbCrLf '发送 '用户名
   Tag = "user"
   Case "user"
   POP3.SendData "PASS " & PASS & vbCrLf '发送口令
   Tag = "pass"
   Case "pass"
   POP3.SendData "STAT" & vbCrLf
   Tag = "stat"
   Case "stat" '获取邮箱状态
   Total = Val(Mid(DATA, 5, InStr(5, DATA, Chr(32)) - 5)) '共有几封信
   If Total = 0 Then '如果没有信,退出
   Tag = "quit"
   POP3.SendData "quit" & vbCrLf
   Exit Sub
   End If
   Current = 1 '否则 '开始接收
   POP3.SendData "RETR 1" & vbCrLf
   Tag = "retr"
   Case "retr" '接收到+OK以后初 '始化邮件正文变量,准备接受正文
   MailText = ""
   Case "dele" '删除完毕
   Current = Current + 1
   If Current < Total Then '如果这 '不是最后一封,接收下一封
   POP3.SendData "RETR " & Current & vbCrLf
   Tag = "retr"
   Else
   POP3.SendData "QUIT" & vbCrLf '否则退出
   Tag = "quit"
   End If
   Case "quit"
   Tag = ""
   End Select
   Case "-" '如果错误,提示,退出
   MsgBox "错误" & DATA
   POP3.SendData "quit"
   Tag = "quit" Case Else '其他数据,是邮件正文
   If Right(DATA, 5) = vbCrLf & "." & vbCrLf Then '最后是单独的一个句点,表示这是最后一部分
   MailText = MailText & Left(DATA, Len(DATA) - 5)
   '获取邮件正文,并且保存邮件
   SaveMail
   POP3.SendData "DELE " & Current & vbCrLf
   '删除该邮件
   Tag = "dele"
   Else '不是最后一部分,仅获取正文,等待下一部分
   MailText = MailText & DATA
   End If
   End Select
  End Sub

  如果因为网络可能堵塞,邮件不能一次传过来。所以在接收邮件的那一段程序中须要判断接收到的是不是邮件的结尾,如果是的话就把邮件存盘,如果不是就继续接收。

  三、对邮件的保存和解码

  大家知道,绝大部分邮件都是经过Base64或者Quote-Printable编码的。这使邮件变得不可以直接阅读,必须对它解码才行。在邮件处理程序中,可调用SaveMail过程,用以保存已经收到的邮件。SaveMail过程的代码如下:
  Sub SaveMail()
  Open Current & ".eml" For Output As #1
  Print #1, MailText
  Close #1
  End Sub

  经过以上的处理,服务器上的邮件被保存成.EML的文件。这种文件可以直接由Outlook Express打开,也可以在Foxmail中导入,从而省去了我们在程序中解码的麻烦。
  以上程序在Win98,VB5中通过。

阅读(2657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~