#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++实现 电子邮件客户端程序(简易版)相关推荐

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

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

  2. Duilib版视频监控客户端(简易版)

    Duilib版视频监控客户端(简易版) 基于目前物联网发展的形式,网络视频监控几乎无处不在,对监控的视频的查看和回放自然成了必不可少的部分,下面介绍一下使用Duilib来开发的视频监控客户端例子. 界 ...

  3. 计网实验c/c++ 电子邮件客户端程序实现发送接收邮件

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

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

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

  5. c语言电子邮件客户端程序,C语言发送电子邮件

    发送邮件需要使用SMTP协议,具体可以参考<RFC821 简单邮件传输协议>,感兴趣自己找来看看,这里仅以向邮箱里发送本地IP地址为例,说说其具体操作过程. SMTP协议的每一条指令都以& ...

  6. C语言打包解包文件程序(简易版)

    //测试通过 科嵌电子 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef uns ...

  7. 计算机网络课程设计之电子邮件客户端程序设计与实现

    前言 本实验主要是用smtp协议发邮件,收邮件要用到POP3,时间有限,只实现了发邮件,实现过程放在总体设计中 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https:/ ...

  8. 关于电子邮件客户端设计中QQ邮箱授权码问题。(运行提示535错误,说授权码error。)

    问题简述 针对QQ邮箱. 在运行设计的电子邮件客户端程序显示535授权码错误,尝试过非常多次更换授权码依然失败. 问题解决 1.进入QQ邮箱,设置--账户页面. 2.在此处注册一个英文邮件账号. 3. ...

  9. 计算机网络——电子邮件客户端程序设计与实现

    计算机网络--电子邮件客户端程序设计与实现 一.实验目的 二.总体设计 1. 基本原理 2. 设计步骤 (1)发送邮件 (2)查看邮件 三.详细设计 1. 程序流程图 (1)发送邮件 (2)查看邮件 ...

  10. 5、电子邮件客户端程序设计与实现

    一.设计题目 5.电子邮件客户端程序设计与实现 二.设计内容 设计一个电子邮件客户端程序. 三.设计步骤 3.1原理分析 一个电子邮件系统由三部分组成:用户代理.邮件服务器,以及邮件发送协议(如SMT ...

最新文章

  1. 微软技术支持工程师_微软催你买电脑啦!即可+99元即可享受上门帮教服务
  2. 如何在Membership中实现修改密码的功能
  3. android音频调制通讯,android音频口通信(一)——2FSK信号调制
  4. MybatisPlus中插入数据获取主键值
  5. 【数据算法】Java实现二叉树存储以及遍历
  6. BZOJ(8) 1053: [HAOI2007]反素数ant
  7. android 简单的音乐播放器
  8. Mybatis【#{}和${}的区别】
  9. 每日一笑 | 一个男人逐渐变心的过程
  10. kvm上添加万兆网卡_烂泥:为KVM虚拟机添加网卡
  11. 每天至少保证4个小时的学习时间
  12. java.io.IOException: Could not find status of job:job_1534233312603_0002
  13. Zookeeeper开源客户端curator watcherAPI的使用
  14. less文件转换为css文件
  15. 数据结构(C语言)-串
  16. [hgo学习]-tutorial 03
  17. 【算法】07 AM-MCMC算法C++实现
  18. cmd关闭计算机指令,取消CMD自动关机的命令是什么
  19. 武汉大学2018计算机考研拟录取名单,【完整版】2018年武汉大学硕士研究生考试拟录取名单...
  20. Fst, pi, TajimaD plink 计算

热门文章

  1. JavaWeb request对象常用操作
  2. FineUI之使用SQL脚本从数据库表中生成对应的输入控件
  3. python 的for与while 的i改变
  4. 奇妙生活-神奇的数字-1的故事
  5. dubbo实现两个系统之间的通信
  6. Android UI布局优化之ViewStub
  7. vue : 无法加载文件 D:\Program Files\nodejs\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsof t.com/fwlin
  8. vue组件化的基本使用
  9. c语言调试的意义,C语言的调试
  10. python字符串创建_python独特的字符串创建