转载:http://blog.csdn.net/zengraoli/article/details/36866241

转载:http://blog.csdn.net/alger_magic/article/details/25164187

一、如果想单纯验证一个邮箱帐号是否存在,我们可以拿邮箱帐号和密码请求服务器验证。

.h文件

#ifndef _AUTHENTICATIONEMAIL_H_
#define _AUTHENTICATIONEMAIL_H_ #include <atlenc.h>
#include <winsock2.h> #pragma comment(lib, "wsock32.lib") struct sMailInfo //邮件信息
{
char *mailbox_user_name; //用户登录邮箱的名称
char *mailbox_user_pwd; //用户登录邮箱的密码
char *mailbox_sender_show_name; //用户发送时显示的名称
char *mailbox_sender; //发送者的邮箱地址
char *mailbox_receiver; //接收者的邮箱地址
char mail_server_ip_addr[]; //服务器的IP
char *mail_server_name; //服务器的名称(IP与名称二选一,优先取名称)
sMailInfo() { memset(this, , sizeof(sMailInfo)); }
}; class CAuthentic
{
public:
CAuthentic(); ~CAuthentic(); void Char2Base64(char *buff_64, char *src_buff, int length);//把char类型转换成Base64类型 bool CReateSocket(SOCKET &sock); //建立socket连接 bool Login(SOCKET &sock); //登录邮箱,主要进行发邮件前的准备工作 void Init(sMailInfo &smail_info); protected:
char send_buff_[]; //发送缓冲区
char receive_buff_[];
sMailInfo mail_info_;
};

.cpp文件

#include "AuthenticationEmail.h"
#pragma warning(disable:4996) CAuthentic::CAuthentic()
{
memset(send_buff_, , sizeof(send_buff_));
memset(receive_buff_, , sizeof(receive_buff_));
} CAuthentic::~CAuthentic()
{ } void CAuthentic::Char2Base64(char *buff_64, char *src_buff, int length)
{
//1 1 1 1 1 1 1 1
// 分配给pBuff64 ↑ 分配给pBuff64+1
// point所在的位置
static char base_64_encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//base64所映射的字符表
int point; // 每一个源字符拆分的位置,可取2,4,6;初始为2
point = ;
int base_index; // base64字符的索引
char n = ; // 上一个源字符的残留值
for(int index = ; index < length; index++)
{
if(point == )
{
base_index = ((*src_buff) >> point) & 0x3f; // 取得pSrcBuff的高point位
}
else if (point == )
{
base_index = ((*src_buff) >> point) & 0xf; // 取得pSrcBuff的高point位
}
else if(point == )
{
base_index = ((*src_buff) >> point) & 0x3; // 取得pSrcBuff的高point位
}
base_index += n; // 与pSrcBuff-1的低point结合组成Base64的索引
*buff_64++ = base_64_encode[base_index]; // 由索引表得到pBuff64
n = ((*src_buff) << ( - point)); // 计算源字符中的残留值
n = n & 0x3f; //确保n的最高两位为0
point += ; //源字符的拆分位置上升2
if(point == ) //如果拆分位置为8说明pSrcBuff有6位残留,可以组成一个完整的Base64字符,所以直接再组合一次
{
base_index = (*src_buff) & 0x3f; //提取低6位,这就是索引了
*buff_64++ =base_64_encode[base_index];
n = ; // 残留值为0
point = ; // 拆分位置设为2
}
src_buff++; }
if(n != )
{
*buff_64++ = base_64_encode[n];
}
if(length % == ) // 如果源字符串长度不是3的倍数要用'='补全
{
*buff_64 = '=';
}
else if(length % == )
{
*buff_64++ = '=';
*buff_64 = '=';
}
} bool CAuthentic::CReateSocket(SOCKET &sock)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( , );
err = WSAStartup(wVersionRequested, &wsaData);
if (err != )
{
return false;
}
if (LOBYTE(wsaData.wVersion) != ||
HIBYTE(wsaData.wVersion) != )
{
WSACleanup();
return false;
}
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sock == INVALID_SOCKET)
{
return false;
} sockaddr_in server_addr;
memset(&server_addr, , sizeof(sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(); // 发邮件一般都是25端口,SSL的是465端口
if(mail_info_.mail_server_name == "")
{
server_addr.sin_addr.s_addr = inet_addr(mail_info_.mail_server_ip_addr); // 直接使用IP地址
}
else
{
struct hostent *hp = gethostbyname(mail_info_.mail_server_name); // 使用名称
server_addr.sin_addr.s_addr = *(int*)(*hp->h_addr_list);
char* ip = inet_ntoa(server_addr.sin_addr);
strcpy(mail_info_.mail_server_ip_addr, ip);
} int ret = connect(sock, (sockaddr*)&server_addr, sizeof(server_addr)); // 建立连接
if (ret == SOCKET_ERROR)
{
return false;
} return true;
} bool CAuthentic::Login(SOCKET &sock)
{
recv(sock, receive_buff_, , ); memset(send_buff_, , sizeof(send_buff_));
sprintf_s(send_buff_, "HELO %s\r\n", mail_info_.mail_server_ip_addr);
send(sock,send_buff_, strlen(send_buff_), ); // 开始会话
memset(receive_buff_, , sizeof(receive_buff_));
recv(sock,receive_buff_, , );
if(receive_buff_[] != '' || receive_buff_[] != '' || receive_buff_[] != '')
{
return false;
} memset(send_buff_, , sizeof(send_buff_));
sprintf_s(send_buff_, "AUTH LOGIN\r\n");
send(sock,send_buff_, strlen(send_buff_),); // 请求登录
recv(sock,receive_buff_, , );
if(receive_buff_[] != '' || receive_buff_[] != '' || receive_buff_[] != '')
{
return false;
} memset(send_buff_, , sizeof(send_buff_));
Char2Base64(send_buff_, mail_info_.mailbox_user_name, strlen(mail_info_.mailbox_user_name));
send_buff_[strlen(send_buff_)] = '\r';
send_buff_[strlen(send_buff_)] = '\n';
send(sock,send_buff_, strlen(send_buff_), ); // 发送用户名
recv(sock,receive_buff_, , );
if(receive_buff_[] != '' || receive_buff_[] != '' || receive_buff_[] != '')
{
return false;
} memset(send_buff_, , sizeof(send_buff_));
Char2Base64(send_buff_, mail_info_.mailbox_user_pwd, strlen(mail_info_.mailbox_user_pwd));
send_buff_[strlen(send_buff_)] = '\r';
send_buff_[strlen(send_buff_)] = '\n';
send(sock, send_buff_, strlen(send_buff_), ); // 发送用户密码
recv(sock, receive_buff_, , );
if(receive_buff_[] != '' || receive_buff_[] != '' || receive_buff_[] != '')
{
return false;
}
return true; // 登录成功
} void CAuthentic::Init(sMailInfo &smail_info)
{
memcpy(&mail_info_, &smail_info, sizeof(smail_info));
}

二、测试使用

这里我用的163来测试,具体换成存在的邮箱测试

#include "AuthenticationEmail.h"

//验证邮箱
void Authenticate()
{
CSendMail mail;
sMailInfo info; info.mail_server_name = "smtp.163.com";//邮件服务器名称
info.mailbox_receiver = "receiver@qq.com";//收件人邮箱帐号
info.mailbox_sender = "sender@163.com";//发送者邮箱帐号
info.mailbox_user_name = "sendername";//发送者名字
info.mailbox_user_pwd = "xxxxxxxxx";//发送者邮箱密码 mail.Init(info); SOCKET sock;
// 建立连接
if(mail.CReateSocket(sock))
{
if(mail.Logon(sock)) // 登录邮箱
{
::MessageBox(NULL,_T("验证成功"),_T("tip"),MB_OK);
}
}
} int _tmain(int argc, _TCHAR* argv[])
{
Authenticate(); return ;
}

C++使用Socket 邮箱登录服务器验证的更多相关文章

  1. PHP用socket连接SMTP服务器发送邮件

    PHP用socket连接SMTP服务器发送邮件 PHP用socket连接SMTP服务器发送邮件学习实验记录: 分析与SMTP会话的一般流程 1. HELO XXX \r\n //XXX就是自己起个名字 ...

  2. SuperMap-iServer-单点登录功能验证(CAS)

    SuperMap-iServer-单点登录功能验证(CAS) 1.测试目的: 验证SuperMap-iServer使用CAS单点登录的功能是否正常. 2.测试环境: SuperMap-iServer8 ...

  3. SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法

    SQLSERVER误删Windows登录用户验证方式使用Windows身份验证的解决方法 今天看到这篇文章:没有了SA密码,无法Windows集成身份登录,DBA怎么办? 想起来之前着急哥问我的一个问 ...

  4. WebApi 登录身份验证

    前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权 ...

  5. net.sz.framework 框架 登录服务器架构 单服2 万 TPS(QPS)

    前言 无论我们做什么系统,95%的系统都离不开注册,登录: 而游戏更加关键,频繁登录,并发登录,导量登录:如果登录承载不起来,那么游戏做的再好,都是徒然,进不去啊: 序言 登录所需要的承载,包含程序和 ...

  6. CAS单点登录服务器搭建

    关于cas单点登录的原理及介绍这里不做说明了,直接开始: 1.war包下载 去官网(https://www.apereo.org/projects/cas/download-cas)下载cas_ser ...

  7. iptables log日志记录功能扩展应用:iptables自动配置临时访问策略,任意公网登录服务器

    一.修改日志记录: 1. 修改配置文件: vi /etc/rsyslog.conf 添加以下内容 #iptables log kern.=notice /var/log/iptables.log 2. ...

  8. [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)

    转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...

  9. 利用windows的计划任务和eKing.CmdReadFileAndSendEmailOper(控制台小程序)实现远程登录服务器的邮件告警提醒

    一.场景摘要: 1.windows计划任务中,有一个用户登录时候触发的事件 2.cmd命令:netstat -ano   | find "3389" 可以看到当前远程登录的IP 3 ...

随机推荐

  1. 一键安装openstack juno 之controller node.

    原文名称: OpenStack Juno Scripted Installation on CentOS 7 Step I:  本机信息配置 CONTROLLER_IP=192.168.173.133 ...

  2. FW 每秒百万级别的 HTTP 请求 sung: 重型的(heavy-duty)、分布式的、多协议测试工具

    本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇.它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间. 负载生成器是一些生成用于 ...

  3. android(二) SurfaceView

    (一)常用类介绍 (1). View:显示视图,内置画布,提供图形绘制函数.触屏事件.按键事件函数等:必须在UI主线程内更新画面,被动更新画面,速度较慢. (2). SurfaceView:基于vie ...

  4. linux上mysql安装详细教程

    所有平台的MySQL下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. MySQL - MySQL服务器.你需要该选项,除非你只想连接运行 ...

  5. 通过Tacker将NFV引入OpenStack

    14年的这个时候,我们还在OpenStack社区中为NFV是否属于OpenStack而争论不休.如今这一争议已经被解决了.OpenStack已经成为NFV讨论中的重要部分,正如下面的ETSI MANO ...

  6. Scala系统学习(三):Scala基础语法

    如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...

  7. 微信小程序----团购或秒杀的批量倒计时实现

    效果图 实现思路微信小程序实现倒计时,可以将倒计时的时间进行每一秒的计算和渲染! JS模拟商品列表数据 goodsList:在 onLoad 周期函数中对活动结束时间进行提取:建立时间格式化函数 ti ...

  8. PAT Product of Polynomials[一般]

    1009 Product of Polynomials (25)(25 分) This time, you are supposed to find A*B where A and B are two ...

  9. 评价指标的局限性、ROC曲线、余弦距离、A/B测试、模型评估的方法、超参数调优、过拟合与欠拟合

    1.评价指标的局限性 问题1 准确性的局限性 准确率是分类问题中最简单也是最直观的评价指标,但存在明显的缺陷.比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率.所以,当 ...

  10. Integer类之equals与hashCode

    一.源码. 1.equals源码.可以看出,比较的是两者的类型相同且内容相同.即是否有相等的int类型的value值. ######################################## ...