C++实现 电子邮件客户端程序(简易版)
#Windows操作系统下
- 用命令行工具实现发送邮件(编程前工作)
步骤:
1.telnet连接服务器(以用QQ邮箱向网易邮箱发送邮件为例,端口号25)

2.返回220 说明连接成功

3.ehlo发送用户名(QQ邮箱用户名默认是QQ号)
返回了一堆登录方式码

4.常用auth login登录方式
返回334,成功

5.输入base64编码后的QQ邮箱账号和密码(为了保护数据)
在线转码:http://www1.tc711.com/tool/BASE64.htm
(马赛克部分分别是账号,密码)
返回 334,235表示成功

6.输入发件地址和收件地址
返回250 OK为成功

7.data命令表示要开始输入发送的数据了
按照邮件格式:
from:<发件地址>
to:<收件地址>
subject:主题
......内容......
. //输入一个点,表示内容结束了,回车即发送该邮件

8.查看163邮箱是否接收到邮件
- 代码实现
#include <iostream>
#include <string>
#include <WinSock2.h> //适用平台 Windows
using namespace std;
#pragma comment(lib, "ws2_32.lib") /*链接ws2_32.lib动态链接库*/ int main()
{
char buff[500]; //recv函数返回的结果
string message;
string info;
string subject; WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 1);
//WSAStarup,即WSA(Windows SocKNDs Asynchronous,Windows套接字异步)的启动命令
int err = WSAStartup(wVersionRequested, &wsaData);
// cout << "WSAStartup:" << err << endl;
SOCKET sockClient; //客户端的套接字
sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket对象 HOSTENT* pHostent;//hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表 pHostent = gethostbyname("smtp.qq.com"); //得到有关于域名的信息,链接到qq邮箱服务器 SOCKADDR_IN addrServer; //服务端地址
addrServer.sin_addr.S_un.S_addr = *((DWORD *)pHostent->h_addr_list[0]); //得到smtp服务器的网络字节序的ip地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(25); //连接端口25
//int connect (SOCKET s , const struct sockaddr FAR *name , int namelen ); //函数原型
err = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); //向服务器发送请求
//cout << "connect:" << err << endl;
buff[recv(sockClient, buff, 500, 0)] = '\0';
// cout << "connect:" << buff << endl;
/*
登录邮件服务器
*/
message = "ehlo qq.com\r\n";
send(sockClient, message.c_str(), message.length(), 0); //发送ehlo命令
buff[recv(sockClient, buff, 500, 0)] = '\0'; //接收返回值
// cout << "helo:" << buff << endl; //输出返回值 message = "auth login \r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
//cout << "auth login:" << buff << endl;
/*
发送base64加密的用户名、密码
*/ message = "XXXXXXXX\r\n"; //base64 编码的用户名
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
//cout << "usrname:" << buff << endl; message = "XXXXXXXXXXXX\r\n";//base64 编码的密码
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
// cout << "password:" << buff << endl;
/*
使用 MAIL 命令指定发送者
使用 RCPT 命令指定接收者,可以重复使用RCPT指定多个接收者
*/ string mail;
cout << "输入收件人邮箱:";
cin >> mail;
message = "MAIL FROM:<XXX@qq.com> \r\nRCPT TO:<";
// message = "MAIL FROM:<XXX@qq.com> \r\nRCPT TO:<XXX@163.com> \r\n"; message.append(mail);
message.append("> \r\n");
//cout << "message=" << message; send(sockClient, message.c_str(), message.length(), 0); buff[recv(sockClient, buff, 500, 0)] = '\0';
// cout << "mail from: " << buff << endl;
buff[recv(sockClient, buff, 500, 0)] = '\0';
// cout << "rcpt to: " << buff << endl;
/*
使用 DATA 命令告诉服务器要发送邮件内容
*/
message = "DATA\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
//cout << "data: " << buff << endl; message = "From: XXX@qq.com\r\n\
To: XXX@163.com\r\n\
subject:"; cout<<"主题:";
cin>>subject;
message.append(subject);
message.append("\r\n\r\n");
cout<<"内容:";
cin>>info;
message.append(info);
message.append("\r\n.\r\n"); // cout<<"message="<<message; /*message = "From: XXX@qq.com\r\n\
To: XXX@163.com\r\n\
subject: test\r\n\r\n\
Just a test!\r\n\
your friend\r\n\
Ctt\r\n.\r\n"; //注意subject关键字与正文之间要有一个空行*/ send(sockClient, message.c_str(), message.length(), 0);
message = "QUIT\r\n";
send(sockClient, message.c_str(), message.length(), 0);
buff[recv(sockClient, buff, 500, 0)] = '\0';
//cout << "QUIT:" << buff << endl; cout << "发送成功!"<<endl;
system("pause");
}
运行界面

查看邮箱(有bug,主题没有正确设定)

- 常见报错的解决方式与注意事项:
1.保持网络畅通
2.报错502 有时候指令不能被识别,就重新输入一次指令,再试
C++实现 电子邮件客户端程序(简易版)的更多相关文章
- J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册)
J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册) 之前那一版本(http://www.cnblogs.com/rojas/p/4794684.html)没考虑 DLL 注 ...
- 简易版AI英文问答程序解决
第四章的作业和实践题要论印象深刻无疑就是AI的那道题了.不得不说一开始看到题目的时候,我真的蒙了很久. 本题要求你实现一个简易版的 AI 英文问答程序,规则是: 1.无论用户说什么,首先把对方说的话在 ...
- 使用 js 实现一个简易版的 GIPHY 动图搜索 web 应用程序
使用 js 实现一个简易版的 GIPHY 动图搜索 web 应用程序 具有挑战性的前端面试题 API JAMstack refs https://www.infoq.cn/article/0NUjpx ...
- 轻松搭建CAS 5.x系列(4)-Java客户端程序接入CAS单点登录,Hello World版
概述说明 按照本系列的前3篇文章描述的步骤,我们已经搭建好cas sso server.那应用程序怎么接入到实现sso呢? (如果您还没有搭建cas server,可以到<轻松搭建CAS 5.x ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- 用C#.NET实现电子邮件客户程序
用C#.NET实现电子邮件客户程序 周华清 戴晟辉(东华理工学院计算机与通信系 江西 抚州 344000) [摘要]通过C#这种VisualSTudio.NET中新引入的面向对象且类型安全的编程语言, ...
- Android学习之路——简易版微信为例(三)
最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端 ...
- Android学习之路——简易版微信为例(二)
1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样, ...
- C# socket实践 - 简易版FTP(Server & Client)
写了个简易版的ftp(服务器和客户端),运行效果如下图: click download下载中的UI: 原理:模仿正规ftp方式,分成2个socket连接:文本命令socket.数据信道socket. ...
随机推荐
- 关于Mysql数据库的学习总结
关于Mysql操作指令: 1.键盘win + R 弹出windows运行输入框,输入cmd命令,进入windows数据库; 2.在windows数据库里输入mysql(数据库) -uroot(用户 ...
- 彻底解决(Microsoft Visual C++ 14.0 is required)的步骤123
之前要用协程gevent,安装pip install gevent包时遇到Microsoft Visual C++ 14.0 is required的报错提示,各种下载没有解决很头疼, 前两天安装sc ...
- Linux hostname设置,静态ip设置,hostname与静态ip相互映射
1,hostname设置 永久设置: centos 7 下,切换到root 用户 vi /etc/hostname 输入要修改的hostname centos 6或者其他linux 系统,可能在/et ...
- git常用操作记录
之前的多人项目大多使用了SVN作为版本控制,自己只会用eclipse连接GitHub的操作.这次项目采用了git作为版本控制系统,所以学会了很多新操作,这里权当记录,以备后用. git的一些基本操作可 ...
- 调度器的实现、schedule、switch_context、switch_to
根据<深入Linux内核架构>和Linux-3.10.1内核源码,记一些调度过程的主体工作. 调度器任务:CPU数目比要运行的进程数目少,需要程序之间共享CPU时间,创造并行执行的错觉.分 ...
- web前端开发学习路线图
Web前端是一个入行门槛较低的开发技术,但更是近几年热门的职业,web前端不仅薪资高发展前景好,是很多年轻人向往的一个职业,想学习web前端,那么你得找到好的学习方法,以下就给大家分享一份适合新手小白 ...
- windows安装composer总结
1.直接去网吧下载windows安装EXE程序,傻瓜式安装,so easy. 2.通过命令行安装,可以直接在php目录跑起来 php -r "readfile('https://getcom ...
- Python selectors实现socket并发
selectors模块 此模块允许基于选择模块原语构建高级别和高效的I / O多路复用. 鼓励用户使用此模块,除非他们想要精确控制使用的os级别的原语. 注:selectors也是包装了select高 ...
- Kerberos 常用命令
最近项目组用CDH搭建数据开发环境,有用到Kerberos安全组件.如下是相关命令,请参考: 进入kadmin kadmin.local / kadmin 创建数据库 kdb5_util create ...
- 【Python游戏编程03--pygame事件与设备轮询】
一.pygame事件 1.pygame事件可以处理游戏中的各种事情,完整的事件列表如下: QUIT,ACTIVEEVENT,KEYDOWN,KEYDOWN,MOUSEMOTION,MOUSEBUTTO ...