.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; } }); } }

 

转载于:https://www.cnblogs.com/sands/p/8655985.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在VB.NET中,我们可以使用System.Net.Mail命名空间中的类来收邮件。具体步骤如下: 1. 引入命名空间: `Imports System.Net.Mail` 2. 创建一个SmtpClient对象,并配置SMTP服务器信息: ``` Dim client As New SmtpClient() client.Host = "邮件服务器地址" client.Port = 587 '邮件服务器端口号 client.EnableSsl = True '是否使用SSL加密连接 client.Credentials = New System.Net.NetworkCredential("用户名", "密码") '登录邮箱的用户名和密码 ``` 3. 创建一个MailMessage对象,并设置发件人、收件人、主题和正文: ``` Dim message As New MailMessage() message.From = New MailAddress("发件人邮箱地址") message.To.Add("收件人邮箱地址") message.Subject = "邮件主题" message.Body = "邮件正文" ``` 4. 发送邮件: ``` client.Send(message) ``` 通过以上步骤,我们就可以使用VB.NET来发送邮件了。 值得注意的是,在使用SmtpClient发送邮件之前,需要确保SMTP服务器的相关设置已经正确配置,包括邮件服务器地址、端口号、SSL加密等,同时还需要提供登录邮箱的用户名和密码用于身份验证。另外,具体的邮件内容设置和处理还可以根据实际需求进行进一步的定制和优化。 ### 回答2: 在VB.NET中,我们可以使用System.Net.Mail和System.Net命名空间中的类来收邮件。 首先,我们需要创建一个SmtpClient对象来连接到邮件服务器。需要提供邮件服务器的地址和端口号以及用户凭证(例如用户名和密码)。然后,使用SmtpClient的方法连接到服务器。 接下来,我们可以使用Pop3Client类来接收邮件。与SmtpClient类类似,我们需要提供服务器的地址和端口号以及用户凭证。然后,使用Pop3Client类的方法连接到服务器。 一旦连接成功,我们可以使用Pop3Client类的方法获取邮件的总数。然后,我们可以使用Pop3Client类的方法按照索引号获取每封邮件。将每封邮件保存为MailMessage对象,我们可以使用MailMessage对象的属性来获取邮件的信息,例如发件人、收件人、主题和正文。 最后,我们可以使用Pop3Client类的方法删除已读邮件或将其标记为已读。 需要注意的是,邮件服务器可能会有不同的配置要求。因此,具体的实现细节可能会因使用的邮件服务器而有所不同。在实际应用中,我们还需要处理错误、异常以及安全性等问题。 综上所述,在VB.NET中收邮件的过程可以简单总结为:连接到邮件服务器、获取邮件的总数、按照索引号获取每封邮件获取其信息、删除或标记已读邮件。 ### 回答3: 在VB.NET中,我们可以使用System.Net命名空间中的POP3或IMAP类来收邮件。 对于POP3协议,我们可以使用System.Net.POP3命名空间中的POP3类来实现收邮件的功能。首先,我们需要建立一个POP3Client对象,并指定邮件服务器的主机名和端口号。然后,使用POP3Client对象的User方法和Pass方法来指定邮件服务器的用户名和密码。接下来,我们可以使用POP3Client对象的GetEmailCount方法获取邮件的数量,使用GetEmailSize方法获取特定邮件的大小,使用GetEmailHeader方法获取特定邮件的头部信息,使用GetEmailBody方法获取特定邮件内容。最后,可以使用POP3Client对象的DeleteEmail方法来删除特定的邮件。 对于IMAP协议,我们可以使用System.Net.IMAP命名空间中的IMAPClient类来实现收邮件的功能。与POP3类似,我们首先需要建立一个IMAPClient对象,并指定邮件服务器的主机名和端口号。然后,使用IMAPClient对象的User方法和Pass方法来指定邮件服务器的用户名和密码。接下来,我们可以使用IMAPClient对象的GetMailbox方法获取邮箱的信息,使用GetMessageCount方法获取邮件的数量,使用GetHeader方法获取特定邮件的头部信息,使用GetBodyText方法获取特定邮件的文本内容,使用GetBodyHTML方法获取特定邮件的HTML内容。最后,可以使用IMAPClient对象的DeleteMessage方法来删除特定的邮件。 无论使用POP3还是IMAP协议,我们都需要处理一些异常情况,例如无法连接到邮件服务器、用户名或密码错误等。因此,在实现收邮件的功能时,还需要使用try-catch语句来捕获可能出现的异常,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值