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 有时候指令不能被识别,就重新输入一次指令,再试
转载于:https://www.cnblogs.com/cttcarrotsgarden/p/10154139.html
C++实现 电子邮件客户端程序(简易版)相关推荐
- 电子邮件客户端程序_您更喜欢哪个电子邮件客户端?
电子邮件客户端程序 爱它或恨它,对于我们大多数人来说,电子邮件是必不可少的. 尽管多年以来人们都在谈论取代它的下一件大事,但电子邮件似乎并不会很快消失. 与许多其他形式的通信相比,电子邮件的优势之一是 ...
- Duilib版视频监控客户端(简易版)
Duilib版视频监控客户端(简易版) 基于目前物联网发展的形式,网络视频监控几乎无处不在,对监控的视频的查看和回放自然成了必不可少的部分,下面介绍一下使用Duilib来开发的视频监控客户端例子. 界 ...
- 计网实验c/c++ 电子邮件客户端程序实现发送接收邮件
参照教材 6.5 节原理,设计一个电子邮件客户端程序. 可实现发送与接受. 如果发送邮件出去接受不到请把代码中的输出注释取消,运行确定错误地点 不懂的评论问 base64在线转码: https://b ...
- 基于SMTP协议的电子邮件客户端程序
基于SMTP协议的电子邮件客户端程序 电子邮件的完整传输过程: 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA ...
- c语言电子邮件客户端程序,C语言发送电子邮件
发送邮件需要使用SMTP协议,具体可以参考<RFC821 简单邮件传输协议>,感兴趣自己找来看看,这里仅以向邮箱里发送本地IP地址为例,说说其具体操作过程. SMTP协议的每一条指令都以& ...
- C语言打包解包文件程序(简易版)
//测试通过 科嵌电子 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef uns ...
- 计算机网络课程设计之电子邮件客户端程序设计与实现
前言 本实验主要是用smtp协议发邮件,收邮件要用到POP3,时间有限,只实现了发邮件,实现过程放在总体设计中 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https:/ ...
- 关于电子邮件客户端设计中QQ邮箱授权码问题。(运行提示535错误,说授权码error。)
问题简述 针对QQ邮箱. 在运行设计的电子邮件客户端程序显示535授权码错误,尝试过非常多次更换授权码依然失败. 问题解决 1.进入QQ邮箱,设置--账户页面. 2.在此处注册一个英文邮件账号. 3. ...
- 计算机网络——电子邮件客户端程序设计与实现
计算机网络--电子邮件客户端程序设计与实现 一.实验目的 二.总体设计 1. 基本原理 2. 设计步骤 (1)发送邮件 (2)查看邮件 三.详细设计 1. 程序流程图 (1)发送邮件 (2)查看邮件 ...
- 5、电子邮件客户端程序设计与实现
一.设计题目 5.电子邮件客户端程序设计与实现 二.设计内容 设计一个电子邮件客户端程序. 三.设计步骤 3.1原理分析 一个电子邮件系统由三部分组成:用户代理.邮件服务器,以及邮件发送协议(如SMT ...
最新文章
- 微软技术支持工程师_微软催你买电脑啦!即可+99元即可享受上门帮教服务
- 如何在Membership中实现修改密码的功能
- android音频调制通讯,android音频口通信(一)——2FSK信号调制
- MybatisPlus中插入数据获取主键值
- 【数据算法】Java实现二叉树存储以及遍历
- BZOJ(8) 1053: [HAOI2007]反素数ant
- android 简单的音乐播放器
- Mybatis【#{}和${}的区别】
- 每日一笑 | 一个男人逐渐变心的过程
- kvm上添加万兆网卡_烂泥:为KVM虚拟机添加网卡
- 每天至少保证4个小时的学习时间
- java.io.IOException: Could not find status of job:job_1534233312603_0002
- Zookeeeper开源客户端curator watcherAPI的使用
- less文件转换为css文件
- 数据结构(C语言)-串
- [hgo学习]-tutorial 03
- 【算法】07 AM-MCMC算法C++实现
- cmd关闭计算机指令,取消CMD自动关机的命令是什么
- 武汉大学2018计算机考研拟录取名单,【完整版】2018年武汉大学硕士研究生考试拟录取名单...
- Fst, pi, TajimaD plink 计算
热门文章
- JavaWeb request对象常用操作
- FineUI之使用SQL脚本从数据库表中生成对应的输入控件
- python 的for与while 的i改变
- 奇妙生活-神奇的数字-1的故事
- dubbo实现两个系统之间的通信
- Android UI布局优化之ViewStub
- vue : 无法加载文件 D:\Program Files\nodejs\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsof t.com/fwlin
- vue组件化的基本使用
- c语言调试的意义,C语言的调试
- python字符串创建_python独特的字符串创建