最近老陈要针对企业邮箱做一些开发,以对接企业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 = "\r\n";
 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 }

转载于:https://www.cnblogs.com/ymind/p/3384534.html

一个基于POP3协议进行邮箱账号验证的类相关推荐

  1. java socket发送定长报文_一个基于TCP协议的Socket通信实例

    原标题:一个基于TCP协议的Socket通信实例 1. 前言 一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度.正好前段时间完成了一个so ...

  2. 安信可分享 | 分享一个基于airkiss协议的配网小程序,实现小程序一键配网安信可ESP32C3\ESP8266\ESP32\ESP32S2系列的模组。(附带源码)

    文章目录 一.关于 WeChatAirkiss 1.1 应用场景 二.airkiss 简介 三.开始使用 四.API说明 五.FAQ 六.开源微信物联网控制一览表 联系我们 一.关于 WeChatAi ...

  3. [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  4. 申请注册google谷歌帐号/gmail邮箱账号验证手机号码遇到:此电话号码已用过太多次 或 此电话号码无法用于进行验证怎么解决?

    注册申请谷歌gmail邮箱帐号:此电话号码已用过太多次? 注册申请google谷歌gmail邮箱帐号,在验证您的手机号码时遇到问题提示:此电话号码已用过太多次.无法完成手机号码验证,就无法成功注册go ...

  5. 支持mp4的rtsp服务器,基于Windows服务器,从0开始搭建一个基于RTSP协议的直播平台...

    作案工具下载 EasyDarwin 服务端程序,用来接受推流和拉流 FFmpeg 可以用来推流视频数据到服务端,也可以从服务端拉流下来播放,也可以从一个服务端拉流下来,转推到另一个服务端去. Easy ...

  6. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  7. step5 . day3 网络编程 基于TPC协议的网络编程Demo,类FTP功能

    1.客户端 //cilent code #include <stdio.h> #include <sys/types.h> #include <sys/socket.h& ...

  8. 用SMTP,POP3访问Exchange邮箱:Exchange2003系列之六

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.[url]http://yuelei.blog.51cto.com/202879/76 ...

  9. DLedger —基于 raft 协议的 commitlog 存储库

    尊敬的阿里云用户: 您好!为方便您试用开源 RocketMQ 客户端访问阿里云MQ,我们申请了专门的优惠券,优惠券可以直接抵扣金额.请填写下您公司账号信息,点击上图,了解更多哦. 一.DLedger引 ...

最新文章

  1. Java Swing控件样式设置
  2. TCP的三个接收队列
  3. PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别
  4. Vue.js2.0核心思想
  5. java利用htmlparser得到网页html内容
  6. location php,Nginx服务器中的location配置详解
  7. [过年菜谱之]杭椒牛柳
  8. 用 theano 求解 Logistic Regression (SGD 优化算法)
  9. 12.12 静态文件不记录日志和过期时间
  10. 无碳小车 matlab,无碳小车的创新设计及MATLAB,SOLIDWORKS,CATIA仿真
  11. 图书馆管理系统的开发
  12. 读取xlsx,根据模板图片批量添加文字生成相关图片,如证书,奖状,名片等
  13. IAR EWARM 破解方法
  14. 【系统集成项目管理工程师】—三点估算
  15. 服务器上文件共享有哪些协议,访问局域网共享文件使用的是什么协议
  16. springboot的开发流程
  17. 磁阻随机存储器(MRAM)市场现状研究分析与发展前景预测报告
  18. 计算机工程与应用期刊投稿经验
  19. vue常用下载的依赖
  20. 利用AJAX做天气预报

热门文章

  1. 机器学习笔记(七):神经网络:表示
  2. java 字符串包含某个字符_java中判断字符串中是否包含某个特定字符串的方法有哪些...
  3. linux嵌入式智能家居环境监测系统的设计,智能家居环境监测系统.doc
  4. leetcode236 二叉树的最近公共祖先
  5. python模块(4)-Collections
  6. 原 剑指offer(刷题11-20)--c++,Python版本
  7. LeetCode - Easy - 119. Pascal‘s Triangle II
  8. 基于以太坊的测试链发布一个智能合约
  9. 成功必读本:培养人脉的106个技巧
  10. 研发团队平稳度过“从小到大”并非易事