需求:

  最近项目里遇到了个问题,对方没有提供直接获取数据源的api接口,而是通过邮件发数据的。这就需要接收邮件后解析邮件内容获得数据。

  分析:

  想在代码里实时获取邮件,可以通过邮件的几个协议来实现,常用的几个协议有POP3协议,SMTP协议,IAMP协议。

  1. pop3:(Post Office Protocal 3),3是版本,是目前使用的主流版本。POP3是客户-服务器协议,其中电子邮件的接收需要一个收件服务器,邮件下载到本地计算机上所有一次,从而使离线阅读更轻松,可以指定是否保留副本的邮件在服务器上。

  2. SMTP(Simple Mail Transfer Protocal):简单Mail传输协议,是个请求/响应协议,它监听25号端口,用于接收用户的Mail请求,并与远端Mail服务器建立SMTP连接。 独立于特定的传输子系统,它可以是电子邮件从客户机传输到服务器;也可以是从某一个服务器传输到另一个服务器;且只需要可靠有序的数据流信道支持。SMTP 重要特性之一是其能跨越网络传输邮件,即SMTP 邮件中继。通常,一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP 传输层协议组成。使用 SMTP,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。

  3. IMAP ( Internet消息访问协议)是一种标准协议,用于访问电子邮件从您的本地服务器。的IMAP (最新版本的IMAP第4版)是一个客户机/服务器协议在电子邮件收到并为您举行的由您的因特网服务器。您(或您的电子邮件客户端)可以查看刚才的标题和发件人的信件,然后决定是否下载该邮件。您还可以创建和操纵多个文件夹或邮箱的服务器上,删除邮件,或寻找某些地区或整个说明。

  imap协议可以实现获取邮件状态,并且操作服务器上的邮件,而POP3不能,

  程序设计思路是:

  1 从邮件服务器上获取未读邮件,

  2 进行解析操作,

  3 标记邮件为已读。

  4 将邮件数据推送到消息队列中

  5 部署多个消息队列的消费者组件,对邮件内容进行二次处理,进行业务逻辑处理。

  邮件接收的组件其实在前三步就已经结束了。 业务处理的服务可以部署多个,但是接收邮件的组件相当于一个客户端,只作为邮件的接收和转发数据,这里部署了一个,属于单点的,鉴于服务暂时没多少压力,先只做了异常报警通知,没有去部署多个。

  实现:

  .net下有现成的开源组件LumiSoft.Net.IMAP

  开源组件下载地址 http://www.lumisoft.ee/lswww/download/downloads/

  整理后的主要代码 public void imapdemo()

  {

  var mailServer = "imap.exmail.qq.com";//也可以使用其他邮箱服务器

  var username = "登录账号";

  var password = "登录密码";

  using (IMAP_Client client = new IMAP_Client())

  {

  client.Connect(mailServer, 993, true);

  client.Login(username, password);

  client.SelectFolder("INBOX");//打开收件箱

  int[] unseen_ids = client.Search(false, Encoding.UTF8, new IMAP_Search_Key_Unseen());

  if (unseen_ids.Count() == 0)

  {

  return;

  }

  IMAP_t_SeqSet sequence = IMAP_t_SeqSet.Parse(string.Join(",", unseen_ids));

  var items = new IMAP_t_Fetch_i[] { new IMAP_t_Fetch_i_Envelope(), new IMAP_t_Fetch_i_Uid(), new IMAP_t_Fetch_i_Flags(), new IMAP_t_Fetch_i_Flags(), new IMAP_t_Fetch_i_InternalDate(), new IMAP_t_Fetch_i_Rfc822(), new IMAP_t_Fetch_i_BodyStructure() };

  client.Fetch(false, sequence, items, (s, e) =>

  {

  try

  {

  var email = e.Value as IMAP_r_u_Fetch;

  if (email.Rfc822 != null)

  {

  email.Rfc822.Stream.Position = 0;

  var mine = Mail_Message.ParseFromStream(email.Rfc822.Stream);

  email.Rfc822.Stream.Close();

  var files = mine.Attachments;

  var fileurls = new List>();

  foreach (var item in files)

  {

  var name = item.ContentType.Param_Name;

  using (MemoryStream stream = new MemoryStream(item.DataToByte()))

  {

  //附件可以上传到阿里云上或者其他地方

  var key = "";// AliOss.Upload(stream);

  fileurls.Add(new KeyValuePair(name, key));//文件名,地址

  }

  }

  //处理自定义业务逻辑

  var Title = email.Envelope.Subject;

  var CreateTime = email.InternalDate.Date;

  var BodyText = mine.BodyText;

  var BodyHtmlText = mine.BodyHtmlText;

  var File = string.Join(",", fileurls.Select(x => x.Value));

  //处理完的邮件标记为已读

  var sequenceSet = new IMAP_SequenceSet();

  sequenceSet.Parse(string.Join(",", email.SeqNo));

  client.StoreMessageFlags(false, sequenceSet, IMAP_Flags_SetType.Add, IMAP_MessageFlags.Seen);

  //-------邮件内容入消息队列------------

  }

  }

  catch (Exception ex)

  {

  throw ex;

  }

  });

  }

  }

  复制代码

  (编辑:雷林鹏 来源:网络)

.net 获取邮箱邮件列表和内容的更多相关文章

  1. C#程序模拟登录批量获取各种邮件内容信息

    一般来说,如果现实中你有这样一种需求“假如你是褥羊毛的羊毛党,你某日发现了一个app有一个活动,通过邮箱注册账号激活可以领5元红包,而恰恰你手上又有一批邮箱可用,那么批量获取邮箱中的激活链接去激活则是 ...

  2. php iamp 接收邮件,收取邮件,获取邮件列表

    每次想写的时候吧,提笔忘字.等到再次使用,又得想半天,,,,,好尴尬. 这次一边做一边写. 心得,程序员从菜鸟往老鸟转变的重要一步,学英语,看文档,在此我万分感谢鸟哥,,,,没他php哪有官方的中文注 ...

  3. spring boot:发送带附件的邮件和html内容的邮件(以163.com邮箱为例/spring boot 2.3.2)

    一,网站哪些情况下需要发送电子邮件? 作为一个电商网站,以下情况需要发邮件通知用户: 注册成功的信息 用邮箱接收验证码 找回密码时发链接 发送推广邮件 下单成功后的订单通知 给商户的对账单邮件 说明: ...

  4. 腾讯企业邮箱又一次隐藏了qq邮件列表的入口

    今天登陆腾讯企业邮箱,发现腾讯企业邮箱又一次隐藏了qq邮件列表的入口,很不方便操作, 我们切换到工具箱选项,然后随便点击里面的一个工具,比如:企业网盘,然后看浏览器地址栏的地址如下:http://ex ...

  5. MFC_VC++_时间获取与保存列表控件内容到文件操作方法

    MFC_VC++_时间获取与保存列表控件内容到excel文件操作方法 void CDataView::OnBnClickedBtnExporttoexcel() { CTime time = CTim ...

  6. linux 内核邮件列表

    第一节 - 一般性问题 1. 为什么有些时候使用“GNU/Linux"而另一些时候使用“Linux”? 答:在这个FAQ中,我们尝试使用“linux”或者“linux kernel”来表示内 ...

  7. 第五篇 - Selenium突破反爬获取qq邮件标题

    from selenium import webdriver from selenium.webdriver import ActionChains #1.打开登陆页面 wd = webdriver. ...

  8. javaMail邮件接收解析内容及附件 及删除邮件

    参考自:  http://blog.csdn.net/xyang81/article/details/7675160 package com.szy.project.utils; import jav ...

  9. [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作

    这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...

随机推荐

  1. UBUNTU16.04 使用APT-GET如何设置代理

    sudo apt-get   install software-name -o Acquire::http::proxy="http://用户名:密码@代理服务器IP:代理服务器端口&quo ...

  2. Python: 正则表达式匹配反斜杠 "\"

    Python正则表达式匹配反斜杠 "\" eg: >>>a='w\w\w' 'w\\w\\w' #  打印出来的 "\\" 被转义成 一个反斜 ...

  3. FastJson(阿里巴巴)基础

    一.所需jar包: fastjson-x.x.xx.jar(本例使用fastjson-1.1.36.jar). 二.解析转化: 1.json字符串  < ------ >  js trin ...

  4. linux服务器---squid限制

    Squid连接限制 Squid可以有效的限制连接,指定哪些用户可以连接,指定哪些网站可以访问,这样就可以有效的利用服务器带宽. 1.限制指定网段不能连接.编辑配置文件”/etc/squid/squid ...

  5. Java随机获取32位密码且必须包含大小写字母、数字和特殊字符,四种的任意三种

    Java随机获取32位密码且必须包含大小写字母.数字和特殊字符,四种的任意三种 Java随机获取32位密码且必须包含大小写字母.数字和特殊字符,四种的任意三种,代码如下: import java.ut ...

  6. xShell终端中文乱码完全解决方法

    xShell终端中文乱码完全解决方法 xShell(xShell5)以及其他终端中文乱码的原因无非有三种:(1)Linux系统的编码问题:(2)xShell终端的编码问题: (3)两端的语言编码不一致 ...

  7. 20145127《java程序设计》第五周学习总结

    教材学习内容总结 第八章 异常处理 1.try catch java中所有错误会被打包成对象,可以进行尝试捕捉代表错误的对象进行处理. Import java.until.Scanner; Publi ...

  8. Code First技术介绍

    地址:https://wenku.baidu.com/view/5620b862eefdc8d376ee3258.html 仅供参考

  9. Python3基础 getatime getctime getmtime 文件的最近访问 + 属性修改 + 内容修改时间

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. [BZOJ4244]邮戳拉力赛

    Description IOI铁路是由N+2个站点构成的直线线路.这条线路的车站从某一端的车站开始顺次标号为0...N+1. 这条路线上行驶的电车分为上行电车和下行电车两种,上行电车沿编号增大方向行驶 ...