本文的主要内容是通过两种方式实现简单邮件的接收,一种方式是通过C语言实现,另一种是通过C#实现的,

两种方式在实现上有许多的不同之处,但是本质上都是一样的.

一,C语言实现方式

C语言接收邮件的步骤:

1.创建TCP连接   端口:默认110

2.连接到Pop3服务器 服务器名称:例如"pop3.163.com"

3.认证登录      用户账号,密码

4.发送请求,接收服务端信息   send(...)  返回"+OK"

   a.获取邮箱中邮件的数量    "STAT\r\n" 返回"+OK 10 ..."

   b.获取每个邮件的大小      "LIST\r\n"

   c.获取指定邮件的前n行数据 "TOP [nMsg] [nLine]"

                   nMsg:第nMsg封

                   nLine:前nLine行

d.获取指定邮件信息内容    "RETR [nMsg]\r\n"

实现代码如下:

//创建TCP连接

 if ((connection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
return INVALID_SOCKET;
}

//连接到Pop3服务器

 void ConnectToServer()
{
//设置SockAddr_In地址结构
SOCKADDR_IN serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(POP3_PORT);/*POP3_PORT=110*/
7 //serverName="POP3.163.com";
serAddr.sin_addr.s_addr = inet_addr(serverName);
if (serAddr.sin_addr.s_addr == INADDR_NONE)
{
LPHOSTENT lphost;
lphost = gethostbyname(serverName);
if (lphost != NULL)
{
serAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->S_un.S_addr;
}
else
{
WSASetLastError(WSAEINVAL);
return;
}
//连接
connect(connection, (SOCKADDR *)&serAddr, sizeof(serAddr))
return; }

//接收数据

//获取邮箱中邮件的数量

 //获取邮件的数量
int GetNumEmail(SOCKET connection)
{
char sStat[]={"STAT\r\n"};
char response_buf[RESPONSE_BUFFER_SIZE]={}; send(connection,sStat,strlen(sStat),);
if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,)==SOCKET_ERROR )
return -; char szResponse[]={};
strncpy(szResponse,response_buf,);
if( strcmp(szResponse,"+OK")== ) //返回正确的消息内容 "+OK 10..."
return GetNumFromBuf(response_buf);
return ;
}

//获取每个邮件的大小

 //获取每个邮件的大小
BOOL GetList(SOCKET connection)
{
char szList[]={};
sprintf(szList,"LIST\r\n"); char response_buf[RESPONSE_BUFFER_SIZE]={};
send(connection,szList,strlen(szList),);
if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,)==SOCKET_ERROR )
return FALSE; printf("receive data:%s",response_buf); //返回的数据
return TRUE;
}

//获取指定邮件的前n行数据

 //获取指定邮件的前n行数据
BOOL GetTop(SOCKET connection,int nMsg,int nLine)
{
char szTop[]={};
sprintf(szTop,"TOP %d %d\r\n",nMsg,nLine); char response_buf[RESPONSE_BUFFER_SIZE]={};
send(connection,szTop,strlen(szTop),);
Sleep(nLine*); // 延迟,等待数据完全接收完毕
if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE,)==SOCKET_ERROR)
return FALSE; printf("Receive Data:%s\n",response_buf);
return TRUE;
}

//获取指定邮件的内容

 //获取指定邮件的内容
BOOL GetEmail(SOCKET connection,int nMsg,char *msg)
{
char sRetr[]={};
sprintf(sRetr,"RETR %d\r\n",nMsg); char response_buf[RESPONSE_BUFFER_SIZE*]={};
send(connection,sRetr,strlen(sRetr),);
Sleep(); //必须添加延迟,以便能够完整的接收数据
if( recv(connection,response_buf,RESPONSE_BUFFER_SIZE*,) ==SOCKET_ERROR )
return FALSE; printf("Receive Data:%s\n",response_buf);
return TRUE;
}

一,C#实现方式

C#接收邮件的步骤:

1.需要引入第三方的类库(OpenPop.dll 官网下载地址:http://sourceforge.net/projects/hpop/)   ,并且在项目中添加OpenPop的引用.

2.使用OpenPop.dll类库中的Pop3Client类创建一个Pop3服务端的对象,

连接服务器,并进行认证登录.     host:pop3.163.com port:默认110

3.通过Pop3Client对象中的方法收取邮件信息.

a.GetMessageCount()                             //获取邮件的数量

b.GetMessage(int messageNumber)      //获取编号为messageNumber的邮件的内容

c.GetMessageSize(int messageNumber)   //获取编号为messageNumber的邮件的大小

d.DeleteMessage(int messageNumber)      //删除编号为messageNumber的邮件(仅仅是标记,只有QUIT之后才真正删除)

//...

4.关闭连接,释放资源.

部分代码如下:

//创建PopClient对象,连接认证

 using( Pop3Client client=new Pop3Client() )
{
Client.Connect(host, Pop3_Port, false); //账号,密码,认证方式
Client.Authenticate(userAddr, password, AuthenticationMethod.Auto); //登录认证
//...
}

//获取邮箱中邮件的相关信息

1  //...
int count=client.GetMessageCount(); //获取邮箱总数
int size=client.GetMessageSize(); //获取编号为1的邮件的大小
OpenPop.Mime.Message msg=client.GetMessage(); //获取编号为1的邮件的内容
client.DeleteMessage(); //标记编号为1的邮件为"删除" //...

//获取邮件的头部以及附件信息

 //...
OpenPop.Mime.Message msg=client.GetMessage(); //从msg中的Headers成员中获取信息
string from=msg.Headers.From.Address;
string SendDate=msg.Headers.DateSent.ToLocalTime().ToString();
string Subject=msg.Headers.Subject;
string Body=msg.FindFirstPlainTextVersion().GetBodyText(); //获取附件信息
List<MessagePart> attachments=msg.FindAllAttachments();
int attachCount=attachments.Count;
if( attachCount> )
{
string fileName=attachments[].FileName; //附件名称 //保存附件内容
using( FileStream fs=new FileStream(@"C:\01.txt",FileMode.OpenOrCreate) )
{
attachments[].Save(fs);
}
}
//...

C和C#两种方式实现邮件的简单接收的更多相关文章

  1. C和C#两种方式实现邮件的简单发送

    内容为通过两种方式发送邮件--1.C语言发送邮件   2.C#发送邮件 一,C语言进行邮件的发送 C语言发送邮件的步骤的简单解析: 1.创建TCP连接    socket() 2.连接到邮箱服务器  ...

  2. spring接收json字符串的两种方式

    一.前言 前几天遇到一个问题,前端H5调用我的springboot一个接口(post方式,@RequestParameter接收参数),传入的参数接收不到.自己测试接口时使用postman的form- ...

  3. 基于Maven的SpringBoot项目实现热部署的两种方式

    转载:http://blog.csdn.net/tengxing007/article/details/72675168 前言 JRebel是JavaEE中比较流行的热部署插件,可快速实现热部署,节省 ...

  4. Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  5. Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  6. Android Studio签名打包的两种方式

    签名打包的两种方式: 注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如 ...

  7. Log4Net日志记录两种方式

     简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Ap ...

  8. C# 如何通过mailto标签和SMTP协议两种方式发送邮件

    本文主要讲解如何通过如现mailto标签和SMTP协议两种方式发送邮件,下面就直入主题 方法一.通过mailto标签发送邮件 通过mailto不是正真意义上的发送邮件,它只是会自动调用我们本地默认的邮 ...

  9. 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)

    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...

随机推荐

  1. 通过virt-manager 利用NFS创建、迁移虚拟机1

    NFS作为一种网络文件系统,近些年随着云计算的发展也变得越来越受欢迎.因为云环境下会部署大量的虚拟机,而在物理机发生故障的时候,云服务商必须要保障虚拟机的安全性,即不能因为物理机的故障就停止虚拟机.这 ...

  2. Linux cp命令

    cp命令(copy),用来对一个或多个文件,目录进行拷贝 1.语法 cp [选项] [参数] 2.命令选项 -b 当文件存在时,覆盖前,为其创建一个备份-d 当复制软连接时,把目标文件或目录也建立为软 ...

  3. Apache http server linux 安装过程说明

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sundenskyqq/article/details/24733923 PS:Apache http ...

  4. hadoop-3.0.0-beta1分布式安装

    楼主是从Hadoop2.x版本过来的,在工作之余自己搭建了一套3.0的版本来耍一耍,此文章的前置环境准备工作省略.主要介绍一些和Hadoop2.x版本不同的安装之处 Hadoop版本:hadoop-3 ...

  5. 汇编的WEAK关键字

    一般来说,这个关键字使用在IMPORT和EXPORT这两个声明段. ////////////////////////////////////////////////////////////////// ...

  6. PAT 1145 Hashing - Average Search Time [hash][难]

    1145 Hashing - Average Search Time (25 分) The task of this problem is simple: insert a sequence of d ...

  7. usr/bin/ld: cannot find 错误解决方法和 /etc/ld.so.conf

    我makefile出现这个错误: HelloWorldServer.c:(.text+0xaa): undefined reference to `zmq_send'collect2: error: ...

  8. gdb core

    程序运行发生异常退出,比如segment错误,此时可以利用系统生成的core文件,配合GDB来定位问题. 问题程序: segment.c #include <stdio.h> #inclu ...

  9. 聊一聊python的单例模式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  10. Mysql—(1)—

    sql语句 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出“做什么”的命 ...