参照教材 6.5 节原理,设计一个电子邮件客户端程序。
可实现发送与接受。
如果发送邮件出去接受不到请把代码中的输出注释取消,运行确定错误地点
不懂的评论问
base64在线转码:
https://base64.us/


#include <iostream>
#include <string>
#include <WinSock2.h>
#include <stdio.h>
#include <unistd.h>using namespace std;
#pragma comment(lib, "ws2_32.lib") /*链接ws2_32.lib动态链接库*/int main() {char buff[50000]; //收到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);SOCKADDR_IN addrServer; //服务端地址HOSTENT *pHostent;//hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表SOCKET sockClient; //客户端的套接字/*使用 MAIL 命令指定发送者使用 RCPT 命令指定接收者,可以重复使用RCPT指定多个接收者*/cout << "你想查看邮件还是发邮件?\n\t1.查看邮箱\n\t2.发送邮件\n";int call;cin >> call;if (call == 2) {sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket对象pHostent = gethostbyname("smtp.qq.com"); //得到有关于域名的信息,链接到qq邮箱服务器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)); //向服务器发送请求buff[recv(sockClient, buff, 500, 0)] = '\0';/*登录邮件服务器*/message = "ehlo qq.com\r\n";send(sockClient, message.c_str(), message.length(), 0); //发送ehlo命令buff[recv(sockClient, buff, 500, 0)] = '\0';   //接收返回值// cout <<"1" <<  buff << endl;message = "auth login\r\n";send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"2" <<  buff << endl;/*发送base64加密的用户名、密码*/message = "X==\r\n";  X换成自己邮箱的公钥send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"3" <<  buff << endl;message = "Y==\r\n";/**/  Y换成自己邮箱的密钥send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"4" <<  buff << endl;string mail;cout << "请输入收件人邮箱:";cin >> mail;message = "MAIL FROM:<1766468434@qq.com> \r\nRCPT TO:<";message.append(mail);message.append("> \r\n");send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"5" <<  buff << endl;// buff[recv(sockClient, buff, 500, 0)] = '\0';/*使用 DATA 命令告诉服务器要发送邮件内容*/message = "DATA\r\n";send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"6" <<  buff << endl;message = "From: 1766468434@qq.com\r\nTo: " + mail + "\r\nsubject:";cout << "主题:";cin >> subject;message.append(subject);message.append("\r\n\r\n");cout << "内容:";cin >> info;message.append(info);message.append("\r\n.\r\n");send(sockClient, message.c_str(), message.length(), 0);// cout <<"7" <<  buff << endl;message = "QUIT\r\n";send(sockClient, message.c_str(), message.length(), 0);buff[recv(sockClient, buff, 500, 0)] = '\0';// cout <<"8" <<  buff << endl;cout << "发送成功!" << endl;//system("pause");}if (call == 1) {sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket对象const char *host_id = "pop3.126.com";pHostent = gethostbyname("pop.qq.com");int port = 110;addrServer.sin_addr.S_un.S_addr = *((DWORD *) pHostent->h_addr_list[0]); //得到smtp服务器的网络字节序的ip地址addrServer.sin_family = AF_INET;addrServer.sin_port = htons(port); //连接端口110err = connect(sockClient, (SOCKADDR *) &addrServer, sizeof(SOCKADDR)); //向服务器发送请求buff[recv(sockClient, buff, 500, 0)] = '\0';message = "user 1766468434@qq.com\r\n";send(sockClient, message.c_str(), message.length(), 0); //发送账号buff[recv(sockClient, buff, 500, 0)] = '\0';   //接收返回值std::cout << "Client : send name \nServer:"<< buff << std::endl;message = "pass neftymzciwiqcffi\r\n";send(sockClient, message.c_str(), message.length(), 0); //发送Mimabuff[recv(sockClient, buff, 500, 0)] = '\0';   //接收返回值std::cout << "Client : send pass \nServer:"<< buff << std::endl;message = "stat\r\n";send(sockClient, message.c_str(), message.length(), 0); //发送状态buff[recv(sockClient, buff, 500, 0)] = '\0';   //接收返回值sleep(1);std::cout << "Client : send stat \nServer : "<< buff << std::endl;message = "list\r\n";send(sockClient, message.c_str(), message.length(), 0); //发送状态buff[recv(sockClient, buff, 50000, 0)] = '\0';   //接收返回值sleep(1);std::cout << "Client : send list \nServer :"<< buff << std::endl;int n;std::cout << "你先想查看那一封邮件?输入序号"<< std::endl;cin >> n;message = "retr " + to_string(n) + "\r\n";send(sockClient, message.c_str(), message.length(), 0); //发送状态sleep(1);std::cout << "Client : send retr (...) \n";//下面的while循环有些问题,目前还没有想到解决方法。以后改正!//  while(1)// {buff[recv(sockClient, buff, 50000, 0)] = '\0';   //接收返回值std::cout << "Server :" << buff << std::endl;/*int num = sock.recv_socket();std::cout << "Server :" << sock.get_recvbuf() << std::endl;*//* if(num <= 0){break;}*///  }/*  sock.send_socket("quit\r\n");std::cout << "Client : send quit \nServer :"<< sock.get_recvbuf() << std::endl;}*/}
}

计网实验c/c++ 电子邮件客户端程序实现发送接收邮件相关推荐

  1. 2020计网实验报告

    title: 计网实验报告 date: 2020-12-13 16:31:07 tags: *实验名称* 实验1 WireShark的使用 *实验时间* 2020年10月7日 10:00-11:40时 ...

  2. java 柱状图jar_GitHub - mafulong/NetworkExper: 计网实验,抓包,java,jigloo界面开发,柱状图,文件自定义保存...

    jiWangShiYanByJava 计网实验,抓包,java,jigloo界面开发,柱状图,文件自定义保存 基于Winpcap的网络流量统计分析系统的设计与实现 一.实验内容描述 本实验是用java ...

  3. 【计网实验——prj9】路由器转发实验

    [计网实验--prj9]路由器转发实验 实验要求 实验内容一 运行给定网络拓扑(router_topo.py) 在r1上执行路由器程序./router,进行数据包的处理 在h1上进行ping实验 Pi ...

  4. 【计网实验——prj6】生成树机制实验

    [计网实验--prj6]生成树机制实验 实验要求 1. 基于已有代码,实现生成树运行机制,对于给定拓扑(four_node_ring.py),计算输出相应状态下的最小生成树拓扑; 2. 自己构造一个不 ...

  5. 电子邮件客户端程序_您更喜欢哪个电子邮件客户端?

    电子邮件客户端程序 爱它或恨它,对于我们大多数人来说,电子邮件是必不可少的. 尽管多年以来人们都在谈论取代它的下一件大事,但电子邮件似乎并不会很快消失. 与许多其他形式的通信相比,电子邮件的优势之一是 ...

  6. BUAA 计网实验笔记 3

    BUAA 计网实验笔记 3 -第三周网络层实验 这周实验还是挺繁琐的,尤其是VLAN间通信,重点理解一下.要不然你可能也像我一样,实验4小时 实验(1) ARP分析 ARP协议是用来建立mac地址和i ...

  7. 基于SMTP协议的电子邮件客户端程序

    基于SMTP协议的电子邮件客户端程序 电子邮件的完整传输过程: ​ 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA ...

  8. BUAA 计网实验笔记 1

    BUAA 计网实验笔记 1 ​ - 第一周网络实验入门 尽管笔者事先预习了相关实验内容,但是,还是做了2小时的实验. (流下憨憨的眼泪,特此记录一下,后来者可留心注意下) 问题1:设备认知 在线实验平 ...

  9. 云南大学软件学院java实验九_云南大学 软件学院 计网实验

    <云南大学 软件学院 计网实验>由会员分享,可在线阅读,更多相关<云南大学 软件学院 计网实验(6页珍藏版)>请在人人文库网上搜索. 1.云南大学软件学院实 验 报 告课程: ...

最新文章

  1. 判定设备_盐雾腐蚀试验判定标准
  2. Python 字典类型的使用
  3. 计算机模块怎么算,计算基础
  4. liunx下搭建mysql主从_linux下搭建mysql主从
  5. python tkinter button_更改Python中Tkinter Button的命令方法
  6. android 崩溃捕获框架,DefenseCrash
  7. python中的super使用方法[探索4]
  8. 从入门到入土:Nessus出击:使用nessus扫描某台靶机
  9. (转)MTK_面试的几个主要问题 必看
  10. 2020考研计算机专业课,2020考研:计算机考这4个科目,各科该这样备考
  11. ASPack 2.x (without poly) - Alexey Solodovnikov [Overlay]脱壳
  12. Wannafly挑战赛2D Delete (最短路好题)
  13. 读《C专家编程》笔记-关于内存泄漏
  14. 看完这篇“史密斯圆图”告别懵逼射频!
  15. python集合的并交差操作
  16. 研发主管接私活被辞退,法院判决公司赔偿20.7万元
  17. android+cast+sdk,如何使用Android发现Chromecast设备?
  18. ABC分类法在库存优化管理中的应用原理
  19. mc服务器常用指令_我的世界服务器指令大全 最新服务器指令汇总
  20. jstree的属性设置

热门文章

  1. mysql升序降序关键字(DESC降序,ASC升序)
  2. 怎么为图片、视频设置打开方式
  3. 手工释放cache内存
  4. laravel mysql sum,Laravel 数据库操作
  5. gojs拓扑图实现节点外围圆环按钮
  6. php 对字母排序,PHP按字母顺序排序
  7. php和mhp,达人专业评测容声BDBC-516MHP质量怎么样呢?评测好不好?老铁吐露实情...
  8. 近日学习笔记:df -h和du -sh命令,查看linux版本,vbm管理工具,su命令,ssh服务升级技巧,source命令
  9. 2020最新最全的全国省市区五级四级三级地址数据库sql下载,excel下载
  10. SpringCloud大文件分片上传/多线程上传