zoukankan      html  css  js  c++  java
  • 一个基于POP3协议进行邮箱账号验证的类

    最近老陈要针对企业邮箱做一些开发,以对接企业OA神马的,但企业邮箱唯独没有开放账号密码验证功能,很恼火!不得已,翻出早些年的Asp代码改编成了C#类,实现了一个C#下的通过POP3协议进行邮箱账号验证的类,而且还能完美支持SSL加密,貌似很实用的样子,分享给大家先!

    无废话,直接放代码:

      1 // ===============================================================================
      2 //  老陈出击,必属精品!
      3 // 
      4 //  Copyright © ymind.net. All rights reserved .
      5 //  官方网站:http://ymind.net/
      6 //  版权所有:彦铭工作室
      7 // ===============================================================================
      8 
      9 using System;
     10 using System.IO;
     11 using System.Net.Security;
     12 using System.Net.Sockets;
     13 using System.Text;
     14 
     15 namespace WindowsFormsApplication1
     16 {
     17     /// <summary>
     18     /// 提供通过 POP3 协议进行电子信箱账号验证的功能。
     19     /// </summary>
     20     public sealed class POP3AccountValidator
     21     {
     22         #region ValidateResults enum
     23 
     24         /// <summary>
     25         /// 表示验证结果的枚举值。
     26         /// </summary>
     27         public enum ValidateResults
     28         {
     29             /// <summary>
     30             /// 未指定。
     31             /// </summary>
     32             None = 0,
     33 
     34             /// <summary>
     35             /// 连接失败。
     36             /// </summary>
     37             ConnectFailed = 1,
     38 
     39             /// <summary>
     40             /// 无效的登录账号。
     41             /// </summary>
     42             InvalidUserName = 2,
     43 
     44             /// <summary>
     45             /// 无效的登录密码。
     46             /// </summary>
     47             InvalidPassword = 3,
     48 
     49             /// <summary>
     50             /// 登录成功。
     51             /// </summary>
     52             Success = 4,
     53 
     54             /// <summary>
     55             /// 验证过程发生异常。
     56             /// </summary>
     57             Error = 5,
     58         }
     59 
     60         #endregion
     61 
     62         private const string _CRLF = "
    ";
     63         private readonly bool _useSSL;
     64 
     65         /// <summary>
     66         /// 初始化 <see cref="POP3AccountValidator"/> 类的新实例。
     67         /// </summary>
     68         /// <param name="server">指定 POP3 服务器。</param>
     69         public POP3AccountValidator(string server) : this(server, 110) { }
     70 
     71         /// <summary>
     72         /// 初始化 <see cref="POP3AccountValidator"/> 类的新实例。
     73         /// </summary>
     74         /// <param name="server">指定 POP3 服务器。</param>
     75         /// <param name="port">指定 POP3 服务器端口号。</param>
     76         public POP3AccountValidator(string server, int port) : this(server, port, false) { }
     77 
     78         /// <summary>
     79         /// 初始化 <see cref="POP3AccountValidator"/> 类的新实例。
     80         /// </summary>
     81         /// <param name="server">指定 POP3 服务器。</param>
     82         /// <param name="port">指定 POP3 服务器端口号。</param>
     83         /// <param name="useSSL">指定一个值,该值指示验证过程是否使用 SSL 加密协议。</param>
     84         public POP3AccountValidator(string server, int port, bool useSSL)
     85         {
     86             if (String.IsNullOrWhiteSpace(server)) throw new ArgumentOutOfRangeException("server");
     87             if (port < 1 || port > 65535) throw new ArgumentOutOfRangeException("port");
     88 
     89             this.Server = server;
     90             this.Port = port;
     91             this._useSSL = useSSL;
     92         }
     93 
     94         /// <summary>
     95         /// 获取 POP3 服务器。
     96         /// </summary>
     97         public string Server { get; private set; }
     98 
     99         /// <summary>
    100         /// 获取 POP3 服务器端口号。
    101         /// </summary>
    102         public int Port { get; private set; }
    103 
    104         private static ValidateResults _Validate(Stream stream, string username, string password)
    105         {
    106             var data = "USER " + username + _CRLF;
    107 
    108             using (var reader = new StreamReader(stream))
    109             {
    110                 if (!reader.ReadLine().Contains("+OK")) return ValidateResults.ConnectFailed;
    111 
    112                 var charData = Encoding.ASCII.GetBytes(data);
    113 
    114                 stream.Write(charData, 0, charData.Length);
    115 
    116                 if (!reader.ReadLine().Contains("+OK")) return ValidateResults.InvalidUserName;
    117 
    118                 data = "PASS " + password + _CRLF;
    119                 charData = Encoding.ASCII.GetBytes(data);
    120 
    121                 stream.Write(charData, 0, charData.Length);
    122 
    123                 return reader.ReadLine().Contains("+OK") ? ValidateResults.Success : ValidateResults.InvalidPassword;
    124             }
    125         }
    126 
    127         /// <summary>
    128         /// 验证电子信箱账号。
    129         /// </summary>
    130         /// <param name="username">电子信箱账号。</param>
    131         /// <param name="password">电子信箱密码。</param>
    132         /// <returns>返回 <see cref="ValidateResults"/> 枚举值之一。</returns>
    133         public ValidateResults Validate(string username, string password)
    134         {
    135             if (username == null) throw new ArgumentNullException("username");
    136             if (password == null) throw new ArgumentNullException("password");
    137 
    138             try
    139             {
    140                 using (var tcpClient = new TcpClient(this.Server, this.Port))
    141                 {
    142                     using (var tcpStream = tcpClient.GetStream())
    143                     {
    144                         if (!this._useSSL) return _Validate(tcpStream, username, password);
    145 
    146                         using (var sslStream = new SslStream(tcpStream, false))
    147                         {
    148                             sslStream.AuthenticateAsClient(this.Server);
    149 
    150                             return _Validate(sslStream, username, password);
    151                         }
    152                     }
    153                 }
    154             }
    155             catch
    156             {
    157                 return ValidateResults.Error;
    158             }
    159         }
    160     }
    161 }
  • 相关阅读:
    trie树
    单调队列
    网络流24题——试题库问题
    费用流的简单应用
    Manacher算法
    KMP算法
    网络流之最小费用最大流
    网络流之二分图匹配【转】
    网络流之最大流
    矩阵快速幂优化菲波那切数列
  • 原文地址:https://www.cnblogs.com/ymind/p/3384534.html
Copyright © 2011-2022 走看看