最近老陈要针对企业邮箱做一些开发,以对接企业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协议进行邮箱账号验证的类的更多相关文章

  1. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  2. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  3. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  4. C#基础--基于POP3协议的邮件接收和基于STMP的邮件发送

    最近在用outlook同步邮件.对邮件协议有一点兴趣.于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发.    一:SMTP协议  1.什么是SMTP协议:       SMTP目前 ...

  5. 转:【专题十一】实现一个基于FTP协议的程序——文件上传下载器

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

  6. 专题十一:实现一个基于FTP协议的程序——文件上传下载器

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

  7. 实现一个基于FTP协议的程序——文件上传下载器(十三)

    此为一个系列,后续会把内容补上...

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

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

  9. Netty+SpringBoot写一个基于Http协议的文件服务器

    本文参考<Netty权威指南> NettyApplication package com.xh.netty; import org.springframework.boot.SpringA ...

随机推荐

  1. VirtualBox安装Ubuntu教程

    1.VirtualBox虚拟机安装,及VirtualBox安装Ubuntu教程VirtualBox版本为VirtualBox-4.3.12-93733-Win.exe,Ubuntu版本为ubuntu- ...

  2. Atitit.研发管理---TOGAF架构跟 (ADM开发方法)总结

    Atitit.研发管理---TOGAF架构跟 (ADM开发方法)总结 1. TOGAF是在过去二十年间出现的企业架构框架 1 2. TOGAF内容结构 1 3. TOGAF 实现过程 2 4. 参考 ...

  3. Javascript实现计数器,定时警告和停止

    <html> <head> <meta charset="utf-8"> <title>定时警告</title> < ...

  4. bzoj 1191: [HNOI2006]超级英雄Hero

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MB 二分图匹配... Description 现在电视台有一种节目叫做超 ...

  5. P2P的原理和常见的实现方式(为libjingle开路)

    参考原文 为了项目的IM应用,最近在研究libjingle,中间看了也收集了很多资料,感慨网上很多资料要么太过于纠结协议(如STUN.ICE等)实现细节,要么中间有很多纰漏.最后去伪存真,归纳总结了一 ...

  6. Android之把手机的3g流量共享出来让其他人连接这个wifi

    转自:http://blog.csdn.net/luoboo525/article/details/7883998   亲测可用 用过快牙的朋友应该知道它们在两天设备之间传输文件的时候使用的是wifi ...

  7. 如何实现在H5里调起高德地图APP?(下)

    这一篇文章将告诉您,如果直接打开高德地图APP,并展示路线规划.适合有定位的移动设备,可以查询到从“我的位置”到目的地的路径规划,并直接导航. 场景二.调起高德地图的路线规划功能 导航是目前JSAPI ...

  8. CentOS6.5下安装Open vSwitch

    准备 # yum install openssl-devel redhat-rpm-config kernel-devel -y #yum install kvm libvirt python-vir ...

  9. Requirejs加载超时问题的一个解决方法:设置waitSeconds=0

    有时Requirejs会遇到加载js超时问题 除了排查js脚本问题,网络问题以外的一个解决方法是加大Require的等待时间waitSeconds,或者直接设置为0,这个参数的意义是:The numb ...

  10. IE6-IE11兼容性问题列表及解决办法总结

    相比IE6-IE9那版,主要添加IE10和IE11的新变化. 以下是目录及下载链接: 目录 概述 2 第一章:HTML 3 第一节:IE7-IE8更新 3 1. 如果缺少结束标记的 P 元素后跟 TA ...