#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邮箱是否接收到邮件

  • 代码实现
  1. #include <iostream>
  2. #include <string>
  3. #include <WinSock2.h> //适用平台 Windows
  4. using namespace std;
  5. #pragma comment(lib, "ws2_32.lib") /*链接ws2_32.lib动态链接库*/
  6.  
  7. int main()
    {
         char buff[500]; //recv函数返回的结果
         string message;
         string info;
         string subject;
  8.  
  9.      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对象
  10.  
  11.      HOSTENT* pHostent;//hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表
  12.  
  13.      pHostent = gethostbyname("smtp.qq.com"); //得到有关于域名的信息,链接到qq邮箱服务器
  14.  
  15.      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;     //输出返回值
  16.  
  17.      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加密的用户名、密码
         */
  18.  
  19.      message = "XXXXXXXX\r\n"; //base64 编码的用户名
         send(sockClient, message.c_str(), message.length(), 0);
         buff[recv(sockClient, buff, 500, 0)] = '\0';
         //cout << "usrname:" << buff << endl;
  20.  
  21.      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指定多个接收者
         */
  22.  
  23.      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";
  24.  
  25.      message.append(mail);
         message.append("> \r\n");
         //cout << "message=" << message;
  26.  
  27.      send(sockClient, message.c_str(), message.length(), 0);
  28.  
  29.      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;
  30.  
  31.     message = "From: XXX@qq.com\r\n\
        To: XXX@163.com\r\n\
        subject:";
  32.  
  33.     cout<<"主题:";
        cin>>subject;
        message.append(subject);
        message.append("\r\n\r\n");
        cout<<"内容:";
        cin>>info;
        message.append(info);
        message.append("\r\n.\r\n");
  34.  
  35.    // cout<<"message="<<message;
  36.  
  37.      /*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关键字与正文之间要有一个空行*/
  38.  
  39.      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;
  40.  
  41.      cout << "发送成功!"<<endl;
         system("pause");
    }

  运行界面

  

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

  

  • 常见报错的解决方式与注意事项:

  1.保持网络畅通

  2.报错502 有时候指令不能被识别,就重新输入一次指令,再试

  

C++实现 电子邮件客户端程序(简易版)的更多相关文章

  1. J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册)

    J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册) 之前那一版本(http://www.cnblogs.com/rojas/p/4794684.html)没考虑 DLL 注 ...

  2. 简易版AI英文问答程序解决

    第四章的作业和实践题要论印象深刻无疑就是AI的那道题了.不得不说一开始看到题目的时候,我真的蒙了很久. 本题要求你实现一个简易版的 AI 英文问答程序,规则是: 1.无论用户说什么,首先把对方说的话在 ...

  3. 使用 js 实现一个简易版的 GIPHY 动图搜索 web 应用程序

    使用 js 实现一个简易版的 GIPHY 动图搜索 web 应用程序 具有挑战性的前端面试题 API JAMstack refs https://www.infoq.cn/article/0NUjpx ...

  4. 轻松搭建CAS 5.x系列(4)-Java客户端程序接入CAS单点登录,Hello World版

    概述说明 按照本系列的前3篇文章描述的步骤,我们已经搭建好cas sso server.那应用程序怎么接入到实现sso呢? (如果您还没有搭建cas server,可以到<轻松搭建CAS 5.x ...

  5. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  6. 用C#.NET实现电子邮件客户程序

    用C#.NET实现电子邮件客户程序 周华清 戴晟辉(东华理工学院计算机与通信系 江西 抚州 344000) [摘要]通过C#这种VisualSTudio.NET中新引入的面向对象且类型安全的编程语言, ...

  7. Android学习之路——简易版微信为例(三)

    最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端 ...

  8. Android学习之路——简易版微信为例(二)

    1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样, ...

  9. C# socket实践 - 简易版FTP(Server & Client)

    写了个简易版的ftp(服务器和客户端),运行效果如下图: click download下载中的UI: 原理:模仿正规ftp方式,分成2个socket连接:文本命令socket.数据信道socket. ...

随机推荐

  1. Mysql授权root用户远程登录

    默认情况下Mysql的root用户不支持远程登录,使用以下命令授权   [Charles@localhost ~]$ mysql -uroot -p123 MariaDB [(none)]> u ...

  2. qemu 对虚机的地址空间管理

    转载:http://huchh.com/2015/06/22/qemu-%E5%AF%B9%E8%99%9A%E6%9C%BA%E7%9A%84%E7%BA%BF%E6%80%A7%E5%9C%B0% ...

  3. 基于ABP模块组件与依赖注入组件的项目插件开发

    注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://w ...

  4. axios、ajax、fetch三者的区别

    1.ajax:是指一种创建交互式网页应用的网页开发技术,并且可以做到无需重新加载整个网页的情况下,能够更新部分网页,也叫作局部更新 优缺点: 1)局部更新 2)原生支持,不需要任何插件 3)原生支持, ...

  5. 面向对象select方法

    <?php class Table{         protected $tablename;         protected $arrTable;        protected $w ...

  6. UVA1400 "Ray, Pass me the dishes!"

    思路 线段树维护最大子段和,只不过这题还要维护左右端点 还是维护pre,suf,sum,ans,只不过每个再多出一个维护端点的变量即可 注意多解讨论的大于号和大于等于号 代码 #include < ...

  7. oracle的存储过程的作用

    oracle的存储过程的作用 1.存储过程可以使得程序执行效率更高.安全性更好,因为过程建立之后 已经编译并且储存到数据库,直接写sql就需要先分析再执行因此过程效率更高,直接写sql语句会带来安全性 ...

  8. 从实验室走向世界:HSP90抑制剂,一种新的癌症药物

    热休克蛋白90(HSP90)是细胞内一种普遍存在的.十分保守的以及有高度活性的蛋白质,它在肿瘤细胞内的含量要比正常细胞多.作为一种分子伴侣,HSP90协助不同种类的癌蛋白(即HSP90的服务蛋白)进行 ...

  9. js 奇偶判断

    function isOdd(num) { == ; } function isEven(num) { == ; } function isSane(num) { return isEven(num) ...

  10. Java对象的访问方式

    之前写过一篇随笔 https://www.cnblogs.com/qianjinyan/p/10352749.html 现在看看,貌似不是很准确,方法区和栈应当区分开来,两者有很大的区别 看下面的一个 ...