上面一篇已经讲到如何发信了,今天索性来个结尾谈一谈如何发信!

      和前面的流程差不多,我们也手工模拟一次发信流程!

      其实和前面的发信流程差不太多!一样的,我们以网易的邮箱为例!

     我们先要连接到网易的pop邮箱!

     命令为: telnet pop.163.com 110

     意思很明显,要求连接到网易的pop服务器的110号端口.

     

     然后就可以登陆了!

     输入命令:user xxxxx (你的用户名,不用加密)

      如果没有出错的话,系统一般会返回+OK之类的东西.

    然后输入:pass xxxxxx(你邮箱的密码,不加密)

      一样的,如果没有出错的话,系统一般会返回+OK之类的东西.

      

     现在我们就可以操作了!

     虽然可以使用的命令很多,不过最常用的命令只有两个!

      第一个是list命令,用来列出邮件的条目!我们看一下!

      

       表示有19封邮件,右边是邮件大小。

       还有一个命令自然是retr命令了!它用来获取邮件!看我演示:

       

      retr使用规则是 retr + 你要获取的邮件的编号!

      好吧!既然已经说到这份上了,我顺便提一句!服务器发送的大部分内容是用base64加密了的,所以我们看到满屏幕的字母!那么怎么读取出内容呢?这不是这篇文章的重点,所以我们代码采取的方式是直接将服务器发送过来的邮件内容写到文件里,存成.eml文件,然后邮件客户端可以打开这种文件,推荐采用foxmail来打开这种文件!

      最后,不要忘了quit命令,关闭与服务器的连接,这里就不再演示!

      看代码吧!

   pop3.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pop3.h"CPop3::CPop3()
{WSADATA wsaData;WORD version = MAKEWORD(2, 0);WSAStartup(version, &wsaData);
}CPop3::~CPop3()
{WSACleanup();
}int CPop3::Pop3Recv(char* buf, int len, int flags)
{/*接收数据*/int rs;int offset = 0;do {if (offset > len - 2)return offset;rs = recv(m_sock, buf + offset, len - offset, flags);if (rs < 0) return -1;offset += rs;buf[offset] = '\0';}while (strstr(buf, "\r\n.\r\n") == (char*)NULL);return offset;
}bool CPop3::Create(const char* username,   //用户名const char* userpwd,       //用户密码const char* svraddr,      //服务器地址unsigned short port      //服务端口)
{strcpy(m_username, username);strcpy(m_userpwd, userpwd);strcpy(m_svraddr, svraddr);m_port = port;return true;
}bool CPop3::Connect()
{//创建套接字m_sock = socket(AF_INET, SOCK_STREAM, 0);//IP地址char ipaddr[16];struct hostent* p;if ((p = gethostbyname(m_svraddr)) == NULL) //如果得不到服务器信息,就说明出错{return FALSE;}sprintf(ipaddr,"%u.%u.%u.%u",(unsigned char)p->h_addr_list[0][0],(unsigned char)p->h_addr_list[0][1],(unsigned char)p->h_addr_list[0][2],(unsigned char)p->h_addr_list[0][3]);//连接pop服务器struct sockaddr_in svraddr;svraddr.sin_family = AF_INET;svraddr.sin_addr.s_addr = inet_addr(ipaddr);svraddr.sin_port = htons(m_port);int ret = connect(m_sock, (struct sockaddr*)&svraddr, sizeof(svraddr));if (ret == SOCKET_ERROR) {return FALSE;}//接收pop3服务器发来的欢迎信息char buf[128];int rs = recv(m_sock, buf, sizeof(buf), 0);buf[rs] = '\0';printf("%s", buf);if (rs <= 0 || strncmp(buf, "+OK", 3) != 0)  /*服务器没有返回OK就出错了*/{return FALSE;}return TRUE;
}bool CPop3::Login()
{/*登陆*//*发送用户命令*/char sendbuf[128];char recvbuf[128];sprintf(sendbuf, "USER %s\r\n", m_username);printf("%s", sendbuf);send(m_sock, sendbuf, strlen(sendbuf), 0); //发送用户名int rs = recv(m_sock, recvbuf, sizeof(recvbuf), 0);   //接收服务器发来的信息recvbuf[rs] = '\0';if ( rs <= 0 || strncmp(recvbuf, "+OK", 3) != 0 )  //如果没有"+OK"就说明失败了{return FALSE;}printf("%s", recvbuf);/*发送密码信息*/memset(sendbuf, 0, sizeof(sendbuf));sprintf(sendbuf, "PASS %s\r\n", m_userpwd);send(m_sock, sendbuf, strlen(sendbuf), 0);printf("%s", sendbuf);rs = recv(m_sock,recvbuf, sizeof(recvbuf), 0);recvbuf[rs] = '\0';if (rs <= 0 || strncmp(recvbuf, "+OK", 3) != 0) {return FALSE;}       printf("%s", recvbuf);return TRUE;
}bool CPop3::List(int& sum)
{/*发送list命令*/char sendbuf[128];char recvbuf[256];sprintf(sendbuf, "LIST \r\n");send(m_sock, sendbuf, strlen(sendbuf), 0);printf("%s", sendbuf);int rs = recv(m_sock, recvbuf, sizeof(recvbuf), 0);if (rs <= 0 || strncmp(recvbuf, "+OK", 3) != 0){return FALSE;}recvbuf[rs] = '\0';printf("%s", recvbuf);sum = GetMailSum(recvbuf); //得到邮件的数目return TRUE;
}bool CPop3::FetchEx(int num)
{int rs;FILE* fp;int flag = 0;unsigned int len;char filename[256];char sendbuf[128];char recvbuf[20480];/* 发送RETR命令*/sprintf(sendbuf, "RETR %d\r\n", num);send(m_sock, sendbuf, strlen(sendbuf), 0);do {rs = Pop3Recv(recvbuf, sizeof(recvbuf), 0); //接收数据if (rs < 0) {return FALSE;}recvbuf[rs] = '\0';printf("Recv RETR Resp: %s", recvbuf); //输出接收的数据if (flag == 0){itoa(num, filename, 10); //按照序号给文件排名strcat(filename, ".eml");flag = 1;fp = fopen(filename, "wb");//准备写文件}len = strlen(recvbuf);fwrite(recvbuf, 1, len, fp);fflush(fp); //刷新 }while (strstr(recvbuf, "\r\n.\r\n") == (char*)NULL);fclose(fp);return TRUE;
}bool CPop3::Quit()
{char sendbuf[128];char recvbuf[128];/*发送QUIT命令*/sprintf(sendbuf, "QUIT\r\n");send(m_sock,sendbuf, strlen(sendbuf), 0);int rs = recv(m_sock, recvbuf, sizeof(recvbuf), 0);if (rs <= 0 || strncmp(recvbuf, "+OK", 3) != 0){return FALSE;}closesocket(m_sock);return TRUE;
}int CPop3::GetMailSum(const char* buf)
{int sum = 0;char* p = strstr(buf, "\r\n"); if (p == NULL)return sum;p = strstr(p + 2, "\r\n");if (p == NULL)return sum;while ((p = strstr(p + 2, "\r\n")) != NULL) {sum++;}return sum;
}

pop3.h

#include <WinSock2.h>
#pragma  comment(lib, "ws2_32.lib")   /*链接ws2_32.lib动态链接库*/class CPop3 {public:CPop3();~CPop3();//初始化pop3的属性bool Create(const char* username, const char* userpwd, const char* svraddr, unsigned short port = 110);//连接pop3服务器bool Connect();//登陆的服务器bool Login();//利用list命令得到所有的邮件数目bool List(int& sum);//获得序号为num的邮件bool FetchEx(int num = 1);//退出命令bool Quit();protected:int GetMailSum(const char* buf);SOCKET m_sock;char m_username[32];  /*用户名*/char m_userpwd[32];      /*密码*/char m_svraddr[32];       /*服务器域名*/unsigned short m_port;private:int Pop3Recv(char* buf, int len, int flags = 0);};

然后用一个主程序测试一下:

    main.cpp

#include <stdio.h>
#include "pop3.h"int main()
{int sum;CPop3 pop3;char userName[256] = "it_is_just_a_test@163.com";char password[256] = "19930714lyh";char srv[256] = "pop.163.com";pop3.Create(userName, password, srv, 110); pop3.Connect(); //连接pop3服务器pop3.Login();pop3.List(sum);if (sum < 0)printf("You have no letter in box !");for (int i = 1; i <= sum; i++) {pop3.FetchEx(i);}pop3.Quit();return 0;
}

 在VC6下面测试完美通过!然后看看你的工程的文件夹下面,是不是出现了很多.eml文件?这些文件可以用foxmail打开,这就是接收到的邮件!赶快尝试一下吧!

     文章写到这里,建议的收信,写信基本上都已经说明白了,其实你稍微包装一下,就可以写出一段MFC的邮件客户端的代码,加个壳而已!


简易电子邮件收信的原理以及实现相关推荐

  1. 电子邮件服务器的工作原理,电子邮件工作原理 电子邮件有什么特点呢

    电子邮件是交流信息的一种通信方式,可以用来传输文件和图片,还是非常方便的.很多人对电子邮件的工作原理感到好奇,电子邮件工作原理是怎样的?电子邮件有什么特点呢? 电子邮件工作原理 电子邮件工作原理 电子 ...

  2. 服务器搭建实战详解--电子邮件服务器之一--基础原理

    电子邮件服务简介 邮件用户代理程序 MUA(Mailer User Agent, 邮件用户代理程序),主要用于帮助用户发送和收取电子邮件.如outlook.foxmail等都属于MUA. 邮件传送代理 ...

  3. 免费邮箱,谁更可靠?6款常用免费邮箱收信效果对比测试

    作者:一石来源:家用电脑 现在的电子邮箱普遍都提供了很大的存储空间,功能也更加多样,使用起来越来越简单.可是作为电子邮箱最为关键的收信发信功能却不如人意.且不说由于网络故障导致的邮箱断网这样的重大事故 ...

  4. 浅析C#发送短信的原理

    C#发送短信,我们都知道这个基本的应用,但是内部的原理是什么呢?这里我们想大家简单介绍,希望对你理解C#发送短信息的原理有所帮助. 我想当很多读者一看到本文的题目一定会想本文内容一定非常深奥,并且作者 ...

  5. C#开发终端式短信的原理和方法

    本文示例源代码或素材下载 简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物,通讯发达的今天短信已经成为人们交流的重要手段,其中也蕴含着巨大的市场和经济利益,掌握短信技术的人才也受到各大公司的追捧 ...

  6. C#开发终端式短信的原理和方法 .

    简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物,通讯发达的今天短信已经成为人们交流的重要手段,其中也蕴含着巨大的市场和经济利益,掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星.本 ...

  7. Gmail 收信的一些规则

    Gmail 收信的一些规则 用 apache+php+MDaemon 调试 mail2www 时,发往gmail的邮件失败, 提示: Our system detected an illegal at ...

  8. Outlook 2013 英文版 设置收信规则

    [Outlook 2013 英文版 设置收信规则] 打开 Outlook 2013  切换到 HOME 选项卡 点击 [Rules] 文件夹图标 1)点击 [Create Rule] 可以创建一条新规 ...

  9. 邮箱大师手机版服务器异常,网易邮箱大师无法收信怎么办 网易邮箱大师无法收信的解决办法...

    网易邮箱大师无法收信怎么办 网易邮箱大师无法收信的解决办法 2016-08-26 作者:admin 来源:最笨 相信使用网易邮箱大师无法收信的朋友不少,下面这边小编就分享一下解决的办法,希望对大家有所 ...

最新文章

  1. 树莓派+百度api实现人脸识别
  2. 信息安全技术 网络安全等级保护测评要求_【诚资讯】等保2.0版本出炉!信息安全技术 网络安全等级保护基本要求正式发布...
  3. linux sublime nodejs,Ubuntu环境下sublime3 nodejs安装与插件配置
  4. 我是如何提升 Rust 编译器的速度?
  5. 【问题解决方案】anaconda-python在cmd-pip安装requests后依然提示No module named requests
  6. [转] 常用Loss函数
  7. 求原谅---好久没更新了
  8. PowerMockito Mock私有方法
  9. 字符串前面添加u,r,b的含义
  10. 阵列信号处理仿真二——波束方向图的绘制
  11. linux给内存卡分区,Android系统手机内存卡分区详解
  12. 门禁控制器的选购指南
  13. MySQL 数据表优化设计(六):id 该如何选择数据类型?
  14. 题目:学生成绩管理系统设计(C语言程序设计期末作业)
  15. 欧盟对湾区建设_欧盟委员会对.EU域名进行掉头处理
  16. 渐开线花键齿轮与渐开线圆柱齿轮
  17. 综合案例 跳转到主页面(index)
  18. matlab空间计量模型AIC和SC,空间计量模型
  19. QQ群单个私聊给每个群成员发消息 第2版使用属性页 按键精灵源码
  20. 数商云供应链集采管理系统解决方案:集采系统管理模式,数字化管控企业物资

热门文章

  1. 你知道近来年大火的DDD是如何兴起的吗?以及与微服务的关系
  2. Vss2005使用相关文章
  3. 集体户口和个人户口的区别,看完你就明白了
  4. HTML 网页图片地址正确但不显示
  5. 100道Java高频面试题(阿里面试官整理)
  6. 那些年我们用过的final和static
  7. 时更新 在线观察纸黄金价格 24小时黄金走势图使用现货买入价格 黄金价格历史走势图 全天显示黄金,银,钯 和 铂以及原油期货,美元指数的最新价格
  8. 深度学习:利用神经网络在少量数据情况下预测房价走势
  9. android 盒子排名,2020年电视盒子排行榜:盘点今年性能最高的五款电视盒子
  10. idea报错:Parent ‘Unknown:Unknown:Unknown‘ has problems