zoukankan      html  css  js  c++  java
  • .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<KeyValuePair<string, string>>();
                                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<string, string>(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; } }); } }
  • 相关阅读:
    CodeForce VKcup A
    CNN卷积神经网络
    神经网络
    我的机器学习之路
    [OPENCV] 第一个程序 识别颜色
    Android 登录界面与首页的设计
    go web的基本原理
    Go语言标准库之http/template
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
    数据库恢复技术
  • 原文地址:https://www.cnblogs.com/sands/p/8655985.html
Copyright © 2011-2022 走看看