【问题标题】:Reading Email using Pop3 in C# [closed]在 C# 中使用 Pop3 读取电子邮件 [关闭]
【发布时间】:2010-09-07 20:19:21
【问题描述】:

我正在寻找一种在 C# 2.0 中使用 Pop3 阅读电子邮件的方法。目前,我正在使用CodeProject 中的代码。然而,这种解决方案并不理想。最大的问题是它不支持用 unicode 编写的电子邮件。

【问题讨论】:

    标签: c# unicode pop3


    【解决方案1】:

    我已成功使用OpenPop.NET 通过 POP3 访问电子邮件。

    【讨论】:

    【解决方案2】:

    通过 POP3 协议下载电子邮件是任务的简单部分。该协议非常简单,如果您不想通过网络发送明文密码(并且不能使用 SSL 加密通信通道),唯一困难的部分可能是高级身份验证方法。详情请参阅RFC 1939: Post Office Protocol - Version 3 RFC 1734: POP3 AUTHentication command

    当您必须解析收到的电子邮件时,困难的部分来了,这意味着在大多数情况下解析 MIME 格式。您可以在几个小时或几天内编写快速而肮脏的 MIME 解析器,它将处理 95+% 的所有传入消息。改进解析器,使其几乎可以解析任何电子邮件意味着:

    • 获取从最流行的邮件客户端发送的电子邮件样本并改进解析器以修复错误和由它们产生的 RFC 误解。
    • 确保邮件标头和内容违反 RFC 的邮件不会使您的解析器崩溃,并且您将能够从损坏的电子邮件中读取每个可读或可猜测的值
    • 正确处理国际化问题(例如,从右到左书写的语言、特定语言的正确编码等)
    • UNICODE
    • "Mime torture email sample" 中看到的附件和分层消息项树
    • S/MIME(签名和加密的电子邮件)。
    • 等等

    调试强大的 MIME 解析器需要几个月的时间。我知道,因为我正在看着我的朋友为下面提到的组件编写一个这样的解析器,并且也在为它编写一些单元测试;-)

    回到原来的问题。

    关注code taken from our POP3 Tutorial page 和链接将对您有所帮助:

    // 
    // create client, connect and log in 
    Pop3 client = new Pop3();
    client.Connect("pop3.example.org");
    client.Login("username", "password");
    
    // get message list 
    Pop3MessageCollection list = client.GetMessageList();
    
    if (list.Count == 0)
    {
        Console.WriteLine("There are no messages in the mailbox.");
    }
    else 
    {
        // download the first message 
        MailMessage message = client.GetMailMessage(list[0].SequenceNumber);
        ...
    }
    
    client.Disconnect();
    

    【讨论】:

    • 基本上你是在说“买我的组件”,对吧?没有错,这听起来像是一个很好的组件。
    • 您可以尝试任何第三方组件(免费或商业)。我的帖子试图指出编写这样的组件既困难又耗时,因为需要进行广泛的测试——如果没有来自大量真实用户的数据的大量错误报告,你几乎无法做到这一点。如果您选择 Rebex 组件会很好,但如果您选择另一个,我没有问题。恕我直言,编写自己的 MIME 解析器或使用 Web 上的一些概念验证代码在这种情况下不是最好的方法。但我可能有偏见;-),得出你自己的结论并先测试代码。
    • 我可以使用 Rebex 组件从 Exchange 2003 收件箱中获取邮件吗??
    • 作者关于解析 MIME 有多么困难的讨论被他的商业利益所玷污,即没有人尝试它。
    • @ThunderGr:关于解码器的要点。我想这取决于什么更有效。如果编写自己的解码器更容易,那就去吧。如果您的主要任务是完成另一件事并且解码某些内容只是我尝试使用现成解决方案的一部分。归根结底,它通常是关于平衡是否更容易驯服具有许多内置最佳实践的第三方库(并处理其他人代码中的问题)或从头开始编写它(并处理以下事实)你可能不知道问题的全部程度)。
    【解决方案3】:

    我的开源应用程序BugTracker.NET 包含一个可以解析 MIME 的 POP3 客户端。 POP3 代码和 MIME 代码都来自其他作者,但您可以在我的应用中看到它们是如何组合在一起的。

    对于 MIME 解析,我使用 http://anmar.eu.org/projects/sharpmimetools/

    查看文件 POP3Main.cs、POP3Client.cs 和 insert_bug.aspx

    【讨论】:

      【解决方案4】:

      你也可以试试Mail.dll mail component,它支持 SSL、unicode 和跨国邮箱:

      using(Pop3 pop3 = new Pop3())
      {
          pop3.Connect("mail.host.com");           // Connect to server and login
          pop3.Login("user", "password");
      
          foreach(string uid in pop3.GetAll())
          {
              IMail email = new MailBuilder()
                  .CreateFromEml(pop3.GetMessageByUID(uid));
                Console.WriteLine( email.Subject );
          }
          pop3.Close(false);      
      }
      

      你可以在这里下载它https://www.limilabs.com/mail

      请注意,这是我创建的商业产品。

      【讨论】:

      • 我可以用它来访问收件箱 Exchange 2003 吗?
      • 是的,你可以。您只需要启用 IMAP 或 POP3 协议。
      【解决方案5】:

      称我为老式但为什么要使用 3rd 方库来实现简单的协议。我已经在基于 Web 的 ASP.NET 应用程序中使用 System.Net.Sockets.TCPClient 和 System.Net.Security.SslStream 实现了 POP3 阅读器,用于加密和身份验证。就协议而言,一旦您打开与 POP3 服务器的通信,您只需处理少量命令。这是一个非常容易使用的协议。

      【讨论】:

        【解决方案6】:

        我不会推荐 OpenPOP。我只花了几个小时调试一个问题——OpenPOP 的 POPClient.GetMessage() 神秘地返回 null。我对此进行了调试,发现这是一个字符串索引错误 - 请参阅我在此处提交的补丁:http://sourceforge.net/tracker/?func=detail&aid=2833334&group_id=92166&atid=599778。由于存在吞噬异常的空 catch{} 块,因此很难找到原因。

        此外,该项目大多处于休眠状态...最后一次发布是在 2004 年。

        目前我们仍在使用 OpenPOP,但我会看看人们在这里推荐的其他一些项目。

        【讨论】:

        • 有什么推荐给你的??谢谢
        • 嗨。我超越了 OpenPop.NET 项目并将其带入了更实用的状态。这些尝试捕获已被删除,库现在更加稳定。我认为这个帖子条目不再有效。
        【解决方案7】:

        HigLabo.Mail 易于使用。这是一个示例用法:

        using (Pop3Client cl = new Pop3Client()) 
        { 
            cl.UserName = "MyUserName"; 
            cl.Password = "MyPassword"; 
            cl.ServerName = "MyServer"; 
            cl.AuthenticateMode = Pop3AuthenticateMode.Pop; 
            cl.Ssl = false; 
            cl.Authenticate(); 
            ///Get first mail of my mailbox 
            Pop3Message mg = cl.GetMessage(1); 
            String MyText = mg.BodyText; 
            ///If the message have one attachment 
            Pop3Content ct = mg.Contents[0];         
            ///you can save it to local disk 
            ct.DecodeData("your file path"); 
        } 
        

        您可以从https://github.com/higty/higlabo 或 Nuget [HigLabo] 获得它

        【讨论】:

          【解决方案8】:

          我刚刚尝试了 SMTPop,它成功了。

          1. 我下载了this
          2. 添加了smtpop.dll 对我的 C# .NET 项目的引用

          写了如下代码:

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;    
          using SmtPop;
          
          namespace SMT_POP3 {
          
              class Program {
                  static void Main(string[] args) {
                      SmtPop.POP3Client pop = new SmtPop.POP3Client();
                      pop.Open("<hostURL>", 110, "<username>", "<password>");
          
                      // Get message list from POP server
                      SmtPop.POPMessageId[] messages = pop.GetMailList();
                      if (messages != null) {
          
                          // Walk attachment list
                          foreach(SmtPop.POPMessageId id in messages) {
                              SmtPop.POPReader reader= pop.GetMailReader(id);
                              SmtPop.MimeMessage msg = new SmtPop.MimeMessage();
          
                              // Read message
                              msg.Read(reader);
                              if (msg.AddressFrom != null) {
                                  String from= msg.AddressFrom[0].Name;
                                  Console.WriteLine("from: " + from);
                              }
                              if (msg.Subject != null) {
                                  String subject = msg.Subject;
                                  Console.WriteLine("subject: "+ subject);
                              }
                              if (msg.Body != null) {
                                  String body = msg.Body;
                                  Console.WriteLine("body: " + body);
                              }
                              if (msg.Attachments != null && false) {
                                  // Do something with first attachment
                                  SmtPop.MimeAttachment attach = msg.Attachments[0];
          
                                  if (attach.Filename == "data") {
                                     // Read data from attachment
                                     Byte[] b = Convert.FromBase64String(attach.Body);
                                     System.IO.MemoryStream mem = new System.IO.MemoryStream(b, false);
          
                                     //BinaryFormatter f = new BinaryFormatter();
                                     // DataClass data= (DataClass)f.Deserialize(mem); 
                                     mem.Close();
                                  }                     
          
                                  // Delete message
                                  // pop.Dele(id.Id);
                              }
                         }
                     }    
                     pop.Quit();
                  }
              }
          }
          

          【讨论】:

          • 我已经尝试过您的代码,但没有电子邮件正文 - 除正文外,所有详细信息都正常出现???有什么想法吗?????
          猜你喜欢
          • 1970-01-01
          • 2015-12-09
          • 2011-08-22
          • 1970-01-01
          • 2018-06-21
          • 2013-11-17
          • 2017-03-02
          • 2013-12-19
          相关资源
          最近更新 更多