telnet完成对imap的验证

时间:2022-01-15 15:19:58
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://linuxroad.blog.51cto.com/765922/1000530

[root@mail ~]# telnet mail.sun.com 143
Trying 192.168.1.10...
Connected to mail.sun.com (192.168.1.10).
Escape character is '^]'.
* OK Dovecot ready.
a01 login test1@sun.com 123456  <-----用户名和密码验证
a01 OK Logged in.
a02 list "" *                                    <-----列出所有信息列表
* LIST (\HasNoChildren) "." "Sent"   
* LIST (\HasNoChildren) "." "Trash"
* LIST (\HasNoChildren) "." "Drafts"
* LIST (\HasNoChildren) "." "Junk"
* LIST (\HasNoChildren) "." "INBOX"
a02 OK List completed.
a03 select inbox                             <--------列出inbox信箱中的信息
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 4 EXISTS                                  <--------我有4封已经阅读了的邮件
* 0 RECENT                                <--------我有0封新邮件
* OK [UNSEEN 2] First unseen.
* OK [UIDVALIDITY 1347907213] UIDs valid
* OK [UIDNEXT 5] Predicted next UID
a03 OK [READ-WRITE] Select completed.
a04 fetch 3 body[header]               <-------查看第3封邮件的信头信息
* 3 FETCH (FLAGS (\Seen) BODY[HEADER] {251}
Return-Path: <helo@sun.com>        <------发件人
X-Original-To: test1@sun.com        <-------收件人
Delivered-To: test1@sun.com
Received: from hello (unknown [192.168.1.3])
        by mail.sun.com (Postfix) with ESMTP id E3AE62B0423
        for <test1@sun.com>; Tue, 18 Sep 2012 02:31:55 +0800 (CST)

)
a04 OK Fetch completed.
a05 fetch 3 body[text]                     <--------查看邮件内容
* 3 FETCH (BODY[TEXT] {11}
hello jim                                          <--------邮件正文
)
a05 OK Fetch completed.
a06 logout                                       <--------退出登录
* BYE Logging out
a06 OK Logout completed.
Connection closed by foreign host.
 

以下是详细参考文章,来自http://august.blog.51cto.com/59588/558696

Internet Message Access Protocol(缩写为IMAP,以前称作交互邮件访问协议)是一个应用层协议,用来从本地邮件客户端(如MicrosoftOutlook、 Outlook Express、Foxmail、Thunderbird)访问远程服务器上的邮件。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协 议之上,使用的端口是143。这里做简单介绍,要想详细了解google、百度一搜一大堆。
        目前,支持imap协议的免费邮箱我所知道的有Gmail,QQmail以及foxmail,当然可能(一定)还有其它的邮箱。首先在telnet下利用IMAP命令获取QQ邮箱的邮件信息:
        首先在[开始]->[运行]中输入cmd    点击确定,(啰嗦了点啊!)
        输入:telnet imap.qq.com 143      
        按下确认键    连接成功的话会有得到如下内容:
        * OK [CAPABILITY IMAP4 IMAP4rev1 AUTH=LOGIN AUTH=PLAIN NAMESPACE] QQMail IMAP4Se
        rver ready
         接下来验证账号 输入:a001 login 用户名 密码

        按下确认键,账号密码正确的话会得到如下内容:
        a001 OK Success login ok
        这里说一下a001,这个东西不是固定的,随便是个什么标签就行,你可以换成a,也可以换成b。用户名只填账号不用@qq.com;输入的时候不要出错, 出错了就算改过来也不行了,要重新输一次。验证完账号后就是进入邮箱了,如果要取信当然先取箱子了,下面是取箱子命令:
        a002 list "" *               
        按下确认键,会得到如下内容:
        * LIST (\HasNoChildren) "/" "INBOX"
        * LIST (\NoSelect \HasChildren) "/" "&UXZO1mWHTvZZOQ-"
       * LIST (\HasNoChildren) "/" "&XfJT0ZABkK5O9g-"
        * LIST (\HasNoChildren) "/" "&g0l6P3ux-"
      * LIST (\HasNoChildren) "/" "&XfJSIJZkkK5O9g-"
       * LIST (\HasNoChildren) "/" "&V4NXPnux-"
      * LIST (\HasNoChildren) "/" "&UXZO1mWHTvZZOQ-&kK5O9ouilgU-"
        a002 OK LIST completed
       取箱子成功!一共有7个箱子,其它的可能看不太明白。INBOX大家应该都知道是收件箱了;接下来知道有些什么箱子了,就要告诉服务器你想对哪个箱子进行操作,就是要选择一个箱子,命令如下:
        a003 select inbox                
        按下确认键,会得到如下内容:
       * 4 EXISTS
       * 0 RECENT
       * OK [UIDVALIDITY 1256348146] UID validity status
       * OK [UIDNEXT 9] Predicted next UID
        * FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
       * OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent flags
        a003 OK [READ-WRITE] SELECT complete
        其中 EXISTS前面的数字“4”表示邮件总数,RECENT前面的数字“0”表示新邮件数目(就是未读邮件);既然有邮件就可以查看内容了,输入命令:
       a004 fetch 1 body[header]              
        按下确认键,会得到如下内容:
        * 1 FETCH (BODY[HEADER] {616}
        X-QQ-ThreadID:7ESNSJ1vQe,0
       X-Originating-IP: 222.90.213.4
       X-QQ-mid:webmail——————
       X-QQ-STYLE:
      From: "=?gbk?B?RGFubHkgL21u?=" <
——————@qq.com>
        To: "=?gbk?B?wO67og==?=" <
——————@qq.com>
     Sender:
——————@qq.com
       Subject: =?gbk?B?sK7H6dDt1LjK9yzH6cjLusPUyyE=?=
     Mime-Version: 1.0
     Content-Type: multipart/alternative;
               boundary="----=_NextPart_4A73E0B9_085D4350_07A7DBD5"
     Content-Transfer-Encoding: 8Bit
     Date: Sat, 1 Aug 2009 14:29:13 +0800
       X-Priority: 3
       Message-ID: <
————————————@qq.com>
       X-QQ-MIME: TCMime 1.0 by Tencent
        X-Mailer: QQMail 2.x
       X-QQ-Mailer: QQMail 2.x

       )

       a004 OK FETCH completed    
       直到a004 OK FETCH completed之前是一封邮件的完整信头,a004 OK FETCH completed 表示请求完成了,接下来请求信件的内容,命令:
       a005 fetch 1 body[text]                         
       按下确认键,会得到如下内容:
       * 1 FETCH (BODY[TEXT] {582}
       This is a multi-part message in MIME format.

        ------=_NextPart_4A73E0B9_085D4350_07A7DBD5
       Content-Type: text/plain;
                charset="gbk"
       Content-Transfer-Encoding: base64

       ——————————————————=

        ------=_NextPart_4A73E0B9_085D4350_07A7DBD5
       Content-Type: textml;
             charset="gbk"
       Content-Transfer-Encoding: base64

       ——————————————————————————

       ------=_NextPart_4A73E0B9_085D4350_07A7DBD5--

      )
       a005 OK FETCH completed

         除去a005 OK FETCH completed部分所得到的就是这封信的完整内容了。分别把信头和内容两部分内容拷贝下来粘贴到记事本中,把后缀名改成eml格式。然后打开就可以看 到完整的一封信了。记得不要拷贝a005 OK FETCH completed这几句系统的提示;这是我的qq邮箱的一封信。为了不暴露我的秘密(呵呵,也没什么秘密)我去掉了一些敏感内容以“——”代替;所以我 的这份信就不完整了呵!然后是退出邮箱,命令:
      a006 logout                            
       按下enter,这就退出了;系统返回提示内容:
       * BYE LOGOUT received
       a006 OK LOGOUT Completed
      整个过程到这就结束了!当然还有很多命令没有用到,有需要用到的可以根据需要灵活应用。尤其fetch命令功能相当强大,这里只说了点皮毛。本例是以QQ邮箱为例,可以用QQ账号、密码试一试;
       Gmail也支持imap协议,但Gmail对数据进行了SSL加密(安全套接层(Secure Sockets Layer)协议e);所以在telnet中是操作不成的,但可以利用程序实现;利用程序实现imap接收邮件原理与在telnet下实现基本相同,连接 服务器后向服务器依次发送请求,分析分析服务器返回的信息,保存自己需要的内容就可以了。其中QQ的端口是143,而Gmail的端口号为993,QQ邮 箱没有对数据流进行ssl加密,所以用NetworkStream=TcpClient.GetStream()得到服务器的数据流就可以向里面读写数据 了,而Gmail用NetworkStream就行不通了,需要用到SslStream =new SslStream(tcpServer.GetStream());之后需要加一句 SslStream.AuthenticateAsClient(m_serv);这样才能得到数据流,此时也可以向数据流读写数据了。之前写pop的时 候我用的是sslStream = new SslStream(tcpServer.GetStream(), false, delegate(Object sender, X509Certificatecertificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }); 但是在imap中好像不行,至于原因我也没去找。

这样,利用telnet下实现imap收邮的原理同样能实现利用C#实现IMAP协议接收邮件。


也可以参考这篇文章,只不过是英文的http://blog.sina.com.cn/s/blog_6d2cab390100llw4.html

本文出自 “小子无名” 博客,请务必保留此出处http://linuxroad.blog.51cto.com/765922/1000530