.net 获取邮箱邮件列表和内容
需求:
最近项目里遇到了个问题,对方没有提供直接获取数据源的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 获取邮箱邮件列表和内容的更多相关文章
- C#程序模拟登录批量获取各种邮件内容信息
一般来说,如果现实中你有这样一种需求“假如你是褥羊毛的羊毛党,你某日发现了一个app有一个活动,通过邮箱注册账号激活可以领5元红包,而恰恰你手上又有一批邮箱可用,那么批量获取邮箱中的激活链接去激活则是 ...
- php iamp 接收邮件,收取邮件,获取邮件列表
每次想写的时候吧,提笔忘字.等到再次使用,又得想半天,,,,,好尴尬. 这次一边做一边写. 心得,程序员从菜鸟往老鸟转变的重要一步,学英语,看文档,在此我万分感谢鸟哥,,,,没他php哪有官方的中文注 ...
- spring boot:发送带附件的邮件和html内容的邮件(以163.com邮箱为例/spring boot 2.3.2)
一,网站哪些情况下需要发送电子邮件? 作为一个电商网站,以下情况需要发邮件通知用户: 注册成功的信息 用邮箱接收验证码 找回密码时发链接 发送推广邮件 下单成功后的订单通知 给商户的对账单邮件 说明: ...
- 腾讯企业邮箱又一次隐藏了qq邮件列表的入口
今天登陆腾讯企业邮箱,发现腾讯企业邮箱又一次隐藏了qq邮件列表的入口,很不方便操作, 我们切换到工具箱选项,然后随便点击里面的一个工具,比如:企业网盘,然后看浏览器地址栏的地址如下:http://ex ...
- MFC_VC++_时间获取与保存列表控件内容到文件操作方法
MFC_VC++_时间获取与保存列表控件内容到excel文件操作方法 void CDataView::OnBnClickedBtnExporttoexcel() { CTime time = CTim ...
- linux 内核邮件列表
第一节 - 一般性问题 1. 为什么有些时候使用“GNU/Linux"而另一些时候使用“Linux”? 答:在这个FAQ中,我们尝试使用“linux”或者“linux kernel”来表示内 ...
- 第五篇 - Selenium突破反爬获取qq邮件标题
from selenium import webdriver from selenium.webdriver import ActionChains #1.打开登陆页面 wd = webdriver. ...
- javaMail邮件接收解析内容及附件 及删除邮件
参考自: http://blog.csdn.net/xyang81/article/details/7675160 package com.szy.project.utils; import jav ...
- [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作
这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...
随机推荐
- 安全测试===sqlmap(壹)转载
六.优化 这些参数可以优化Sqlmap的性能. 1.一键优化 参数:-o 添加此参数相当于同时添加下列三个优化参数: --keep-alive --null-connection --threads= ...
- linux make命令安装详解
对于GNU Make或许很多Windows开发的程序员并不是很了解,因为Windows中的很多集成开发环境(IDE)都帮我们做了这件事.但是作为一个专业从事 Linux嵌入式开发的程序员就必须要了解G ...
- linux常用命令:date 命令
在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...
- javashop组件开发指南
javashop组件开发指南 1. 概念解释 组件:可以理解为是插件,功能点的一个集合. 插件:是指具体的某个功能. 插件桩:是负责调用插件. 事件:是要决定什么时候执行插件 一个组件是由多 ...
- 删除对象的属性 delete的用法
Javascript的变量 实际上JavaScript中,变量 = 对象属性,这是因为 Javascript 在执行脚本之前会创建一个Global对象,所有的全局变量都是这个Global对象的属性,执 ...
- SpringBoot之RESTFul风格的接口调用(jQuery-Ajax)
一.Get $.ajax({ type: "get", url: "url地址", async: true, dataType:"json" ...
- git必备命令
git status 查看git的状态git add <path>的形式把我们<path>添加到索引库中,<path>可以是文件也可以是目录.git add -u ...
- $.post 和 $.get 设置同步和异步请求
由于$.post() 和 $.get() 默认是 异步请求,如果需要同步请求,则可以进行如下使用:在$.post()前把ajax设置为同步:$.ajaxSettings.async = false;在 ...
- noip2016普及组题解和心得
前言 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. (其实这篇博客只有题 ...
- luoguP2574 XOR的艺术
思路 01串的区间求和,区间翻转 lazy%2==0 则不用翻转,lazt%2==1则要翻转 模板题 代码 #include <iostream> #include <vector& ...