76

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

4

8 回答 8

74

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

于 2008-09-04T18:24:34.477 回答
16

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

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

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

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

回到最初的问题。

以下代码取自我们的 POP3 教程页面和链接,将对您有所帮助:

// 
// 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();
于 2008-09-19T14:13:06.253 回答
8

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

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

请参阅文件 POP3Main.cs、POP3Client.cs 和 insert_bug.aspx

于 2008-09-23T01:39:33.117 回答
5

你也可以试试Mail.dll 邮件组件,它有 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上下载它

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

于 2009-03-21T16:40:23.467 回答
4

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

于 2008-09-19T14:23:17.243 回答
4

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

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

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

于 2009-08-06T19:52:27.483 回答
4

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]获得它

于 2012-07-19T02:28:26.907 回答
2

我刚刚尝试了 SMTPop,它起作用了。

  1. 我下载了这个
  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();
        }
    }
}
于 2012-10-30T18:12:38.590 回答