POP3(邮局协议3)是一种标准协议的最新版本接收电子邮件。POP3是一种客户机/服务器协议收到的电子邮件和为你了你的网络服务器。定期,你(或你的客户邮件收件人)检查你的信箱在服务器和下载任何邮件,可能使用POP3。传统的接收邮件方式使用的是未加密的接收方式,后期考虑到数据安全性能,传输过程中使用SSL加密.outlook 2007 以后的版本默认是加密的。

在90年代的DOS系统下,我们想访问一个文件夹,需要在控制台上输入一串命令,系统接收命令后开始工作。这个方式我称之为渐进式。Pop3的原理类似。

POP3的常用命令有:

USER 用户名

PASS 密码

STAT 返回信息数

RETR 读取邮件详情

QUIT 退出

首先我们定义公用的NetWorkStream,这个公共 流是我们获取邮件的关键。

调用接口公用方法:

private void WriteTo(ref NetworkStream netStream, string command)

{

string strToSend = command + "\r\n";

byte[] arrayToSend = System.Text.Encoding.ASCII.GetBytes(strToSend.ToCharArray());

if (netStream.CanWrite)

netStream.Write(arrayToSend, 0, arrayToSend.Length);

}

登陆PoP3时需要输入一个连接服务器的命令。

Client = newTcpClient(HostName, Port);

Client.ReceiveTimeout= 2000;

netStream=Client.GetStream();

streamReader= newStreamReader(Client.GetStream());string strMessage = streamReader.ReadLine();

连接上POP3服务器上可以看到strMessage 成功返回了一个含有 +OK 的字符串,然后就可以输入用户名和密码了。

WriteTo(ref netStream, “USER **@qq.com”);

WriteTo(ref netStream, “PASS ****”);

正常登陆返回未读邮件总数,接下来就可以读取每一封邮件了。

邮件的解析工作是一个很头疼的问题,因为所有的信息都包含在一个返回的流文件里面,看上去很没有条理。

文件流里包含一定格式的标志位,常用标志位有:

Subject 邮件主题

SendTime 发送时间

Content 内容

From 发件人

Attach 附件

解析邮件主题的公用方法

///

///查找完整数据索引号///

///

///

///

private int EndIndex(stringcontext)

{

List ints = new List();foreach (string item inmailMarkets)

{int index =context.IndexOf(item, StringComparison.OrdinalIgnoreCase);if (index > 0)

ints.Add(index);

}var result = ints.OrderBy(p =>p).ToList();return result.Count > 0 ? result.First() : -1;

}

解析邮件主题

int staIndex = strContent.IndexOf("Subject:");

prefixion= strContent.Remove(0, staIndex + 8);

enIndex=EndIndex(prefixion);if (enIndex > 0)

subject= prefixion.Substring(0, enIndex);

截取含有Subject的内容,去掉Subject后 便是邮件主题,然后主题转码。在主题正文中找出编码方式,如果是b,表示的是base64位。

for (int i = 0; i < arrs.Length; i++)

{if (!string.IsNullOrEmpty(arrs[i]))

{

arrs[i]=arrs[i].Trim();int n =arrs[i].Length;char first = arrs[i][0];if (arrs[i][0] == '=')

arrs[i]= arrs[i].Remove(0, 1);if (arrs[i].EndsWith("?= ="))

arrs[i]= arrs[i].Replace("?= =", "");if (arrs[i].EndsWith("?"))

arrs[i]= arrs[i].Replace("?", "");int lenght =arrs[i].Length;if (codeState.ToLower() == "b")

Text+= Encoding.GetEncoding(encoding).GetString(Convert.FromBase64String(arrs[i])) + " ";//"S09TRemrmOS4neWmjeeameS/nea5v+eyvuWNjua2sjE1bWw="));//Subject)); }

}

接下来 取得邮件正文,正文内容含两种编码格式,BASE64位和Q位。常用的是BASE64. 解析时将字符转码

解析时Content 时 如果流文件含base64,即表示该正文是按base64转码的,我们解码就行。

Regex.Replace(strContent, "charset=.*Content-transfer-encoding.*", new MatchEvaluator(p =>{if(p.Success)

{var charsetPrefix = p.Value.Remove(0, p.Value.IndexOf("charset=") + 8);var charsetEncoding = string.Empty;if (charsetPrefix.StartsWith("GB2312", StringComparison.OrdinalIgnoreCase))

charsetEncoding= "GB2312";else if (charsetPrefix.StartsWith("utf-8", StringComparison.OrdinalIgnoreCase))

charsetEncoding= "utf-8";var transferContext = p.Value.Remove(0, p.Value.IndexOf("Content-transfer-encoding") + 26).Trim();int transferEndIndex =EndIndex(transferContext);var transfered =transferContext;if (transferEndIndex > 0)

{

transfered= transferContext.Substring(0, transferEndIndex);

}if (transfered.StartsWith("base64", StringComparison.OrdinalIgnoreCase))

{var baseStr = Regex.Split(transfered.Substring(6), "--"); //suLK1NK7z8I=--0__=C7BBF079DF9E146E8f9e8a93df938690918cC7BBF079DF9E146E

foreach (var item inbaseStr)

{try{

Context+=Encoding.GetEncoding(charsetEncoding).GetString(Convert.FromBase64String(item));

}catch{continue;

}

}

}

}return null;

}));

c# 收取邮件 解析_c# 使用NetStream接收 解析邮件相关推荐

  1. c# 收取邮件 解析_c#收取邮件

    东西写的不太清楚  可以显示邮件正文  标题  发件人,及邮件数,删除邮件! 含有DecodeBase64和quoted-printable  解码 using System.Net.Sockets; ...

  2. 在线查询解析邮件接收的邮件

    在线查询解析邮件接收的邮件 依赖 <dependency><groupId>javax.activation</groupId><artifactId> ...

  3. pop3通过时间或者条件取邮件_Python 进阶(三):邮件的发送与收取

    1. 发送邮件 SMTP 全称 Simple Mail Transfer Protocol,中文译为简单邮件传输协议,它能跨越网络传输邮件,可实现相同网络处理进程之间的邮件传输,也可通过中继器或网关实 ...

  4. 邮件访问协议!IMAP协议解析

    今天我们又来讲讲邮件协议,如果您曾经设置过电子邮件帐户,则可能会询问您要使用哪种电子邮件协议(POP或IMAP),对于POP,我们在这篇文章上有讲解<pop3协议解析及代码实现>.当我们所 ...

  5. Linux利用Esmtp 选择邮件服务器发送邮件(解决手机接收乱码)

    因公司业务需求,需要定时发送一些业务邮件.使用Linux 自带的mail 命令 发送邮件 ,能正常发送但是领导们都用手机收取邮件,很崩溃 他们接收到的邮件乱码.不得不想办法解决此问题. 就在googl ...

  6. java邮件接收_Java邮件发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  7. 不能上美国邮箱服务器地址,我的邮箱不能接收国外的邮件,国内的可以接收,请解决!...

    我的邮箱不能接收国外的邮件,国内的可以接收,请解决! 您好: 如果能收国内的,不能收国外的邮件,有可能是该封邮件被判定为垃圾邮件,所以拒收了.这种情况下对方会收到我司服务器发出的拒收原 因,如:用其它 ...

  8. 作业三_C#中的观察者模式解析

    作业三_C#中的观察者模式解析 一.观察者模式的理解分析 由于之前没有接触过观察者模式,所以找了一段源码编译运行调试一下.下面是观察者模式用C#模拟实现的示意源码.该段代码模拟了观察者模式的一个运行原 ...

  9. php 转发邮件,PHP Email();我不接收转发的电子邮件

    尽管这个答案有一部分只适用于 mail() 函数本身,其中许多故障排除步骤可以应用于任何PHP邮件系统. 确保已启用错误报告并设置为报告所有错误 错误报告对于消除代码中的错误和PHP遇到的一般错误是必 ...

最新文章

  1. 详解XMind各种上传分享分类
  2. Stella 知识库--解析论坛的架构(1)
  3. GitHub官方开源新命令行工具
  4. 关于C++14:你需要知道的新特性
  5. cannot和can not的区别 666666
  6. nyoj473 A^B Problem (高速幂)
  7. Oracle数据库分页的三种方法
  8. alxc tool 报错数组超出了界限_代码审计之报错信息泄露与字符串截断
  9. python3 虚拟环境 pip 版本_【python知识】 - Python3之PIPENV虚拟环境及封装
  10. 因为某种原因阻止文本引擎初始化_网络营销外包——网络营销外包专员如何做好网站锚文本优化?...
  11. python cut函数_一天学会Python Web框架(七)工具函数
  12. 康奈尔大学计算机科学人工智能,美国康奈尔大学工程学院申请之计算机科学
  13. 【IT】QTTabBar使用
  14. 关于ORACLE (AMERICAN_AMERICA.US7ASCII)字符集
  15. python3下载m3u8转mp4_Python3.6:根据m3u8下载mp4视频
  16. table 点击文字按钮预览图片
  17. java防止文件上传_文件上传漏洞:getshell的最好方式,我们如何防御?
  18. 密码学Kerberos协议理解
  19. Ubuntu20.4下打开WPS提示缺失字体“Symbol、Wingdings、Wingdings 2...“的解决办法
  20. java-线程安全问题,线程实现线程同步,线程状态,等待唤醒机制,生产者消费者模型

热门文章

  1. 银行刷卡支付与第三方支付区别
  2. 安卓手机充电慢_安卓手机充电提示音怎么改 Android设置换充电提示音教程
  3. 第三方软件提权之FTP软件
  4. Spring框架学习教程,详解Spring注入bean的几种方式
  5. Druid连接池连接MySQL数据库
  6. 输入摄氏度温度值,转化为华氏温度值并输出
  7. 钢铁侠观后感暨机器学习畅想
  8. 全网最好用的在线生成CSS渐变色工具
  9. 骑手外卖流程需求分析
  10. 如何运行python