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

无废话,直接放代码:

 // ===============================================================================
// 老陈出击,必属精品!
//
// Copyright © ymind.net. All rights reserved .
// 官方网站:http://ymind.net/
// 版权所有:彦铭工作室
// =============================================================================== using System;
using System.IO;
using System.Net.Security;
using System.Net.Sockets;
using System.Text; namespace WindowsFormsApplication1
{
/// <summary>
/// 提供通过 POP3 协议进行电子信箱账号验证的功能。
/// </summary>
public sealed class POP3AccountValidator
{
#region ValidateResults enum /// <summary>
/// 表示验证结果的枚举值。
/// </summary>
public enum ValidateResults
{
/// <summary>
/// 未指定。
/// </summary>
None = , /// <summary>
/// 连接失败。
/// </summary>
ConnectFailed = , /// <summary>
/// 无效的登录账号。
/// </summary>
InvalidUserName = , /// <summary>
/// 无效的登录密码。
/// </summary>
InvalidPassword = , /// <summary>
/// 登录成功。
/// </summary>
Success = , /// <summary>
/// 验证过程发生异常。
/// </summary>
Error = ,
} #endregion private const string _CRLF = "\r\n";
private readonly bool _useSSL; /// <summary>
/// 初始化 <see cref="POP3AccountValidator"/> 类的新实例。
/// </summary>
/// <param name="server">指定 POP3 服务器。</param>
public POP3AccountValidator(string server) : this(server, ) { } /// <summary>
/// 初始化 <see cref="POP3AccountValidator"/> 类的新实例。
/// </summary>
/// <param name="server">指定 POP3 服务器。</param>
/// <param name="port">指定 POP3 服务器端口号。</param>
public POP3AccountValidator(string server, int port) : this(server, port, false) { } /// <summary>
/// 初始化 <see cref="POP3AccountValidator"/> 类的新实例。
/// </summary>
/// <param name="server">指定 POP3 服务器。</param>
/// <param name="port">指定 POP3 服务器端口号。</param>
/// <param name="useSSL">指定一个值,该值指示验证过程是否使用 SSL 加密协议。</param>
public POP3AccountValidator(string server, int port, bool useSSL)
{
if (String.IsNullOrWhiteSpace(server)) throw new ArgumentOutOfRangeException("server");
if (port < || port > ) throw new ArgumentOutOfRangeException("port"); this.Server = server;
this.Port = port;
this._useSSL = useSSL;
} /// <summary>
/// 获取 POP3 服务器。
/// </summary>
public string Server { get; private set; } /// <summary>
/// 获取 POP3 服务器端口号。
/// </summary>
public int Port { get; private set; } private static ValidateResults _Validate(Stream stream, string username, string password)
{
var data = "USER " + username + _CRLF; using (var reader = new StreamReader(stream))
{
if (!reader.ReadLine().Contains("+OK")) return ValidateResults.ConnectFailed; var charData = Encoding.ASCII.GetBytes(data); stream.Write(charData, , charData.Length); if (!reader.ReadLine().Contains("+OK")) return ValidateResults.InvalidUserName; data = "PASS " + password + _CRLF;
charData = Encoding.ASCII.GetBytes(data); stream.Write(charData, , charData.Length); return reader.ReadLine().Contains("+OK") ? ValidateResults.Success : ValidateResults.InvalidPassword;
}
} /// <summary>
/// 验证电子信箱账号。
/// </summary>
/// <param name="username">电子信箱账号。</param>
/// <param name="password">电子信箱密码。</param>
/// <returns>返回 <see cref="ValidateResults"/> 枚举值之一。</returns>
public ValidateResults Validate(string username, string password)
{
if (username == null) throw new ArgumentNullException("username");
if (password == null) throw new ArgumentNullException("password"); try
{
using (var tcpClient = new TcpClient(this.Server, this.Port))
{
using (var tcpStream = tcpClient.GetStream())
{
if (!this._useSSL) return _Validate(tcpStream, username, password); using (var sslStream = new SslStream(tcpStream, false))
{
sslStream.AuthenticateAsClient(this.Server); return _Validate(sslStream, username, password);
}
}
}
}
catch
{
return ValidateResults.Error;
}
}
}
}

最新文章

  1. codeforces 21D:Traveling Graph
  2. node.js整理 06异步编程
  3. Informix SDK對比
  4. 13、NFC技术:读写非NDEF格式的数据
  5. hdu 4666 最大曼哈顿距离
  6. python编程语言缩进格式
  7. 5.2 CUDA Histogram直方图
  8. PHP常用内置函数
  9. NET开发者部署React-Native
  10. 提高你的Java代码质量吧:推荐在复杂字符串操作中使用正则表达式
  11. 如何让phpmyadmin输入密码再进入
  12. Django使用forms来实现评论功能
  13. spring security5.0源码导入idea
  14. 微信小程序时间戳的转换及调用
  15. PowerDesigner使用积累
  16. 小纪a
  17. Adobe Photoshop CC 2018 v19.0 简体中文正式版下载安装破解(附注册机+破解教程) 32/64位(安装破解注意事项是什么)
  18. WEBPAKC2.0开始
  19. 4 vuex的安装
  20. Mina入门:mina版之HelloWorld[z]

热门文章

  1. iOS开发之静态库(二)—— .a
  2. java利用16进制来辨别png格式的图片
  3. PHP基础(一)
  4. Javascript基础恶补
  5. 从WEB SERVICE 上返回大数据量的DATASET
  6. GitHub前50名的Objective-C动画相关库
  7. 实现Android Studio JNI开发C/C++使用__android_log_print输出Log
  8. how to read from __consumer_offsets topic
  9. SQL语句删除所有表
  10. MySQL中导入 导出CSV