一个基于POP3协议进行邮箱账号验证的类
最近老陈要针对企业邮箱做一些开发,以对接企业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;
}
}
}
}
一个基于POP3协议进行邮箱账号验证的类的更多相关文章
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- C#基础--基于POP3协议的邮件接收和基于STMP的邮件发送
最近在用outlook同步邮件.对邮件协议有一点兴趣.于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发. 一:SMTP协议 1.什么是SMTP协议: SMTP目前 ...
- 转:【专题十一】实现一个基于FTP协议的程序——文件上传下载器
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- 专题十一:实现一个基于FTP协议的程序——文件上传下载器
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- 实现一个基于FTP协议的程序——文件上传下载器(十三)
此为一个系列,后续会把内容补上...
- 基于Windows服务器,从0开始搭建一个基于RTSP协议的直播平台
作案工具下载 EasyDarwin 服务端程序,用来接受推流和拉流 FFmpeg 可以用来推流视频数据到服务端,也可以从服务端拉流下来播放,也可以从一个服务端拉流下来,转推到另一个服务端去. Easy ...
- Netty+SpringBoot写一个基于Http协议的文件服务器
本文参考<Netty权威指南> NettyApplication package com.xh.netty; import org.springframework.boot.SpringA ...
随机推荐
- 第八章xml学习
1.ASP.NET和JSP的关系 ASP.NET 和JSP都是用来开发动态网站的技术,只不过ASP.NET是通过c#语言来操作的, 而JSP是通过Java语言来操作的. 2.为什么学习XML? 01. ...
- iOS开发-UITextView根据内容自适应高度
UITextView作为内容文本输入区域,有的时候我们需要根据内容动态改变文本区域的高度,效果如下: 定义UITextView,实现UITextViewDelegate: -(UITextView * ...
- Observer模式
拉模式. Observer实现了一种间接关系.可以向各种对象注册观察者.可以有效地管理依赖关系. 拉模式实现简单,且Subject和Observer可以成为类库中的可重用元素. 当被观察对象比较复杂, ...
- 更改Windows系统的密码之后,SQL Server 2008服务无法启动
问题:更改Windows操作系统的密码之后,SQL Server 2008服务无法启动. 原因:SQL Server服务需要使用操作系统的某个登录账户. 解决:需要在服务的属性窗口中修改账户密码,然后 ...
- SQLite 批量insert - 如何加速SQLite的插入操作
本人翻译, 原文见: http://tech.vg.no/2011/04/04/speeding-up-sqlite-insert-operations/ 我正在开发一个Android程序, 它使用S ...
- mysqld.exe 占了400M内存的问题
最近遇到了服务器总是停机的问题,虽然它自己只有2G的内存,不过实际部署的应用访问量非常小,也不至于2G就不够用,所以开始了给服务器瘦身的计划. 看着任务管理器里面的各个进程,发现吃内存最厉害的是mys ...
- GTD时间管理(3)---梳理总结
一:收集箱 1:灵感和想法 2:交代事情 3:任何困扰你的事 二:清单容器 1:通过行动性和非行动性原则 2:通过2分钟原则 3:通过人员性质原则 三:组织 (人,事,时 的组合 ...
- How to programmatically new a java class which implements sepecified interface in eclipse plugin development
http://w3facility.org/question/how-to-programmatically-new-a-java-class-which-implements-sepecified- ...
- madown标签说明
1.删除线的用法 ~~这是删除线~~
- 2014中国软件开发者调查(二):Java、.NET、Web、云计算特点
继上周五放出第一篇中国软件开发者调查报告后,很多初学者和开发者翘首以盼第二篇.第三篇报告--希望这些调查报告能够给他们带来指导,解决他们的疑惑.确定他们的学习和使用信心.经过笔者在周末的努力,内容更加 ...