一个基于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 = "\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协议进行邮箱账号验证的类相关推荐
- java socket发送定长报文_一个基于TCP协议的Socket通信实例
原标题:一个基于TCP协议的Socket通信实例 1. 前言 一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度.正好前段时间完成了一个so ...
- 安信可分享 | 分享一个基于airkiss协议的配网小程序,实现小程序一键配网安信可ESP32C3\ESP8266\ESP32\ESP32S2系列的模组。(附带源码)
文章目录 一.关于 WeChatAirkiss 1.1 应用场景 二.airkiss 简介 三.开始使用 四.API说明 五.FAQ 六.开源微信物联网控制一览表 联系我们 一.关于 WeChatAi ...
- [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- 申请注册google谷歌帐号/gmail邮箱账号验证手机号码遇到:此电话号码已用过太多次 或 此电话号码无法用于进行验证怎么解决?
注册申请谷歌gmail邮箱帐号:此电话号码已用过太多次? 注册申请google谷歌gmail邮箱帐号,在验证您的手机号码时遇到问题提示:此电话号码已用过太多次.无法完成手机号码验证,就无法成功注册go ...
- 支持mp4的rtsp服务器,基于Windows服务器,从0开始搭建一个基于RTSP协议的直播平台...
作案工具下载 EasyDarwin 服务端程序,用来接受推流和拉流 FFmpeg 可以用来推流视频数据到服务端,也可以从服务端拉流下来播放,也可以从一个服务端拉流下来,转推到另一个服务端去. Easy ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- step5 . day3 网络编程 基于TPC协议的网络编程Demo,类FTP功能
1.客户端 //cilent code #include <stdio.h> #include <sys/types.h> #include <sys/socket.h& ...
- 用SMTP,POP3访问Exchange邮箱:Exchange2003系列之六
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.[url]http://yuelei.blog.51cto.com/202879/76 ...
- DLedger —基于 raft 协议的 commitlog 存储库
尊敬的阿里云用户: 您好!为方便您试用开源 RocketMQ 客户端访问阿里云MQ,我们申请了专门的优惠券,优惠券可以直接抵扣金额.请填写下您公司账号信息,点击上图,了解更多哦. 一.DLedger引 ...
最新文章
- Java Swing控件样式设置
- TCP的三个接收队列
- PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别
- Vue.js2.0核心思想
- java利用htmlparser得到网页html内容
- location php,Nginx服务器中的location配置详解
- [过年菜谱之]杭椒牛柳
- 用 theano 求解 Logistic Regression (SGD 优化算法)
- 12.12 静态文件不记录日志和过期时间
- 无碳小车 matlab,无碳小车的创新设计及MATLAB,SOLIDWORKS,CATIA仿真
- 图书馆管理系统的开发
- 读取xlsx,根据模板图片批量添加文字生成相关图片,如证书,奖状,名片等
- IAR EWARM 破解方法
- 【系统集成项目管理工程师】—三点估算
- 服务器上文件共享有哪些协议,访问局域网共享文件使用的是什么协议
- springboot的开发流程
- 磁阻随机存储器(MRAM)市场现状研究分析与发展前景预测报告
- 计算机工程与应用期刊投稿经验
- vue常用下载的依赖
- 利用AJAX做天气预报
热门文章
- 机器学习笔记(七):神经网络:表示
- java 字符串包含某个字符_java中判断字符串中是否包含某个特定字符串的方法有哪些...
- linux嵌入式智能家居环境监测系统的设计,智能家居环境监测系统.doc
- leetcode236 二叉树的最近公共祖先
- python模块(4)-Collections
- 原 剑指offer(刷题11-20)--c++,Python版本
- LeetCode - Easy - 119. Pascal‘s Triangle II
- 基于以太坊的测试链发布一个智能合约
- 成功必读本:培养人脉的106个技巧
- 研发团队平稳度过“从小到大”并非易事