最近老陈要针对企业邮箱做一些开发,以对接企业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. 使用Jekyll官方的ReadMore摘要功能

    今天才发现,Jekyll官方就支持ReadMore摘要功能,记录一下. 我之前的方法,在index.html中 {{ post.content ||split:'<!-- more --> ...

  2. 我的fckeditor实践

    一开始我不懂这个ConnectorServlet是何用处,后来发现是专门用于文件上传的,因为fckeditor默认是不支持这个功能的. ConnectorServlet: /* * FCKeditor ...

  3. fir.im Weekly - 新开发时代,每个人都在创造

    七夕纷纷扰扰地过去了,身边的程序员们依旧安静从容地写代码.可是满屏幕的"对象",不如身边一个对象(。・`ω´・)- 闲话说完,这周像往期一样为大家收集了一些优秀的 GitHub 资 ...

  4. Javascript创建对象的学习和使用

    <html> <head> <meta charset="utf-8"> <title>javascript对象的学习</ti ...

  5. Leetcode 1 Two Sum STL

    题意:给定一个目标值target,找到两个数的和为target,返回这两个数的下标 用map记录每个数的下标,并用于查找 class Solution { public: vector<int& ...

  6. this和super用法的总结

    在学习this和super关键字时,发现它们有诸多相同点,同时这两个关键字非常常用,现对它们做以下的总结. 一.概况 This: This指代当前对象,this()指代当前对象的其他构造函数 Supe ...

  7. 如何处理Win7连接vpn时报错789的问题

    [转]VPN错误提示: vpn连接出错789:L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇 (2014-08-11 15:09:10)转载▼标签: it xp连接VPN错误提示: v ...

  8. vs2013 下载

    http://download.microsoft.com/download/2/4/9/249BF223-5B84-4259-9424-429E66F45509/VS2013_RC_ULT_CHS. ...

  9. java文件同步性能测试

    2003同步速度

  10. maven nexus-staging-maven-plugin exception-connect timed out

    不知道是国内的网络的问题还是别的原因,在deploy一个maven的artifact到oss server的时候总是报错: Failed to execute goal org.sonatype.pl ...